Curio 是 Turkcell 的移动分析系统,这将是 Curio 的客户端 iOS 库。为 iOS 6.0+ 和 tvOS 9+ 开发的应用程序可以很容易地使用这个库使用 Curio 移动分析。
删除了弃用的方法,ios 部署目标升级到 7.0
从本版本开始,CurioSDK 发送的客户端版本将引用 CFBundleShortVersionString。
更新 Readme。
添加了用户标记。
添加了 tvOS 支持。
添加了 send endEvent 功能。您可以使用此方法发送事件的持续时间。
您可以拖放 Curio 项目文件到您的项目中。另外,您还应该添加依赖项。
您应该点击 Targets -> 您的应用名称 -> 然后 'Build Phases' 选项卡。
展开 'Link Binary With Library' 并点击加号以添加所需的框架,如果它们不可用。
- Foundation.framework
- UIKit.framework
- CoreTelephony.framework
- libsqlite3.dylib
- CoreLocation.framework
- CoreBluetooth.framework
如果您不想运行自动单元测试,则应从编译中移除 CurioSDKTests.m、CurioSettingsTest.m 和 CurioDBTests.m 文件,方法是点击 Targets -> 您的应用名称 -> 然后 'Build Phases' 选项卡,展开 'Compile Sources' 并在选中这些源文件时点击减号。
重要提示:使用 CurioSDK 行在 Info.plist 中启动会话已被弃用。请使用与 Info.plist 中使用的相同参数实现以下方法。
您可以通过调用startSession函数来启动客户端会话,并指定CurioSDK参数,如下所示。
[[CurioSDK shared] startSession:@"server_url"
apiKey:@"XXXXX"
trackingCode:@"XXXXX"
sessionTimeout:4
periodicDispatchEnabled:NO
dispatchPeriod:1
maxCachedActivitiyCount:1000
loggingEnabled:YES
logLevel:0
registerForRemoteNotifications:YES
notificationTypes:@"Sound,Badge,Alert"
fetchLocationEnabled:YES
maxValidLocationTimeInterval:600
delegate:self
appLaunchOptions:launchOptions
];
对于tvOS,您可以如此启动会话
[[CurioSDK shared] startSession:@"server_url"
apiKey:@"XXXXX"
trackingCode:@"XXXXX"
sessionTimeout:4
periodicDispatchEnabled:NO
dispatchPeriod:1
maxCachedActivitiyCount:100
loggingEnabled:YES
logLevel:0
fetchLocationEnabled:YES
maxValidLocationTimeInterval:60
appLaunchOptions:launchOptions];
ServerURL: [必填] Curio服务器URL,可以从Turkcell获取。
ApiKey: [必填] 应用特定API密钥,可以从Turkcell获取。
TrackingCode: [必填] 应用特定跟踪码,可以从Turkcell获取。
SessionTimeout: [可选] 以分钟为单位会话超时时间。默认为30分钟,但强烈建议根据您的应用程序特性更改此值。为您的应用程序指定正确的会话超时值将提高分析数据的准确性。
PeriodicDispatchEnabled: [可选] 如果为true,则启用周期性调度。默认为false。
DispatchPeriod: [可选] 如果启用周期性调度,该参数配置以分钟为单位的调度周期。默认为5分钟。注意:此参数的值不能大于会话超时值。
MaxCachedActivityCount: [可选] 当设备未连接到互联网时,Curio库将记住的最大用户活动数。默认为1000,最大值为4000。
LoggingEnabled: [可选] 如果此为false,则将禁用Curio日志。默认为true。
LogLevel: [可选] 包含打印日志的级别。0 - 错误,1 - 警告,2 - 信息,3 - 调试。默认为0(错误)。
RegisterForRemoteNotifications:[tvOS不可用] 如果启用,则Curio SDK将自动为“NotificationTypes”参数中定义的类型注册远程通知。
NotificationTypes:[tvOS不可用] 要注册的通知类型;可用值:Sound,Badge,Alert
FetchLocationEnabled: [可选] 如果启用,则在应用程序使用期间将跟踪设备的当前位置。默认为true。与使用 strong>MaxValidLocationTimeInterval 验证最近位置准确性。根据需求找到准确位置后停止位置跟踪。要进行进一步的地理位置跟踪,可以使用 strong>[[CurioSDK shared] sendLocation] 方法。为了在iOS8中跟踪位置 NSLocationWhenInUseUsageDescription必须在Info.plist文件中实现。
MaxValidLocationTimeInterval: [可选] 默认为600秒。使用此参数验证最近位置准确性。位置跟踪将继续,直到达到有效的位置时间间隔。
delegate:[tvOS不可用] 如果您正在使用 "CurioSDKDelegate" 协议,则可以使用您的类引用设置此参数。"CurioSDKDelegate" 协议为 "unregisterFromNotificationServer" 和 "sendCustomId" 方法提供回调。
您可以通过在CurioSDK类中调用startSession函数来在应用程序启动时启动会话。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[CurioSDK shared] startSession:launchOptions];
...
}
您可以通过在CurioSDK类中调用startScreen函数来启动屏幕。
- (void) viewDidAppear:(BOOL)animated {
[[CurioSDK shared] startScreen:[self class] title:@"Master view" path:@"Master-view"];
}
您可以通过在CurioSDK类中调用startScreen函数来结束屏幕。
- (void) viewDidDisappear:(BOOL)animated {
[[CurioSDK shared] endScreen:[self class]];
}
您可以通过在CurioSDK类中调用sendEvent函数来发送event-key和值对。您还可以使用 ">" 分类发送事件键,例如 @"Cat1>Cat2>Cat3"。
- (IBAction)sendEvent:(id)sender {
[[CurioSDK shared] sendEvent:@"Clicked button" eventValue:NSStringFromClass([self class])];
}
您可以通过在CurioSDK类中调用endEvent函数来发送事件键值对和持续时间(以毫秒为单位)。您还可以使用“>”来分类发送结束事件键,例如“@Cat1>Cat2>Cat3”。
- (IBAction)endEvent:(id)sender {
[[CurioSDK shared] endEvent:@"Clicked button" eventValue:NSStringFromClass([self class]) eventDuration:[NSNumber numberWithDouble:5000]];
}
您可以通过使用CurioSDK类的endSession函数来结束已开始的会话。通常情况下,无需手动结束应用程序会话。CurioSDK自动处理会话完成过程,以通知Curio服务器。
- (void)applicationWillTerminate:(UIApplication *)application {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
[[CurioSDK shared] endSession];
}
如果将“RegisterForRemoteNotifications”参数设置为true并设置“NotificationTypes”参数,Curio iOS SDK可以自动注册您的应用程序以接收远程推送通知。此功能在tvOS中不可用。您还必须实现如下所示的“didReceiveRemoteNotification”和“didRegisterForRemoteNotificationsWithDeviceToken”方法
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
[[CurioNotificationManager shared] didReceiveNotification:userInfo];
}
//or if you implement this method
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
completionHandler(UIBackgroundFetchResultNewData);
[[CurioNotificationManager shared] didReceiveNotification:userInfo];
}
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
[[CurioNotificationManager shared] didRegisteredForNotifications:deviceToken];
}
您可以使用以下方法追踪设备位置。在使用此方法之前,请检查< письмен>FetchLocationEnabled是否为YES。为了在iOS8中跟踪位置,必须在Info.plist文件中实现 NSLocationWhenInUseUsageDescription(请参阅此链接)。
[[CurioSDK shared] sendLocation];
您可以获取发送到设备的推送通知的历史记录。此功能在tvOS中不可用。
[[CurioSDK shared] getNotificationHistoryWithPageStart:0 rows:5 success:^(NSDictionary *responseObject) {
NSLog(@"%@", responseObject.description);
} failure:^(NSError *error) {
NSLog(@"%@", error.description);
}];
对于将自定义ID发送到Curio服务器,应按照以下方式调用sendCustomId方法
...
[[CurioSDK shared] sendCustomId: @"sample custom id"];
...
您可以使用CurioSDKDelegate协议中的customIDSent:委托方法获取结果。
...
- (void)customIDSent:(NSDictionary *)responseDictionary {
NSLog(@"customIDSent response description: %@", responseDictionary.description);
}
...
自定义ID和CurioSDKDelegate在tvOS中不可用。
您可以通过调用unregisterFromNotificationServer方法从您的应用程序中注销您的应用程序从Curio推送通知服务器。调用此方法后,您的应用程序将不会接收推送通知
...
[[CurioSDK shared] unregisterFromNotificationServer];
...
您可以使用协议CurioSDKDelegate中的unregisteredFromNotificationServer:委托方法获取结果。
...
- (void)unregisteredFromNotificationServer:(NSDictionary *)responseDictionary {
NSLog(@"unregisteredFromNotificationServer response description: %@", responseDictionary.description);
}
...
推送通知动作在tvOS中不可用。
您可以使用Curio为您的用户配置文件设置标签。可以多次发送多个标签。标签必须以键/值格式发送;
[[CurioSDK shared] sendUserTags:[[NSDictionary alloc] initWithObjectsAndKeys:@"27", @"AGE", nil]];
返回之前设置的用户标签的NSDictionary对象;
[[CurioSDK shared] getUserTagsWithSuccess:^(NSDictionary *responseObject) {
NSLog(@"User tags: %@", responseObject);
} failure:^(NSError *error) {
NSLog(@"Error on getting user tags %@", [error description]);
}];
Curio SDK包含两个不同的工作流程,用于维护存储和提交功能。
第一个工作流程(我们将称之为存储工作流程)通过一种方式处理数据库记录,以便将用户动作保存到本地存储(SQLITE)。所有存储函数都位于< strong>CurioDBToolkit.m和< strong>CurioDB.m strong>。当用户连接与SDK相关的函数时,首先是CurioSDK将其存储到本地存储,无论我们是线上还是离线,或者已启用周期性调度请求(PDR)或否。
对于这些请求,CurioDBToolkit::addAction函数将运行以将创建的动作记录插入到数据库中。所有动作都转换为< strong>CurioAction.m strong>对象,并通过将CurioAction序列化来存储和检索;
存储在名为ACTIONS strong>的SQLITE表中,该表在第一次运行时由< strong>CurioDB.m strong>创建。
第二个工作流程(我们将其称为提交工作流程)处理记录的检索和通过互联网传输到服务器。此工作流程的主要核心功能运行在 CurioPostOffice.m 模块。
它以两种方式启动...一种是按周期性运行(如果已启用PDR)另一种是同步运行(如果未启用PDR)。同步运行与线程同步无关,而是与用户操作并行运行。
+--------+ +--------------+
| | | |
| Curio | | User Actions |
| Server | | |
| | +------+-------+
+---^----+ |
| SYNC ASYNC
| |
+---+----+ |
| Post | +----v----+
| Office | |DBToolkit|
+---^----+ +----+----+
| |
| |
ASYNC ASYNC
| POOL |
| +---------+ |
| | Local | |
+----> Storage <----+
+---------+
如果启用PDR,则在 CurioPostoffice::opQueue 队列中运行一个休眠线程,并且在每次调度周期(可以在设置中配置)唤醒并运行 CurioPostoffice::tryToPostAwaitingActions 函数以尝试将存储在数据库中的操作发布。如果PDR未启用,则存在一个名为 CS_NOTIF_NEW_ACTION 的全局内部通知名称,它等待任何用户动作信号以运行 CurioPostoffice::tryToPostAwaitingActions。
提交工作流程中最关键点是位于 CurioPostoffice::tryToPostAwaitingActions 函数中,该函数处理了大多数转换和传输。
如果未指定 canRunOnMainThread 参数,则需要在后台线程中运行。如果不是,则将其自己切换回后台线程,以免干扰用户的舒适度。它检查设备是否在线。如果不在,则将待处理的记录切换为离线记录,否则尝试按照记录中的操作时间顺序发布操作,这些操作时间保存在 aId 列中。
它将操作对象放入两个数组中(如果PDR未启用则仅使用一个数组)以批量收集它们。第一个是 offlineActions,第二个是 pdrActions 数组。在 CurioPostoffice::tryToPostAwaitingActions 中,主要功能是迭代记录并将它们收集为PDR(如果启用)或离线,如果它们是在线记录,则立即将它们发送到服务器,在其他情况下,在完成时将收集到的数组推送到服务器。
除了两个主要工作流程之外,还有一个 CurioNetwork.h 处理网络状态变化,并通过通知调用通知SDK的所有部分。
随着iOS 9中应用传输安全(ATS)的添加,可能会看到 CFNetwork SSLHandshake failed (-9806)
错误。如果您在Curio SDK请求中遇到此问题,可以通过向您的 Info.plist
中添加以下内容来解决此问题。以下应wiadomość
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>example.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>