Skip to content

Commit

Permalink
Release 4.6.1
Browse files Browse the repository at this point in the history
  • Loading branch information
yaoyue committed Jan 23, 2024
1 parent 18909c4 commit 1ee8e5a
Show file tree
Hide file tree
Showing 34 changed files with 153 additions and 66 deletions.
2 changes: 1 addition & 1 deletion SensorsAnalyticsSDK.podspec
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Pod::Spec.new do |s|
s.name = "SensorsAnalyticsSDK"
s.version = "4.6.0"
s.version = "4.6.1"
s.summary = "The official iOS SDK of Sensors Analytics."
s.homepage = "http://www.sensorsdata.cn"
s.source = { :git => 'https://github.com/sensorsdata/sa-sdk-ios.git', :tag => "v#{s.version}" }
Expand Down
4 changes: 4 additions & 0 deletions SensorsAnalyticsSDK.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -523,6 +523,7 @@
F2CD8A7A28A2410A00A186B8 /* SAExposureConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = F2CD8A7828A2410A00A186B8 /* SAExposureConfig.h */; settings = {ATTRIBUTES = (Public, ); }; };
F2CD8A7B28A2410A00A186B8 /* SAExposureConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = F2CD8A7928A2410A00A186B8 /* SAExposureConfig.m */; };
F2CFD14726EB04A8007A9253 /* SAConfigOptions+RemoteConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = F2CFD14526EB04A8007A9253 /* SAConfigOptions+RemoteConfig.h */; settings = {ATTRIBUTES = (Public, ); }; };
F2D769D42B4D4C6F00F127B2 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = F2D769D32B4D4C6F00F127B2 /* PrivacyInfo.xcprivacy */; };
F2E36483287682E6008D9151 /* SADeviceWhiteList.h in Headers */ = {isa = PBXBuildFile; fileRef = F2E36481287682E6008D9151 /* SADeviceWhiteList.h */; };
F2E36484287682E6008D9151 /* SADeviceWhiteList.m in Sources */ = {isa = PBXBuildFile; fileRef = F2E36482287682E6008D9151 /* SADeviceWhiteList.m */; };
F2E364872876EE94008D9151 /* SASlinkCreator.h in Headers */ = {isa = PBXBuildFile; fileRef = F2E364852876EE94008D9151 /* SASlinkCreator.h */; settings = {ATTRIBUTES = (Public, ); }; };
Expand Down Expand Up @@ -1121,6 +1122,7 @@
F2CD8A7828A2410A00A186B8 /* SAExposureConfig.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SAExposureConfig.h; sourceTree = "<group>"; };
F2CD8A7928A2410A00A186B8 /* SAExposureConfig.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SAExposureConfig.m; sourceTree = "<group>"; };
F2CFD14526EB04A8007A9253 /* SAConfigOptions+RemoteConfig.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SAConfigOptions+RemoteConfig.h"; sourceTree = "<group>"; };
F2D769D32B4D4C6F00F127B2 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
F2E36481287682E6008D9151 /* SADeviceWhiteList.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SADeviceWhiteList.h; sourceTree = "<group>"; };
F2E36482287682E6008D9151 /* SADeviceWhiteList.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SADeviceWhiteList.m; sourceTree = "<group>"; };
F2E364852876EE94008D9151 /* SASlinkCreator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SASlinkCreator.h; sourceTree = "<group>"; };
Expand Down Expand Up @@ -1593,6 +1595,7 @@
881A40F4253D7B4F00854F69 /* SensorsAnalyticsSDK+Private.h */,
45A565BB263C17E400C9C41B /* SAAppLifecycle.h */,
45A565BA263C17E400C9C41B /* SAAppLifecycle.m */,
F2D769D32B4D4C6F00F127B2 /* PrivacyInfo.xcprivacy */,
);
path = Core;
sourceTree = "<group>";
Expand Down Expand Up @@ -2689,6 +2692,7 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
F2D769D42B4D4C6F00F127B2 /* PrivacyInfo.xcprivacy in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down
4 changes: 2 additions & 2 deletions SensorsAnalyticsSDK/AppPush/SAAppPushManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -53,13 +53,13 @@ - (void)setEnable:(BOOL)enable {
}
}

- (void)setConfigOptions:(SAConfigOptions *)configOptions {
- (void)setConfigOptions:(SAConfigOptions *)configOptions NS_EXTENSION_UNAVAILABLE("AppPush not supported for iOS extensions.") {
_configOptions = configOptions;
[UIApplication sharedApplication].sensorsdata_launchOptions = configOptions.launchOptions;
self.enable = configOptions.enableTrackPush;
}

- (void)proxyNotifications {
- (void)proxyNotifications NS_EXTENSION_UNAVAILABLE("AppPush not supported for iOS extensions.") {
//处理未实现代理方法也能采集事件的逻辑
[SAMethodHelper swizzleRespondsToSelector];

Expand Down
2 changes: 1 addition & 1 deletion SensorsAnalyticsSDK/AppPush/SAConfigOptions+AppPush.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ NS_ASSUME_NONNULL_BEGIN
@interface SAConfigOptions (AppPush)

///开启自动采集通知
@property (nonatomic, assign) BOOL enableTrackPush API_UNAVAILABLE(macos);
@property (nonatomic, assign) BOOL enableTrackPush API_UNAVAILABLE(macos) NS_EXTENSION_UNAVAILABLE("AppPush not supported for iOS extensions.");

@end

Expand Down
8 changes: 4 additions & 4 deletions SensorsAnalyticsSDK/AutoTrack/SAAutoTrackManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ - (void)remoteConfigModelChanged:(NSNotification *)sender {

#pragma mark - Public

- (BOOL)isAutoTrackEnabled {
- (BOOL)isAutoTrackEnabled NS_EXTENSION_UNAVAILABLE("AutoTrack not supported for iOS extensions.") {
if (self.isDisableSDK) {
SALogDebug(@"SDK is disabled");
return NO;
Expand All @@ -219,7 +219,7 @@ - (BOOL)isAutoTrackEnabled {
}
}

- (BOOL)isAutoTrackEventTypeIgnored:(SensorsAnalyticsAutoTrackEventType)eventType {
- (BOOL)isAutoTrackEventTypeIgnored:(SensorsAnalyticsAutoTrackEventType)eventType NS_EXTENSION_UNAVAILABLE("AutoTrack not supported for iOS extensions.") {
if (self.isDisableSDK) {
SALogDebug(@"SDK is disabled");
return YES;
Expand Down Expand Up @@ -316,15 +316,15 @@ - (void)enableAppClickAutoTrack {
}
}

- (void)enableAppPageLeave {
- (void)enableAppPageLeave NS_EXTENSION_UNAVAILABLE("TrackPageLeave not supported for iOS extensions.") {
if (!self.configOptions.enableTrackPageLeave) {
return;
}
[UIViewController sa_swizzleMethod:@selector(viewDidAppear:) withMethod:@selector(sensorsdata_pageLeave_viewDidAppear:) error:NULL];
[UIViewController sa_swizzleMethod:@selector(viewDidDisappear:) withMethod:@selector(sensorsdata_pageLeave_viewDidDisappear:) error:NULL];
}

- (void)registerPlugins {
- (void)registerPlugins NS_EXTENSION_UNAVAILABLE("AutoTrack not supported for iOS extensions.") {
BOOL enableAppClick = self.configOptions.autoTrackEventType & SensorsAnalyticsEventTypeAppClick;
if (!enableAppClick) {
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ NS_ASSUME_NONNULL_BEGIN
*
* @param aClass View 对应的 Class
*/
- (void)ignoreViewType:(Class)aClass NS_EXTENSION_UNAVAILABLE("AutoTrack not supported for iOS extensions.");
- (void)ignoreViewType:(Class)aClass;

