Skip to content

Commit

Permalink
Release 4.5.23
Browse files Browse the repository at this point in the history
  • Loading branch information
陈玉国 authored and 陈玉国 committed Nov 20, 2023
1 parent e4a79ff commit f316700
Show file tree
Hide file tree
Showing 16 changed files with 252 additions and 44 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.5.22"
s.version = "4.5.23"
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
8 changes: 8 additions & 0 deletions SensorsAnalyticsSDK.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -515,6 +515,8 @@
F28997D8273B6D66005E7D5E /* SAGesturePlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = F28997D6273B6D66005E7D5E /* SAGesturePlugin.m */; };
F296FF042935A3DF00C40C48 /* NSObject+SAToString.h in Headers */ = {isa = PBXBuildFile; fileRef = F296FF022935A3DF00C40C48 /* NSObject+SAToString.h */; };
F296FF052935A3DF00C40C48 /* NSObject+SAToString.m in Sources */ = {isa = PBXBuildFile; fileRef = F296FF032935A3DF00C40C48 /* NSObject+SAToString.m */; };
F2A3F7632AE64FA80089809C /* SAAppInteractTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = F2A3F7612AE64FA80089809C /* SAAppInteractTracker.h */; };
F2A3F7642AE64FA80089809C /* SAAppInteractTracker.m in Sources */ = {isa = PBXBuildFile; fileRef = F2A3F7622AE64FA80089809C /* SAAppInteractTracker.m */; };
F2B643F62832302F00544BD2 /* SensorsAnalyticsSDK+SAAppExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = F2B643F42832302F00544BD2 /* SensorsAnalyticsSDK+SAAppExtension.h */; settings = {ATTRIBUTES = (Public, ); }; };
F2B643F72832302F00544BD2 /* SensorsAnalyticsSDK+SAAppExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = F2B643F52832302F00544BD2 /* SensorsAnalyticsSDK+SAAppExtension.m */; };
F2C877B828A65849002BDA2C /* SAExposureData+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = F2C877B628A65849002BDA2C /* SAExposureData+Private.h */; };
Expand Down Expand Up @@ -1111,6 +1113,8 @@
F28997D6273B6D66005E7D5E /* SAGesturePlugin.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SAGesturePlugin.m; sourceTree = "<group>"; };
F296FF022935A3DF00C40C48 /* NSObject+SAToString.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSObject+SAToString.h"; sourceTree = "<group>"; };
F296FF032935A3DF00C40C48 /* NSObject+SAToString.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSObject+SAToString.m"; sourceTree = "<group>"; };
F2A3F7612AE64FA80089809C /* SAAppInteractTracker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SAAppInteractTracker.h; sourceTree = "<group>"; };
F2A3F7622AE64FA80089809C /* SAAppInteractTracker.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SAAppInteractTracker.m; sourceTree = "<group>"; };
F2B643F42832302F00544BD2 /* SensorsAnalyticsSDK+SAAppExtension.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SensorsAnalyticsSDK+SAAppExtension.h"; sourceTree = "<group>"; };
F2B643F52832302F00544BD2 /* SensorsAnalyticsSDK+SAAppExtension.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "SensorsAnalyticsSDK+SAAppExtension.m"; sourceTree = "<group>"; };
F2C877B628A65849002BDA2C /* SAExposureData+Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SAExposureData+Private.h"; sourceTree = "<group>"; };
Expand Down Expand Up @@ -2061,6 +2065,8 @@
F214620E2A8CE2A90021C27D /* SAAdvertisingConfig.h */,
F214620F2A8CE2A90021C27D /* SAAdvertisingConfig.m */,
F2727AE82A8DC17F00166C6A /* SAAdvertisingConfig+Private.h */,
F2A3F7612AE64FA80089809C /* SAAppInteractTracker.h */,
F2A3F7622AE64FA80089809C /* SAAppInteractTracker.m */,
);
path = Deeplink;
sourceTree = "<group>";
Expand Down Expand Up @@ -2482,6 +2488,7 @@
F27EA3D627393B4B00896B3A /* SACellClickDynamicSubclassPlugin.h in Headers */,
4DD1296A25F8E451008C0B1E /* SAViewNode.h in Headers */,
A8356DC52656459A00FD64AA /* SAAppTracker.h in Headers */,
F2A3F7632AE64FA80089809C /* SAAppInteractTracker.h in Headers */,
88847F4A27605D3F007321E4 /* SABaseStoreManager.h in Headers */,
883BAAB02669CD18008105D2 /* SAExceptionManager.h in Headers */,
45BD80CE26F0B49700DCC759 /* SAThreadSafeDictionary.h in Headers */,
Expand Down Expand Up @@ -2918,6 +2925,7 @@
8809806C27FEE78900EB2B3D /* SAEncryptInterceptor.m in Sources */,
4DD1285C25F872A4008C0B1E /* SAObjectSerializerConfig.m in Sources */,
F21C226828F7B0E500847823 /* NSDictionary+SACopyProperties.m in Sources */,
F2A3F7642AE64FA80089809C /* SAAppInteractTracker.m in Sources */,
4D1B925F2817F2F3007C31D5 /* SAReferrerTitlePropertyPlugin.m in Sources */,
A8CC22332685E50C00E96A03 /* SARemoteConfigEventObject.m in Sources */,
8809805827FDA85E00EB2B3D /* SARemoteConfigInterceptor.m in Sources */,
Expand Down
22 changes: 5 additions & 17 deletions SensorsAnalyticsSDK/ChannelMatch/SAChannelMatchManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -38,15 +38,14 @@
#import "SAProfileEventObject.h"
#import "SAPropertyPluginManager.h"
#import "SAChannelInfoPropertyPlugin.h"
#import "SACommonUtility.h"

