Curio_iOS_SDK 1.2.4

Curio_iOS_SDK 1.2.4

测试已测试
Lang语言 Obj-CObjective C
许可证 Apache 2
发布上次发布2016年1月

Can Ciloglu 维护。



Curio iOS SDK 1.2.5

Curio 是 Turkcell 的移动分析系统,这将是 Curio 的客户端 iOS 库。为 iOS 6.0+ 和 tvOS 9+ 开发的应用程序可以很容易地使用这个库使用 Curio 移动分析。

新功能

v1.2.5

删除了弃用的方法,ios 部署目标升级到 7.0

v1.2.4

从本版本开始,CurioSDK 发送的客户端版本将引用 CFBundleShortVersionString。

v1.2.3

更新 Readme。

v1.2.2

添加了用户标记。

v1.2.0

添加了 tvOS 支持。

v1.1.1

添加了 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(如果启用了自动推送注册)

对于将自定义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。当用户连接与SDK相关的函数时,首先是CurioSDK将其存储到本地存储,无论我们是线上还是离线,或者已启用周期性调度请求(PDR)或否。

对于这些请求,CurioDBToolkit::addAction函数将运行以将创建的动作记录插入到数据库中。所有动作都转换为< strong>CurioAction.m对象,并通过将CurioAction序列化来存储和检索;

存储在名为ACTIONS的SQLITE表中,该表在第一次运行时由< strong>CurioDB.m创建。

第二个工作流程(我们将其称为提交工作流程)处理记录的检索和通过互联网传输到服务器。此工作流程的主要核心功能运行在 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>