/**
* @abstract
Expand All @@ -95,7 +95,7 @@ NS_ASSUME_NONNULL_BEGIN
*
* @param controllers controller ‘字符串’数组
*/
- (void)ignoreAutoTrackViewControllers:(NSArray<NSString *> *)controllers NS_EXTENSION_UNAVAILABLE("AutoTrack not supported for iOS extensions.");
- (void)ignoreAutoTrackViewControllers:(NSArray<NSString *> *)controllers;

/**
* @abstract
Expand Down Expand Up @@ -163,7 +163,7 @@ NS_ASSUME_NONNULL_BEGIN
@interface SAConfigOptions (AutoTrack)

///开启自动采集页面浏览时长
@property (nonatomic, assign) BOOL enableTrackPageLeave API_UNAVAILABLE(macos);
@property (nonatomic, assign) BOOL enableTrackPageLeave API_UNAVAILABLE(macos) NS_EXTENSION_UNAVAILABLE("TrackPageLeave not supported for iOS extensions.");


/// 是否开启子页面的页面浏览时长
Expand All @@ -190,7 +190,7 @@ NS_ASSUME_NONNULL_BEGIN
* https://sensorsdata.cn/manual/ios_sdk.html
* 该功能默认关闭
*/
@property (nonatomic) SensorsAnalyticsAutoTrackEventType autoTrackEventType API_UNAVAILABLE(macos);
@property (nonatomic) SensorsAnalyticsAutoTrackEventType autoTrackEventType API_UNAVAILABLE(macos) NS_EXTENSION_UNAVAILABLE("AutoTrack not supported for iOS extensions.");