NSString * const kSAChannelDebugFlagKey = @"com.sensorsdata.channeldebug.flag";
NSString * const kSAChannelDebugInstallEventName = @"$ChannelDebugInstall";
NSString * const kSAEventPropertyChannelDeviceInfo = @"$channel_device_info";
NSString * const kSAEventPropertyUserAgent = @"$user_agent";
NSString * const kSAEventPropertyChannelCallbackEvent = @"$is_channel_callback_event";

static NSString * const kSAHasTrackInstallation = @"HasTrackInstallation";
static NSString * const kSAHasTrackInstallationDisableCallback = @"HasTrackInstallationWithDisableCallback";

@interface SAChannelMatchManager ()

Expand Down Expand Up @@ -193,7 +192,7 @@ - (NSDictionary *)eventProperties:(NSDictionary *)properties disableCallback:(BO
result[kSAEventPropertyUserAgent] = [self simulateUserAgent];
}

result[kSAEventPropertyInstallSource] = [self appInstallSource];
result[kSAEventPropertyInstallSource] = [SACommonUtility appInstallSource];

return result;
}
Expand All @@ -208,7 +207,7 @@ - (NSDictionary *)profileProperties:(NSDictionary *)properties {
result[kSAEventPropertyUserAgent] = [self simulateUserAgent];
}

result[kSAEventPropertyInstallSource] = [self appInstallSource];
result[kSAEventPropertyInstallSource] = [SACommonUtility appInstallSource];

// 用户属性中不需要添加 $ios_install_disable_callback,这里主动移除掉
// (也会移除自定义属性中的 $ios_install_disable_callback, 和原有逻辑保持一致)
Expand All @@ -219,17 +218,6 @@ - (NSDictionary *)profileProperties:(NSDictionary *)properties {
return result;
}

- (NSString *)appInstallSource {
NSMutableDictionary *sources = [NSMutableDictionary dictionary];
sources[@"idfa"] = [SAIdentifier idfa];
sources[@"idfv"] = [SAIdentifier idfv];
NSMutableArray *result = [NSMutableArray array];
for (NSString *key in sources.allKeys) {
[result addObject:[NSString stringWithFormat:@"%@=%@", key, sources[key]]];
}
return [result componentsJoinedByString:@"##"];
}

