// 引入神策分析 SDK
    #import "SensorsAnalyticsSDK.h"
    // 数据接收的 URL
    #define SA_SERVER_URL @"YOUR_SERVER_URL"
    // Debug 模式选项
    //   SensorsAnalyticsDebugOff - 关闭 Debug 模式
    //   SensorsAnalyticsDebugOnly - 打开 Debug 模式,校验数据,但不进行数据导入
    //   SensorsAnalyticsDebugAndTrack - 打开 Debug 模式,校验数据,并将数据导入到神策分析中
    // 注意!请不要在正式发布的 App 中使用 Debug 模式!
    #define SA_DEBUG_MODE SensorsAnalyticsDebugOff
    // 初始化 SDK
    [SensorsAnalyticsSDK sharedInstanceWithServerURL:SA_SERVER_URL
                                        andLaunchOptions:launchOptions
                                        andDebugMode:SA_DEBUG_MODE];
    [[SensorsAnalyticsSDK sharedInstance] enableTrackScreenOrientation:YES]; // CoreMotion 采集屏幕方向
    [[SensorsAnalyticsSDK sharedInstance] enableTrackGPSLocation:YES];// CoreLocation 采集 GPS 信息

swift 代码示例:

SensorsAnalyticsSDK.sharedInstance(withServerURL: SA_SERVER_URL, andLaunchOptions:launchOptions, andDebugMode: SensorsAnalyticsDebugMode.andTrack)

其中 SA_SERVER_URL 是前文中从神策分析获取的数据接收的 URL,SA_DEBUG_MODEDebug 模式 选项。一旦成功初始化后,则可以通过 sharedInstance 获取 SDK 实例,进行用户行为事件或属性的追踪。

注意:不要在正式发布的 App 中使用 Debug 模式!