@end

Expand Down
4 changes: 2 additions & 2 deletions SensorsAnalyticsSDK/ChannelMatch/SAChannelMatchManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ - (NSDictionary *)profileProperties:(NSDictionary *)properties {
}

#pragma mark - 附加渠道信息
- (void)trackChannelWithEventObject:(SABaseEventObject *)obj properties:(nullable NSDictionary *)propertyDict {
- (void)trackChannelWithEventObject:(SABaseEventObject *)obj properties:(nullable NSDictionary *)propertyDict NS_EXTENSION_UNAVAILABLE("DeepLink not supported for iOS extensions.") {
if (self.configOptions.enableAutoAddChannelCallbackEvent) {
return [SensorsAnalyticsSDK.sharedInstance trackEventObject:obj properties:propertyDict];
}
Expand Down Expand Up @@ -255,7 +255,7 @@ - (void)archiveTrackChannelEventNames {
[[SAStoreManager sharedInstance] setObject:copyEventNames forKey:kSAEventPropertyChannelDeviceInfo];
}

- (NSDictionary *)channelInfoWithEvent:(NSString *)event {
- (NSDictionary *)channelInfoWithEvent:(NSString *)event NS_EXTENSION_UNAVAILABLE("DeepLink not supported for iOS extensions.") {
if (self.configOptions.enableAutoAddChannelCallbackEvent) {
NSMutableDictionary *channelInfo = [NSMutableDictionary dictionaryWithDictionary:[self channelPropertiesWithEvent:event]];
channelInfo[kSAEventPropertyChannelDeviceInfo] = @"1";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,15 @@ NS_ASSUME_NONNULL_BEGIN
@param event event 的名称
*/
- (void)trackChannelEvent:(NSString *)event NS_EXTENSION_UNAVAILABLE("ChannelMatch not supported for iOS extensions.");
- (void)trackChannelEvent:(NSString *)event;

/**
调用 track 接口并附加渠道信息
@param event event 的名称
@param propertyDict event 的属性
*/
- (void)trackChannelEvent:(NSString *)event properties:(nullable NSDictionary *)propertyDict NS_EXTENSION_UNAVAILABLE("ChannelMatch not supported for iOS extensions.");
- (void)trackChannelEvent:(NSString *)event properties:(nullable NSDictionary *)propertyDict;

/**
* @abstract
Expand All @@ -46,7 +46,7 @@ NS_ASSUME_NONNULL_BEGIN
* @discussion
* 注意:如果之前使用 - trackInstallation: 触发的激活事件,需要继续保持原来的调用,无需改成 - trackAppInstall: ,否则会导致激活事件数据分离。
*/
- (void)trackAppInstall NS_EXTENSION_UNAVAILABLE("ChannelMatch not supported for iOS extensions.");
- (void)trackAppInstall;

/**
* @abstract
Expand All @@ -57,7 +57,7 @@ NS_ASSUME_NONNULL_BEGIN
*
* @param properties 激活事件的属性
*/
- (void)trackAppInstallWithProperties:(nullable NSDictionary *)properties NS_EXTENSION_UNAVAILABLE("ChannelMatch not supported for iOS extensions.");
- (void)trackAppInstallWithProperties:(nullable NSDictionary *)properties;

/**
* @abstract
Expand All @@ -69,7 +69,7 @@ NS_ASSUME_NONNULL_BEGIN
* @param properties 激活事件的属性
* @param disableCallback 是否关闭这次渠道匹配的回调请求
*/
- (void)trackAppInstallWithProperties:(nullable NSDictionary *)properties disableCallback:(BOOL)disableCallback NS_EXTENSION_UNAVAILABLE("ChannelMatch not supported for iOS extensions.");
- (void)trackAppInstallWithProperties:(nullable NSDictionary *)properties disableCallback:(BOOL)disableCallback;

/**
* @abstract
Expand All @@ -81,7 +81,7 @@ NS_ASSUME_NONNULL_BEGIN
*
* @param event event 的名称
*/
- (void)trackInstallation:(NSString *)event NS_EXTENSION_UNAVAILABLE("ChannelMatch not supported for iOS extensions.");
- (void)trackInstallation:(NSString *)event;

/**
* @abstract
Expand All @@ -98,7 +98,7 @@ NS_ASSUME_NONNULL_BEGIN
* @param event event 的名称
* @param propertyDict event 的属性
*/
- (void)trackInstallation:(NSString *)event withProperties:(nullable NSDictionary *)propertyDict NS_EXTENSION_UNAVAILABLE("ChannelMatch not supported for iOS extensions.");
- (void)trackInstallation:(NSString *)event withProperties:(nullable NSDictionary *)propertyDict;

/**
* @abstract
Expand All @@ -116,14 +116,14 @@ NS_ASSUME_NONNULL_BEGIN
* @param propertyDict event 的属性
* @param disableCallback 是否关闭这次渠道匹配的回调请求
*/
- (void)trackInstallation:(NSString *)event withProperties:(nullable NSDictionary *)propertyDict disableCallback:(BOOL)disableCallback NS_EXTENSION_UNAVAILABLE("ChannelMatch not supported for iOS extensions.");
- (void)trackInstallation:(NSString *)event withProperties:(nullable NSDictionary *)propertyDict disableCallback:(BOOL)disableCallback;

@end

@interface SAConfigOptions (ChannelMatch)

/// 是否在手动埋点事件中自动添加渠道匹配信息
@property (nonatomic, assign) BOOL enableAutoAddChannelCallbackEvent API_UNAVAILABLE(macos);
@property (nonatomic, assign) BOOL enableAutoAddChannelCallbackEvent API_UNAVAILABLE(macos) NS_EXTENSION_UNAVAILABLE("ChannelMatch not supported for iOS extensions.");

@end

Expand Down
80 changes: 80 additions & 0 deletions SensorsAnalyticsSDK/Core/PrivacyInfo.xcprivacy
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyCollectedDataTypes</key>
<array>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeDeviceID</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<true/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAnalytics</string>
</array>
</dict>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeCoarseLocation</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<true/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAnalytics</string>
</array>
</dict>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeCrashData</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<true/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAnalytics</string>
</array>
</dict>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeOtherDiagnosticData</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<true/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAnalytics</string>
</array>
</dict>
</array>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategorySystemBootTime</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>35F9.1</string>
</array>
</dict>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
</dict>
</array>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyTracking</key>
<false/>
</dict>
</plist>
2 changes: 1 addition & 1 deletion SensorsAnalyticsSDK/Core/SensorsAnalyticsSDK.m
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@
#import <UIKit/UIApplication.h>
#endif

#define VERSION @"4.6.0"
#define VERSION @"4.6.1"

void *SensorsAnalyticsQueueTag = &SensorsAnalyticsQueueTag;

Expand Down
4 changes: 2 additions & 2 deletions SensorsAnalyticsSDK/Deeplink/SADeeplinkManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ - (void)disableDeferredDeepLink {
[[SAStoreManager sharedInstance] setInteger:SADeferredDeepLinkStatusDisable forKey:kSADeferredDeepLinkStatus];
}

- (void)setConfigOptions:(SAConfigOptions *)configOptions {
- (void)setConfigOptions:(SAConfigOptions *)configOptions NS_EXTENSION_UNAVAILABLE("DeepLink not supported for iOS extensions.") {
if ([SAApplication isAppExtension]) {
configOptions.enableDeepLink = NO;
}
Expand Down Expand Up @@ -201,7 +201,7 @@ - (void)unarchiveLatestChannels:(BOOL)enableSave {
}

/// 开启本地保存 DeepLinkInfo 开关时,每次 DeepLink 唤起解析后都需要更新本地文件中数据
- (void)archiveLatestChannels:(NSDictionary *)dictionary {
- (void)archiveLatestChannels:(NSDictionary *)dictionary NS_EXTENSION_UNAVAILABLE("DeepLink not supported for iOS extensions.") {
if (!_configOptions.enableSaveDeepLinkInfo) {
return;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ DeepLink 回调函数
@interface SAConfigOptions (DeepLink)

/// DeepLink 中解析出来的参数是否需要保存到本地
@property (nonatomic, assign) BOOL enableSaveDeepLinkInfo API_UNAVAILABLE(macos);
@property (nonatomic, assign) BOOL enableSaveDeepLinkInfo API_UNAVAILABLE(macos) NS_EXTENSION_UNAVAILABLE("DeepLink not supported for iOS extensions.");

/// DeepLink 中用户自定义来源渠道属性 key 值,可传多个。
@property (nonatomic, copy) NSArray<NSString *> *sourceChannels API_UNAVAILABLE(macos);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ NS_ASSUME_NONNULL_BEGIN

@interface SAConfigOptions (DeviceOrientation)

@property (nonatomic, assign) BOOL enableDeviceOrientation;
@property (nonatomic, assign) BOOL enableDeviceOrientation NS_EXTENSION_UNAVAILABLE("DeviceOrientation not supported for iOS extensions.");

@end

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ - (void)setEnable:(BOOL)enable {
}
}

- (void)setConfigOptions:(SAConfigOptions *)configOptions {
- (void)setConfigOptions:(SAConfigOptions *)configOptions NS_EXTENSION_UNAVAILABLE("DeviceOrientation not supported for iOS extensions.") {
_configOptions = configOptions;
self.enable = configOptions.enableDeviceOrientation;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ NS_ASSUME_NONNULL_BEGIN
*
* @param enable YES/NO
*/
- (void)enableTrackScreenOrientation:(BOOL)enable API_UNAVAILABLE(macos);
- (void)enableTrackScreenOrientation:(BOOL)enable API_UNAVAILABLE(macos) NS_EXTENSION_UNAVAILABLE("DeviceOrientation not supported for iOS extensions.");

@end

Expand Down
4 changes: 2 additions & 2 deletions SensorsAnalyticsSDK/Encrypt/SAConfigOptions+Encrypt.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@ NS_ASSUME_NONNULL_BEGIN
@interface SAConfigOptions (Encrypt)

/// 是否开启埋点数据入库加密
@property (nonatomic, assign) BOOL enableEncrypt API_UNAVAILABLE(macos);
@property (nonatomic, assign) BOOL enableEncrypt API_UNAVAILABLE(macos) NS_EXTENSION_UNAVAILABLE("Encrypt not supported for iOS extensions.");

/// 是否开启埋点数据上报传输加密
@property (nonatomic, assign) BOOL enableTransportEncrypt API_UNAVAILABLE(macos);
@property (nonatomic, assign) BOOL enableTransportEncrypt API_UNAVAILABLE(macos) NS_EXTENSION_UNAVAILABLE("Encrypt not supported for iOS extensions.");

/// 注册埋点加密插件
- (void)registerEncryptor:(id<SAEncryptProtocol>)encryptor API_UNAVAILABLE(macos);
Expand Down
Loading

0 comments on commit 1ee8e5a

Please sign in to comment.