#pragma mark - 附加渠道信息
- (void)trackChannelWithEventObject:(SABaseEventObject *)obj properties:(nullable NSDictionary *)propertyDict {
if (self.configOptions.enableAutoAddChannelCallbackEvent) {
Expand Down Expand Up @@ -327,7 +315,7 @@ - (void)showRelinkAlertWithURL:(NSURL *)url {
// 重连二维码对应的设备信息
NSMutableSet *deviceIdSet = [NSMutableSet setWithArray:[deviceId componentsSeparatedByString:@"##"]];
// 当前设备的设备信息
NSSet *installSourceSet = [NSSet setWithArray:[[self appInstallSource] componentsSeparatedByString:@"##"]];
NSSet *installSourceSet = [NSSet setWithArray:[[SACommonUtility appInstallSource] componentsSeparatedByString:@"##"]];
[deviceIdSet intersectSet:installSourceSet];
// 取交集,当交集不为空时,表示设备一致
if (deviceIdSet.count > 0) {
Expand Down Expand Up @@ -373,7 +361,7 @@ - (void)uploadUserInfoIntoWhiteList:(NSDictionary *)qureyItems {
NSMutableDictionary *params = [NSMutableDictionary dictionaryWithDictionary:qureyItems];
params[@"distinct_id"] = [[SensorsAnalyticsSDK sharedInstance] distinctId];
params[@"has_active"] = @([self isAppInstalled]);
params[@"device_code"] = [self appInstallSource];
params[@"device_code"] = [SACommonUtility appInstallSource];
request.HTTPBody = [SAJSONUtil dataWithJSONObject:params];

[self showIndicator];
Expand Down
9 changes: 9 additions & 0 deletions SensorsAnalyticsSDK/Core/SAConstants+Private.h
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@ extern NSNotificationName const SA_TRACK_LOGOUT_NOTIFICATION;
extern NSNotificationName const SA_TRACK_IDENTIFY_NOTIFICATION;
extern NSNotificationName const SA_TRACK_RESETANONYMOUSID_NOTIFICATION;
extern NSNotificationName const SA_TRACK_EVENT_H5_NOTIFICATION;
extern NSNotificationName const SA_TRACK_Set_Server_URL_NOTIFICATION;

#pragma mark - ABTest related notifications
/// 注入打通 bridge
Expand Down Expand Up @@ -198,3 +199,11 @@ extern NSString * const kRandomTimeKey;
extern NSString * const kStartDeviceTimeKey;
extern NSString * const kSARemoteConfigSupportTransportEncryptKey;
extern NSString * const kSARemoteConfigConfigsKey;

//SAT Remarketing
extern NSString * const kSAAppInteractEventTimeIntervalKey;
extern NSString * const kSAAppInteractEventName;
extern NSString * const kSAHasTrackInstallation;
extern NSString * const kSAHasTrackInstallationDisableCallback;
extern NSString * const kSAEventPropertyHasInstalledApp;
extern NSString * const kSAEventPropertyAwakeFromDeeplink;
9 changes: 9 additions & 0 deletions SensorsAnalyticsSDK/Core/SAConstants.m
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,7 @@ void sensorsdata_dispatch_safe_sync(dispatch_queue_t queue,DISPATCH_NOESCAPE dis
NSNotificationName const SA_TRACK_IDENTIFY_NOTIFICATION = @"SensorsAnalyticsTrackIdentifyNotification";
NSNotificationName const SA_TRACK_RESETANONYMOUSID_NOTIFICATION = @"SensorsAnalyticsTrackResetAnonymousIdNotification";
NSNotificationName const SA_TRACK_EVENT_H5_NOTIFICATION = @"SensorsAnalyticsTrackEventFromH5Notification";
NSNotificationName const SA_TRACK_Set_Server_URL_NOTIFICATION = @"SensorsAnalyticsSetServerUrlNotification";

#pragma mark - ABTest related notifications
NSNotificationName const SA_H5_BRIDGE_NOTIFICATION = @"SensorsAnalyticsRegisterJavaScriptBridgeNotification";
Expand Down Expand Up @@ -223,3 +224,11 @@ void sensorsdata_dispatch_safe_sync(dispatch_queue_t queue,DISPATCH_NOESCAPE dis
NSString * const kStartDeviceTimeKey = @"startDeviceTime";
NSString * const kSARemoteConfigSupportTransportEncryptKey = @"supportTransportEncrypt";
NSString * const kSARemoteConfigConfigsKey = @"configs";

//SAT Remarketing
NSString * const kSAAppInteractEventTimeIntervalKey = @"appInteract_timestamp";
NSString * const kSAAppInteractEventName = @"$AppInteract";
NSString * const kSAHasTrackInstallation = @"HasTrackInstallation";
NSString * const kSAHasTrackInstallationDisableCallback = @"HasTrackInstallationWithDisableCallback";
NSString * const kSAEventPropertyHasInstalledApp = @"$sat_has_installed_app";
NSString * const kSAEventPropertyAwakeFromDeeplink = @"$sat_awake_from_deeplink";
6 changes: 4 additions & 2 deletions SensorsAnalyticsSDK/Core/SensorsAnalyticsSDK.m
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@
#import "SALimitKeyManager.h"
#import "NSDictionary+SACopyProperties.h"

#define VERSION @"4.5.22"
#define VERSION @"4.5.23"

void *SensorsAnalyticsQueueTag = &SensorsAnalyticsQueueTag;

Expand Down Expand Up @@ -404,6 +404,7 @@ - (void)setServerUrl:(NSString *)serverUrl {
// macOS 暂不支持远程控制,即不支持 setServerUrl: isRequestRemoteConfig: 接口
dispatch_async(self.serialQueue, ^{
self.configOptions.serverURL = serverUrl;
[[NSNotificationCenter defaultCenter] postNotificationName:SA_TRACK_Set_Server_URL_NOTIFICATION object:nil];
});
#else
[self setServerUrl:serverUrl isRequestRemoteConfig:NO];
Expand All @@ -423,7 +424,8 @@ - (void)setServerUrl:(NSString *)serverUrl isRequestRemoteConfig:(BOOL)isRequest
dispatch_async(self.serialQueue, ^{
if (![self.configOptions.serverURL isEqualToString:serverUrl]) {
self.configOptions.serverURL = serverUrl;

[[NSNotificationCenter defaultCenter] postNotificationName:SA_TRACK_Set_Server_URL_NOTIFICATION object:nil];

// 更新数据接收地址
[SAModuleManager.sharedInstance updateServerURL:serverUrl];
}
Expand Down
5 changes: 4 additions & 1 deletion SensorsAnalyticsSDK/Core/Utils/SACommonUtility.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,5 +37,8 @@
/// 计算 hash
+ (NSString *)hashStringWithData:(NSData *)data;


#if TARGET_OS_IOS
/// $ios_install_source
+ (NSString *)appInstallSource;
#endif
@end
13 changes: 13 additions & 0 deletions SensorsAnalyticsSDK/Core/Utils/SACommonUtility.m
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@

#import "SACommonUtility.h"
#import "SAValidator.h"
#import "SAIdentifier.h"
#import <CommonCrypto/CommonDigest.h>

@implementation SACommonUtility
Expand Down Expand Up @@ -88,4 +89,16 @@ + (NSString *)hashStringWithData:(NSData *)data {
return [hashNumber stringValue];
}

#if TARGET_OS_IOS
+ (NSString *)appInstallSource {
NSMutableDictionary *sources = [NSMutableDictionary dictionary];
sources[@"idfa"] = [SAIdentifier idfa];
sources[@"idfv"] = [SAIdentifier idfv];
NSMutableArray *result = [NSMutableArray array];
for (NSString *key in sources.allKeys) {
[result addObject:[NSString stringWithFormat:@"%@=%@", key, sources[key]]];
}
return [result componentsJoinedByString:@"##"];
}
#endif
@end
8 changes: 6 additions & 2 deletions SensorsAnalyticsSDK/Deeplink/SAAdvertisingConfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,14 @@ NS_ASSUME_NONNULL_BEGIN

@interface SAAdvertisingConfig : NSObject <NSCopying>

- (instancetype)init NS_UNAVAILABLE;

- (instancetype)initWithServerUrl:(NSString *)serverUrl events:(NSArray<NSString *>*)events secretKey:(nullable SASecretKey *)key;

/// enable remarketing or not, default is NO
@property (nonatomic, assign) BOOL enableRemarketing;

/// url that wakeup app, pass the url to SDK in case that you delay init SDK
@property (nonatomic, copy) NSString *wakeupUrl;

@end

NS_ASSUME_NONNULL_END
2 changes: 2 additions & 0 deletions SensorsAnalyticsSDK/Deeplink/SAAdvertisingConfig.m
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ - (nonnull id)copyWithZone:(nullable NSZone *)zone {
config.adsServerUrl = self.adsServerUrl;
config.adsEvents = self.adsEvents;
config.adsSecretKey = self.adsSecretKey;
config.enableRemarketing = self.enableRemarketing;
config.wakeupUrl = self.wakeupUrl;
return config;
}

Expand Down
32 changes: 32 additions & 0 deletions SensorsAnalyticsSDK/Deeplink/SAAppInteractTracker.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
//
// SAAppInteractTracker.h
// SensorsAnalyticsSDK
//
// Created by 陈玉国 on 2023/10/23.
// Copyright © 2015-2023 Sensors Data Co., Ltd. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface SAAppInteractTracker : NSObject

@property (nonatomic, assign) BOOL awakeFromDeeplink;
@property (nonatomic, copy) NSString *wakeupUrl;

@end

NS_ASSUME_NONNULL_END
106 changes: 106 additions & 0 deletions SensorsAnalyticsSDK/Deeplink/SAAppInteractTracker.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
//
// SAAppInteractTracker.m
// SensorsAnalyticsSDK
//
// Created by 陈玉国 on 2023/10/23.
// Copyright © 2015-2023 Sensors Data Co., Ltd. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

#if ! __has_feature(objc_arc)
#error This file must be compiled with ARC. Either turn on ARC for the project or use -fobjc-arc flag on this file.
#endif

#import "SAAppInteractTracker.h"
#import "SAAppLifecycle.h"
#import "SAConstants+Private.h"
#import "SensorsAnalyticsSDK.h"
#import "SAStoreManager.h"
#import "SALog.h"
#import "SAIdentifier.h"
#import "SACommonUtility.h"

@interface SAAppInteractTracker ()

@property (nonatomic, assign) BOOL hasInstalledApp;

@end

@implementation SAAppInteractTracker

- (instancetype)init {
if (self = [super init]) {
[self addListener];
_hasInstalledApp = [self isAppInstalled];
}
return self;
}

- (void)addListener {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appLifecycleStateDidChange:) name:kSAAppLifecycleStateDidChangeNotification object:nil];
}

- (void)removeListener {
[[NSNotificationCenter defaultCenter] removeObserver:self name:kSAAppLifecycleStateDidChangeNotification object:nil];
}

- (void)appLifecycleStateDidChange:(NSNotification *)sender {
SAAppLifecycleState newState = [sender.userInfo[kSAAppLifecycleNewStateKey] integerValue];
SAAppLifecycleState oldState = [sender.userInfo[kSAAppLifecycleOldStateKey] integerValue];
if (!self.awakeFromDeeplink && oldState == SAAppLifecycleStateInit && newState == SAAppLifecycleStateStart) {
self.awakeFromDeeplink = self.awakeFromDeeplink ?: self.wakeupUrl ? YES : NO;
}
if (newState == SAAppLifecycleStateStart) {
[self trackAppInteract];
self.awakeFromDeeplink = NO;
self.hasInstalledApp = [self isAppInstalled];
}
}

- (BOOL)shouldTrackAppInteract {
NSTimeInterval lastAppInteractTimeInterval = [[SAStoreManager sharedInstance] doubleForKey:kSAAppInteractEventTimeIntervalKey];
NSTimeInterval nowTimeInterval = [[NSDate date] timeIntervalSince1970];
if (lastAppInteractTimeInterval >= nowTimeInterval) {
SALogError(@"Incorrect timeInterval for last AppInteract event");
return NO;
}
if (lastAppInteractTimeInterval == 0) {
return YES;
}
NSDate *lastAppInteractDate = [NSDate dateWithTimeIntervalSince1970:lastAppInteractTimeInterval];
BOOL inToday = [[NSCalendar currentCalendar] isDateInToday:lastAppInteractDate];
return !inToday;
}

- (void)trackAppInteract {
if (![self shouldTrackAppInteract]) {
return;
}
BOOL hasInstalledApp = self.hasInstalledApp;
BOOL awakeFromDeeplink = self.awakeFromDeeplink;
[[SensorsAnalyticsSDK sharedInstance] track:kSAAppInteractEventName withProperties:@{kSAEventPropertyHasInstalledApp: @(hasInstalledApp), kSAEventPropertyAwakeFromDeeplink: @(awakeFromDeeplink), kSAEventPropertyInstallSource: [SACommonUtility appInstallSource]}];
NSTimeInterval timestamp = [[NSDate date] timeIntervalSince1970];
[[SAStoreManager sharedInstance] setDouble:timestamp forKey:kSAAppInteractEventTimeIntervalKey];
}

- (BOOL)isAppInstalled {
SAStoreManager *manager = [SAStoreManager sharedInstance];
return [manager boolForKey:kSAHasTrackInstallationDisableCallback] || [manager boolForKey:kSAHasTrackInstallation];
}

- (void)dealloc {
[self removeListener];
}

@end
3 changes: 0 additions & 3 deletions SensorsAnalyticsSDK/Deeplink/SADeepLinkProcessor.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,9 +70,6 @@ typedef BOOL(^SADeepLinkCompletion)(SADeepLinkObject *object);
/// 获取最后一次的渠道归因参数
- (NSDictionary *)acquireLatestChannels:(NSDictionary *)dictionary;

/// 设备信息
- (NSString *)appInstallSource;

@end

@interface SADeepLinkProcessorFactory : NSObject
Expand Down
Loading

0 comments on commit f316700

Please sign in to comment.