至此,我们已经可以正常使用神策分析 SDK 了。需了解更多关于 SDK 的配置方法,可以跳到本文末尾的 设置神策分析 SDK 一节。

    // 在用户浏览商品页面时...
    UInt64 productId = 123456;                      // 获取商品ID
    NSString *productCatalog = @"Laptop Computer";  // 获取商品类别
    BOOL isAddedToFavorites = false;                // 是否被添加到收藏夹
    // 记录浏览商品事件,并将商品ID、商品类别和是否被添加进收藏夹作为事件属性上传
    [[SensorsAnalyticsSDK sharedInstance] track:@"ViewProduct"
                                 withProperties:@{
                                                  @"ProductID" : [NSNumber numberWithUnsignedLong:productId],
                                                  @"ProductCatalog" : productCatalog,
                                                  @"IsAddedToFav" : isAddedToFavorites ? @YES : @NO
    // 在用户结账付款时...
    float orderPaid = 50.10;                        // 订单支付金额
    NSSet *orderList = [NSSet setWithArray:@[@"Apple iPhone6s", @"Nexus 6"]];   // 产品列表
    // 记录浏览商品事件,并将商品ID、商品类别和是否被添加进收藏夹作为事件属性上传
    [[SensorsAnalyticsSDK sharedInstance] track:@"PaidOrder"
                                 withProperties:@{
                                                  @"OrderPaid" : [NSNumber numberWithFloat:orderPaid],
                                                  @"OrderList" : orderList

swift 代码示例:

    // 记录浏览商品事件,并将商品ID、商品类别和是否被添加进收藏夹作为事件属性上传
    SensorsAnalyticsSDK.sharedInstance().track("ViewProduct", withProperties:
                                            ["ProductID":123456,                // 获取商品ID
                                             "ProductCatalog":"Laptop Computer",// 获取商品类别
                                             "IsAddedToFav":false])             // 是否被添加到收藏夹

通过 Debug模式,可以校验追踪的事件及属性是否正确。普通模式下,数据导入后,在神策分析中稍等片刻,便能看到追踪结果。请注意,不要在正式发布的 App 中使用 Debug 模式

    // 打开自动采集, 并指定追踪哪些 AutoTrack 事件
    [[SensorsAnalyticsSDK sharedInstance] enableAutoTrack:SensorsAnalyticsEventTypeAppStart |
     SensorsAnalyticsEventTypeAppEnd |
     SensorsAnalyticsEventTypeAppViewScreen |
     SensorsAnalyticsEventTypeAppClick];

swift 代码示例:

SensorsAnalyticsSDK.sharedInstance().enableAutoTrack([.eventTypeAppStart,.eventTypeAppEnd,.eventTypeAppViewScreen,.eventTypeAppClick])

打开 Auto Track 后,会采集的事件包括:

  • 点击控件时,会发送 $AppClick 事件,会包含点击的相应控件的基本信息。

  • 继承于 UIControl 的控件(如 UIButtonUISlider 等)、UITabBarUIActionSheet 以及 UIAlertView 等控件
    • $element_type - String 类型,表示控件的类型
    • $element_content - String 类型,表示控件的内容
    • $title - String 类型,表示 ViewController 的标题,先读取controller.navigationItem.title,如果有自定义view,并且能够获取到文本,就覆盖 controller.navigationItem.title 获取到的值
    • $screen_name - String 类型,表示 ViewController 的类名
    • 继承于 UIScrollView 的控件(UITableViewUICollectionView
      • $element_type - String 类型,表示控件的类型
      • $element_content - String 类型,表示控件的内容
      • $title - String 类型,表示 ViewController 的标题,先读取controller.navigationItem.title,如果有自定义view,并且能够获取到文本,就覆盖 controller.navigationItem.title 获取到的值
      • $screen_name - String 类型,表示 ViewController 的类名
      • $element_position - String 类型,表示控件被点击的具体位置(例如:'0:2'表示 Section=0,Row =2)
      • $is_first_time - Bool 类型,Yes 表示 App 安装后首次启动,No 则相反
      • $is_first_day - Bool 类型,Yes 表示 App 安装后首日访问,No 则表示不是首日访问(1.6.29 及以后版本支持该属性)
      • $resume_from_background - Bool 类型,Yes 表示 App 从后台恢复,No 表示 App 启动
      • App 进入后台时,会自动记录 $AppEnd 事件,事件属性:

      • event_duration - Int 类型,表示本次 App 启动的使用时长,单位为秒
      • App 浏览页面时(切换 ViewController),会自动记录记录 $AppViewScreen 事件,事件属性:

      • $title - String 类型,表示 ViewController 的标题,先读取controller.navigationItem.title,如果有自定义view,并且能够获取到文本,就覆盖 controller.navigationItem.title 获取到的值
      • $screen_name - String 类型,表示 ViewController 的类名
      • 关于 AutoTrack 的更详细文档,请参考

            // 将'平台类型'作为事件公共属性,后续所有 track: 追踪的事件都将设置 "PlatformType" 属性,且属性值为 "iOS"
            [[SensorsAnalyticsSDK sharedInstance] registerSuperProperties:@{@"PlatformType" : @"iOS"}];
        

        成功设置事件公共属性后,再通过 track: 追踪事件时,事件公共属性会被添加进每个事件中,例如:

            // 记录收藏商品事件
            [[SensorsAnalyticsSDK sharedInstance] track:@"AddToFav"
                                         withProperties:@{@"ProductID" : [NSNumber numberWithUnsignedLong:123456]}];
        

        在设置事件公共属性后,实际发送的事件中会被加入 PlatformType 属性,等价于

            // 记录收藏商品事件
            [[SensorsAnalyticsSDK sharedInstance] track:@"AddToFav"
                                         withProperties:@{
                                                         @"ProductID" : [NSNumber numberWithUnsignedLong:123456], 
                                                         @"PlatformType" : @"iOS"
        

        swift 代码示例:

            SensorsAnalyticsSDK.sharedInstance().registerSuperProperties(["PlatformType":"iOS"])
        

        重复调用 registerSuperProperties: 会覆盖之前已设置的公共属性,公共属性会保存在 App 本地缓存中。可以通过 unregisterSuperProperty: 删除一个公共属性,使用 clearSuperProperties: 会删除所有已设置的事件公共属性。

        当事件公共属性和事件属性的 Key 冲突时,事件属性优先级最高,它会覆盖事件公共属性。

        注意:请在开启自动采集( enableAutoTrack: )之前调用 registerSuperProperties: 接口,确保每个事件都会添加已设置的公共属性。

            // 进入商品页面,标记 ViewProduct 事件的启动时间
            [[SensorsAnalyticsSDK sharedInstance] trackTimerStart:@"ViewProduct"]; 
            // ... 用户浏览商品
            // 离开商品页,记录 ViewProduct 事件,并在属性 event_duration 中记录用户浏览商品的时间
            [[SensorsAnalyticsSDK sharedInstance] trackTimerEnd:@"ViewProduct"
                                         withProperties:@{
                                                          @"ProductId" : PRODUCT_ID
        

        swift 代码示例:

            // 进入商品页面,标记 ViewProduct 事件的启动时间
            SensorsAnalyticsSDK.sharedInstance().trackTimerStart("ViewProduct")
            // ... 用户浏览商品
            // 离开商品页,记录 ViewProduct 事件,并在属性 event_duration 中记录用户浏览商品的时间
            SensorsAnalyticsSDK.sharedInstance().trackTimerEnd("ViewProduct", withProperties: [ProductId:PRODUCT_ID])
        

        多次调用 trackTimerStart:@"Event" 时,事件 "Event" 的开始时间以最后一次调用时为准。

          //获取当前用户的匿名id
          NSString *anonymousId = [[SensorsAnalyticsSDK sharedInstance] anonymousId];
        

        swift 代码示例:

          let  anonymousId:String = SensorsAnalyticsSDK.sharedInstance().anonymousId()
        

        注意: 如果服务端做了埋点,需在用户注册/登录的时候将匿名 ID 传给服务端做用户 ID 关联。

            // 记录用户打开首页,此时的 DistinctId 为神策分析 SDK 随机分配的 ID,例如 IDFV: "9771C579-71F0-4650-8EE8-8999FA717761"
            // 这只是一个示例,用户可根据实际需求添加事件
            [[SensorsAnalyticsSDK sharedInstance] track:@"ViewHomepage"];
            // 关联 DistinctId(匿名 ID),神策分析将 "9771C579-71F0-4650-8EE8-8999FA717761" 与 "developer@sensorsdata.cn" 关联,并认为两个 DistinctId 为同一个用户
            [[SensorsAnalyticsSDK sharedInstance] login:@"developer@sensorsdata.cn"];
            // 记录用户打开商品详情页,此时被追踪的事件的 DistinctId 为 "developer@sensorsdata.cn"
            // 这只是一个示例,用户可根据实际需求添加事件
            [[SensorsAnalyticsSDK sharedInstance] track:@"ProductDetailView"];
        

        swift 代码示例:

            // 关联 DistinctId(匿名 ID),神策分析将 "9771C579-71F0-4650-8EE8-8999FA717761" 与 "developer@sensorsdata.cn" 关联,并认为两个 DistinctId 为同一个用户
            SensorsAnalyticsSDK.sharedInstance().login("developer@sensorsdata.cn")
        

        注意,对同一个用户,login: 可调用多次,多次调用 login: 时,如果新设置的 登录 ID 与之前缓存的 登录 ID 相同,神策分析会忽略该次调用。

            // 设定用户性别属性 "Sex" 为 "Male"
            // `set:WithValue` 方法用于设定单个用户属性
            [[[SensorsAnalyticsSDK sharedInstance] people] set:@"Sex" to:@"Male"];
            // 设定用户年龄属性 "Age" 为 18
            // `set:` 方法设定一个或多个用户属性
            [[[SensorsAnalyticsSDK sharedInstance] people] set:@{@"Age" : [NSNumber numberWithInt:18]}];
        

        swift 代码示例:

           //设置单个用户属性
           SensorsAnalyticsSDK.sharedInstance().set("Sex", to:"Male")
           //设置多个用户属性
           SensorsAnalyticsSDK.sharedInstance().set(["Age":18])
        

        使用 unset: 可以删除特定的用户属性。

        用户属性中,属性名称与属性值的约束条件与事件属性相同,详细说明请参考 数据格式

            // 设定用户渠道为,"developer@sensorsdata.cn" 的 "AdSource" 属性值为 "App Store"
            [[[SensorsAnalyticsSDK sharedInstance] people] setOnce:@"AdSource" to:@"App Store"];
            // 再次设定用户渠道,设定无效,"developer@sensorsdata.cn" 的 "AdSource" 属性值仍然是 "App Store"
            [[[SensorsAnalyticsSDK sharedInstance] people] setOnce:@"AdSource" to:@"Email"];
        

        swift 代码示例:

            SensorsAnalyticsSDK.sharedInstance().setOnce("AdSource", to: "App Store")
            SensorsAnalyticsSDK.sharedInstance().setOnce(["AdSource":"Email"])
        

            // 将用户游戏次数属性增加一次
            // `increment:by:` 对一个属性进行累加
            [[[SensorsAnalyticsSDK sharedInstance] people] increment:@"GamePlayed" by:[NSNumber numberWithInt:1]];
            // 增加用户付费次数和积分
            // `increment:` 对一个或多个属性进行累加
            [[[SensorsAnalyticsSDK sharedInstance] people] increment:@{
                                                                       @"UserPaid" : [NSNumber numberWithInt:1],
                                                                       @"PointEarned" : [NSNumber numberWithFloat:12.5]
        

        swift 代码示例:

            SensorsAnalyticsSDK.sharedInstance().increment("GamePlayed", by: 1)
            SensorsAnalyticsSDK.sharedInstance().increment(["UserPaid":1,"PointEarned":5])
        

            // 设定用户观影列表属性,设定后属性 "Movies" 为: ["Sicario", @"Love Letter"]
            [[[SensorsAnalyticsSDK sharedInstance] people] append:@"Movies" by:[NSSet setWithArray:@[@"Sicario", @"Love Letter"]]];
            // 再次设定该属性,属性 "Movies" 为: ["Sicario", @"Love Letter", @"Dead Poets Society"]
            [[[SensorsAnalyticsSDK sharedInstance] people] append:@"Movies" by:[NSSet setWithArray:@[@"Love Letter", @"Dead Poets Society"]]];
        

        swift 代码示例:

            SensorsAnalyticsSDK.sharedInstance().append("Movies", by: ["Sicario","Love Letter"])
        

        需要注意的是,列表型属性中的元素必须为 NSString 类型,且元素的值会自动去重。关于列表型限制请见 数据格式 7.3 属性长度限制

            // 替换默认匿名 ID: '9771C579-71F0-4650-8EE8-8999FA717761'
            [[SensorsAnalyticsSDK sharedInstance] identify:@"9771C579-71F0-4650-8EE8-8999FA717761"];
        

            NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
            NSString *appCurName = [infoDictionary objectForKey:@"CFBundleDisplayName"];
            if (appCurName != nil) {
                [[SensorsAnalyticsSDK sharedInstance] registerSuperProperties:@{@"app_name": appCurName}];
        

        注意:请在开启自动采集( enableAutoTrack: )之前添加该属性,确保每个事件都会添加已设置的公共属性。

           //开启 crash 信息自动采集
           [[SensorsAnalyticsSDK sharedInstance] trackAppCrash];
        

           //获取预置属性
           NSDictionary * presetProperties = [[SensorsAnalyticsSDK sharedInstance] getPresetProperties];
        

  •