iOS SDK 集成指南

适用于iOS应用,支持Hybrid APP。

1. 下载SDK

最新版本:AnalysysFangzhou_iOS_SDK_V3.7.8
更新时间:2017/11/28
更新内容:

1) Demo调整;
2) 使用易观广告推送可不进行代码注册即可使用;
3) 部分用户信息字段名称修改;
4) 性能优化及部分bug修复;

2. 准备环境导入SDK

解压下载文件AnalysysFangzhou_iOS_Idfa_SDK_xxxx,将对应版本文件夹下的EGMonitor文件导入您的项目工程中

2.1 基本配置

1)选择工程根目录->TARGETS->Build Phases->Link Binary With Libraries,检查是否存在EGMonitorLib.a类库,若不存在则点击“+”,Add Other..选择EGMonitor下的libEGMonitor.a,点击确定

2)添加系统依赖库如下(路径同1):

类库 说明
CoreTelephony.framework 用于读取手机运营商信息
SystemConfiguration.framework 用于判断网络状态
libz.framework 用于数据处理
CoreLocation.framework 读取地理位置信息(读取地理位置)
AdSupport.framework 广告标识(参考‘IDFA说明’)

如下图所示:

示例图片

2.2 iOS 9之适配ATS

iOS 9.0中新增App Transport Security(简称ATS)特性, 主要使原来请求的时候用到的HTTP,都转向TLS1.2协议进行传输。这也意味着所有的HTTP协议都强制使用了HTTPS协议进行传输。
如果我们在iOS 9.0以后直接进行HTTP请求是会收到如下错误提示:

App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.

系统会告诉我们不能直接使用HTTP进行请求,需要在Info.plist新增一段用于控制ATS的配置:

<key>NSAppTransportSecurity</key>
<dict>
 <key>NSAllowsArbitraryLoads</key>
 <true/>
</dict>

即:在工程目录中->TARGETS->Info新增配置如下:

ATS

苹果规定 从2017年1月1日起,新提交的 app 不允许使用NSAllowsArbitraryLoads来绕过ATS(全称:App Transport Security)的限制。

2.3 地理位置信息配置

在plist文件中添加NSLocationWhenInUseUsageDescription或NSLocationAlwaysUsageDescription配置:
找到info.plist文件-->右击-->Open As-->Source Code-->在尾部的</dict>标签之前添加并修改对应描述信息(选择一个即可):

<key>NSLocationUsageDescription</key>
<string>使用位置描述说明</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>app使用期间获取GPS的描述</string>

或者

 <key>NSLocationAlwaysUsageDescription</key>
 <string>app一直获取GPS的描述</string>

GPS

2.4 URL Scheme配置

URL Scheme配置用于其他app唤醒自身app或通过H5页面拉起时统计使用。
在工程目录->TARGETS->Info->URL Types,添加相应的URL Scheme。identifier: EGMonitor;URL Scheme:h5sdk。如下图所示:

GPS

2.5 其他配置

2.5.1 加载静态库中的类别(category)

工程-->TARGETS-->Build Setting-->搜索Other Linker Flags-->添加 "-ObjC",如下图所示:

GPS

3. 初始化SDK

导入头文件 #import "EGMonitor.h" 在 ~AppDelegate.m 中配置SDK相关内容。代码示例如下:

#import "EGMonitor.h"

-(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.

    EGConfigInstance.appKey = @"易观AppKey";
    EGConfigInstance.channelId = @"App Store";    //  渠道标识
    EGConfigInstance.debugEnable = YES; // 若为Release状态,则置为NO
    EGConfigInstance.autoPositionEnable = YES;  // 是否允许自动获取地理位置信息,若为YES参考上方《2.3地理位置信息配置》
    [EGMonitor startWithConfigure:EGConfigInstance];  // 初始化SDK
    ...

    return YES;
}

注意事项:

1)请将初始化方法写在根视图初始化前,防止统计遗漏;

2)EGConfigInstance为SDK参数配置的实例类,EGMonitorConfig类中标注有'必填项'属性必须正确填写,非必填使用可查看具体属性的注释信息;

3)appKey为添加应用后获取到的AppKey,一个AppKey仅能用于一个APP,同一应用不同平台需分别添加并获取AppKey;

4)channelId的值为应用的渠道标识。默认为 @"App Store";

5)debugEnable设置是否调试模式。默认非调试模式,需要开发者主动设置;在debugEnable = YES模式下,会实时上传日志信息,供开发者查看埋点是否正确,上线时记得设置debugEnable = NO。

4. 重要API接口说明

4.1 采集页面事件信息

说明:页面统计区分iOS原生页面和H5页面两种:原生页面即:使用UIViewController产生的页面;H5页面即:混合模式开发,使用了web开发,嵌入了UIWebView或WKWebView页面。
具体需要采集哪些页面事件信息,请登录方舟官网:我的应用--管理--对应应用<回数状态>列--开始集成或查看日志--预埋点事件梳理 tab页面,添加对应页面埋点信息和属性信息。

参数:

  • @param pageIdentifier 页面标识,《预埋点事件梳理》中事件类型为“页面”的当前“事件ID”
  • @param attributes 页面属性,当前“事件ID”对应的属性信息
  • @param urlStr 页面自定义属性,可以为当前页面的路径

示例:

页面配置信息

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    //  页面开始访问,pageIdentifier为页面的“事件ID”
    [EGMonitor beginLogPage:@"DetailPage"];
}

-(void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    //  使用 endLogPage:attributes:urlStr: 添加自定义属性信息,自定义属性key为“属性ID”
    NSDictionary *attr = @{@"price":@"100",@"payType":@"alipay"};
    [EGMonitor endLogPage:@"DetailPage" attributes:attr urlStr:@"/Detail/ProductDetail"];

    //  若不含其它属性,则可使用endLogPage: 
//    [EGMonitor endLogPage:@"DetailPage"];
}

其他说明:

页面访问时长统计,开始和结束统计必须成对使用且页面标识相同,否则会导致统计数据不准确。
若要统计每一个详情页面的情况(如:所有详情页为同一个类),则可通过urlStr参数设置具体页面标识,如:page/detail?id=1001。

4.2 采集点击事件信息

具体需要采集哪些点击事件信息,请登录方舟官网:我的应用--管理--对应应用<回数状态>列--开始集成或查看日志--预埋点事件梳理 tab页面,添加对应事件埋点信息和属性信息
说明:自定义事件统计
参数:

  • @param eventId 事件标识,《预埋点事件梳理》中事件类型为“点击事件”的当前“事件ID”
  • @param attributes 事件属性,当前“事件ID”对应的属性信息

示例:

事件配置信息

//    包含属性,属性key值为事件的“属性ID”
NSDictionary *attr = @{@"ShareUrl":@"http://ark.analysys.cn/",@"MediaType":@"WeChat"};
//    eventId为事件的“事件ID”
[EGMonitor event:@"ShareAction" attributes:attr];

//    若不含属性,则可以使用:
//  [EGMonitor event:@"ShareAction"];

4.3 采集用户登录/退出信息

在用户登入之时,具体需要上传哪些用户属性,请登录方舟官网:我的应用--管理--对应应用<回数状态>列--开始集成或查看日志--预上传用户属性梳理 tab页面,添加对应用户属性信息。

4.3.1 用户登录统计

参数:

  • @param userInfo EGUserInfo实例

示例:

页面配置信息

EGUserInfo *userInfo = [[EGUserInfo alloc] init];
userInfo.userId = @"8866"; //   真实用户id,必填项
userInfo.userName = @"张三";
userInfo.provider = @"Wechat";
userInfo.email = @"zhangsan@163.com";
userInfo.phoneNumber = @"18688886666";
userInfo.userSex = EGSexMale;
userInfo.birthday = @"1990-10-10";
userInfo.qq = @"1188998866";
userInfo.weChat = @"18688886666";
userInfo.weiBo = @"dawan.163.com";

//  自定义用户属性部分,key为“用户属性ID”
NSMutableDictionary *custAttributes = [NSMutableDictionary dictionary];
[custAttributes setObject:@"Music" forKey:@"Hobby"];
[custAttributes setObject:@"北京" forKey:@"Province"];
[custAttributes setObject:@"白羊座" forKey:@"Constellation"];
userInfo.customerAttributes = custAttributes;

[EGMonitor signIn:userInfo];

4.3.2 用户退出统计

说明:当用户退出帐号或进行帐号切换时调用
参数:无
示例:

[EGMonitor signOff];

4.3.3 用户信息修改

说明:修改已登录用户的用户信息

  • @param userInfo EGUserInfo实例.
    示例:
EGUserInfo *userInfo = [[EGUserInfo alloc] init];
userInfo.userId = @"8866";  //  已存在用户id
userInfo.provider = @"Alipay";
userInfo.phoneNumber = @"15899998888";

//  修改自定义用户属性部分,key为“用户属性ID”。若属性不存在则新增;存在则修改。
NSMutableDictionary *custAttributes = [NSMutableDictionary dictionary];
[custAttributes setObject:@"Dance" forKey:@"Hobby"];
[custAttributes setObject:@"dragon" forKey:@"Animal"];
[custAttributes setObject:@"上海" forKey:@"Province"];
userInfo.customerAttributes = custAttributes;

[EGMonitor editUser:userInfo];

4.4 采集Hybrid页面、事件信息

如果需要对应用内使用UIWebView或WKWebView加载的易观H5相关页面进行数据统计,请使用该模块进行集成。
具体页面及事件的预埋点信息,请参考4.1和4.2中对应的链接中配置。请登录方舟官网:我的应用--管理--对应应用<回数状态>列--开始集成或查看日志--预埋点事件梳理 tab页面,添加对应页面和事件埋点信息和属性信息

4.4.1 H5页面配置

导入JS-SDK:

最新版本:AnalysysFangzhou_JS_APP_SDK

将JS-SDK下载到相应目录;

将以下代码修改目录后,复制到您所需分析页面中的 < head > 和 < /head > 标签之间即可。安装成功后,所有网址下的行为数据都将会被收集

<script src="AnalysysFangzhou_JS_APP_SDK.min.js" async ></script>

fz.pageTAG({Key:value,...})

说明:设置页面属性

参数:

  • Object

为JSON格式,加入相关KEY与VALUE值,如只有KEY值无具体VALUE值,不会上传该字段。

示例:

fz.pageTAG({"页面属性01":"属性01"});

fz.open()

说明:用以Url地址不变的情况下,检测模块切换状况。

如有改变页面Title行为,请在该方法之前使用JS改变页面Title,后使用该方法。

示例:

fz.open();

fz.event({EI:””,EPD:{}})

说明:用户自定义事件

参数:

  • EI 事件ID
  • EPD 事件属性

1)EI 事件ID可在方舟产品中的元事件管理进行预定义。

2)EPD 为JSON格式。

示例:

fz.event({
  EI:"ID01",
  EPD:{
    "event01":"事件01"
  }
  });

fz.setUInfo({"UID":"","UN":"","UPRO":"","EM":"","PN":"","SEX":"","BIY":"","QQ":"","WED":"","WBD":"","UPD":{},})

说明:设置访问用户的个体信息。

参数:

  • UID 用户ID
  • UN 用户名称
  • UPRO 用户来源
  • EM 用户邮箱
  • PN 用户电话
  • SEX 用户性别
  • BIY 用户生日
  • QQ 用户QQ号
  • WED 用户微信号
  • WBD 用户微博号
  • UPD 用户自定义属性字典

1)UPD 为JSON格式。

示例:

fz.setUInfo({
   "UID":"123456",
   "UN":"用户01",
   "UPRO":"直接注册",
   "EM":"123456@qq.com",
   "PN":"18600001234",
   "SEX":"1",
   "BIY":"1988-01-01",
   "QQ":"123456",
   "WED":"18600001234",
   "WBD":"123456@qq.com",
   "UPD":{"自定义属性01":"属性01"}
});

fz.delUInfo() 说明:删除通过setUInfo接口所设置的访问用户的个体信息。

示例:

fz.delUInfo();

4.4.2 app内方法调用

说明:将H5页面嵌入app内,可以使用UIWebView或WKWebView(iOS 8.0以后)。若app仅支持8.0之后版本,建议使用WKWebView控件,效率更高,且使用该SDK统计更加准确。
参数:

  • @param request request请求对象

UIWebView示例

//  实现UIWebViewDelegate的方法
-(BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {
    if ([EGMonitor h5InfoStatEnterWithRequest:request]) {
        NSLog(@"H5统计完成");    //  仅代表统计,页面或事件埋点信息
    }
    return YES;
}

WKWebView示例

//  iOS 8.0之后新增WKWebView是一个高性能的 Web View 解决方案,实现WKNavigationDelegate代理方法:
-(void)webView:(WKWebView*)webView decidePolicyForNavigationAction:(WKNavigationAction*)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
    if (condition) { // 填写具体跳转条件
        if ([EGMonitor h5InfoStatEnterWithRequest:navigationAction.request]) {
            NSLog(@"H5统计完成");    //  仅代表统计,页面或事件埋点信息
        }
        decisionHandler(WKNavigationActionPolicyAllow);
    } else {
        decisionHandler(WKNavigationActionPolicyCancel);
    }
}

4.5 采集地理位置信息

说明:若用户配置EGConfigInstance.autoPositionEnable = YES;则调用以下接口无效。
参数:

  • @param latitude 维度值
  • @param longitude 经度值
  • @param location CLLocation对象

示例:

[EGMonitor setLatitude:39.983687 longitude:116.461477];

[EGMonitor setLocation:cllocation];

4.6 第三方吊起

说明:可以通过配置URL Scheme统计应用吊起相关数据(请确保已经配置2.4内容)。若通过H5页面吊起应用,请集成Web H5-SDK,可添加更多统计信息。
参数:无
示例:

//  兼容iOS 9.0之前版本
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    //  若集成H5-SDK后可返回部分携带参数信息
    NSDictionary *custPara = [EGMonitor wakeupWithOpenURL:url options:nil];

    return YES;
}
//  兼容iOS 9.0之前版本
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    //  若集成H5-SDK后可返回部分携带参数信息
    NSDictionary *custPara = [EGMonitor wakeupWithOpenURL:url options:sourceApplication];

    return YES;
}
//  iOS 9.0及之后版本
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options {
    //  若集成H5-SDK后可返回部分携带参数信息
    NSDictionary *custPara = [EGMonitor wakeupWithOpenURL:url options:options];

    return YES;
}

4.7 消息推送

4.7.1 推送基本设置

说明:设置推送基本信息,请下载最新版极光或个推SDK集成
请先到对应推送厂家官网注册并申请相应的AppKey和Master Secret信息,并将信息回填、绑定到方舟《推送配置》模块。如下图所示: 页面配置信息

参数:

  • @param provider 使用的第三方类型。若同时使用多个推送服务则可多次调用
  • @param pushId 第三方推送使用的真正标识推送的id,如:极光的registrationID,个推的clientId
示例厂商 SDK版本
极光 JPush iOS SDK v3.0.6
个推 版本号:iOS-2.0.0.0
百度 iOS V1.4.9
小米 2.2.7

极光示例

//  注册APNs成功并上报DeviceToken
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {

  [JPUSHService registerDeviceToken:deviceToken];

  [JPUSHService registrationIDCompletionHandler:^(int resCode, NSString *registrationID) {
    if(resCode == 0){
      //  将极光registrationID回传方舟SDK
      [EGMonitor setPushProvider:PushProviderJG pushId:registrationID];
    } else {
      NSLog(@"registrationID获取失败,code:%d",resCode);
    }
  }];
}
@end

个推示例

//  注册APNs成功并上报DeviceToken
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {

    NSString *token = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
    token = [token stringByReplacingOccurrencesOfString:@" " withString:@""];
    NSLog(@"\n>>>[DeviceToken Success]:%@\n\n", token);

    // 向个推服务器注册deviceToken
    [GeTuiSdk registerDeviceToken:token];
}

- (void)GeTuiSdkDidRegisterClient:(NSString *)clientId {
    //  将个推clientId回传方舟SDK
    [EGMonitor setPushProvider:PushProviderGT pushId:clientId];
}

@end

百度示例

//  注册APNs成功并上报DeviceToken
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {

    [BPush registerDeviceToken:deviceToken];

    [BPush bindChannelWithCompleteHandler:^(id result, NSError *error) {
        // 网络错误
        if (error) {
            return;
        }

        if (result) {
            if ([result[@"error_code"]intValue] != 0) {
                return;
            }
            NSString *channel_id = [BPush getChannelId];
            //  将百度ChannelId回传方舟SDK
            [EGMonitor setPushProvider:PushProviderBaiDu pushId:channel_id];
        }
    }];
}

小米示例

//  注册APNs成功并上报DeviceToken
 - (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    // 注册APNS成功, 注册deviceToken
    [MiPushSDK bindDeviceToken:deviceToken];
 }

 - (void)miPushRequestSuccWithSelector:(NSString *)selector data:(NSDictionary *)data {
    if ([selector isEqualToString:@"bindDeviceToken:"]) {
        // 获取regId
        NSString *xmRegId = data[@"regid"];
        [EGMonitor setPushProvider:PushProviderXiaoMi pushId:xmRegId];
    }
}

4.7.2 推送效果统计

当用户收到推送消息时,调用收到推送消息接口上报消息推送成功事件;若用户触发点击通知行为,则调用通知点击接口上报上报事件。
目前推送通知共包含以下四种行为:

  • 跳转应用指定页面:若使用UITabBarController、UINavigationController及其子类作为window.rootViewController的应用,则调用pushViewController:方法到相应页面;若使用UIViewController及其子类时,则调用presentViewController:方式模态推出,需用户在推出页面中添加取消按钮,并调用dismissViewControllerAnimated:方法返回页面。同时会将用户在页面中自定义参数信息传入被推出页面的属性中;
  • 打开链接:>=iOS 9.0应用内浏览链接;否则使用浏览器打开链接;
  • 打开应用:仅调起应用;
  • 自定义行为:将自定义参数返回开发者。

参数:

  • @param userInfo 将推送回调的userInfo字典回传(如:极光推送)或jsonStr(如:个推的payloadMsg字符串)

注意:
在iOS 10之前App在前台收到通知时无法在通知栏显示,iOS 10之后App前台时可通过回调completionHandler(UNNotificationPresentationOptionAlert);方法在通知栏显示。
若用户需要在iOS 10之前系统前台自定义UI展示收到的通知,则在收到通知时调用以下统计方法:

//  App前台 收到推送消息,追踪"App 消息推送"事件
NSDictionary *activityInfo = [EGMonitor receivedRemoteNotification:userInfo];

//  处理点击通知,记录"App通知 点击通知"事件
[EGMonitor clickedRemoteNotification:userInfo];

极光示例

//  >= iOS 10 前台收到通知消息
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {
    NSDictionary * userInfo = notification.request.content.userInfo;
    if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        [JPUSHService handleRemoteNotification:userInfo];

        //  收到推送消息,追踪"App 消息推送"事件
        NSDictionary *activityInfo = [EGMonitor receivedRemoteNotification:userInfo];
    }
    completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert); 
}

//  >= iOS 10 后台点击进入
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
    NSDictionary *userInfo = response.notification.request.content.userInfo;
    if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        [JPUSHService handleRemoteNotification:userInfo];

        //  点击通知栏打开消息,记录"App 点击通知"事件
        [EGMonitor clickedRemoteNotification:userInfo];
    }
    completionHandler();  // 系统要求执行这个方法
}

//  收到通知(>= iOS 7 <iOS 10,默认前台)
//  后台通知需设置Capabilities 开启Remote notifications
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    NSLog(@"iOS7及以上系统,收到通知:%@", [self logDic:userInfo]);
    [JPUSHService handleRemoteNotification:userInfo];
    completionHandler(UIBackgroundFetchResultNewData);

    if (application.applicationState == UIApplicationStateActive) {
        //  App前台 收到推送消息,追踪"App 消息推送"事件
        NSDictionary *activityInfo = [EGMonitor receivedRemoteNotification:userInfo];
    } else if (application.applicationState == UIApplicationStateBackground) {
        //  App前台 收到推送消息,追踪"App 消息推送"事件
        NSDictionary *activityInfo = [EGMonitor receivedRemoteNotification:userInfo];
    } else {
        //  点击通知栏打开消息,记录"App 点击通知"事件
        [EGMonitor clickedRemoteNotification:userInfo];
    }
}

个推示例

#pragma mark - APP运行中接收到通知(推送)处理 - iOS 10以下版本收到推送
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler {

    [GeTuiSdk handleRemoteNotification:userInfo];
    completionHandler(UIBackgroundFetchResultNewData);

    if (application.applicationState == UIApplicationStateActive) {
        //  App前台 收到推送消息,追踪"App 消息推送"事件
        NSDictionary *activityInfo = [EGMonitor receivedRemoteNotification:userInfo];
    } else if (application.applicationState == UIApplicationStateBackground) {
        //  App前台 收到推送消息,追踪"App 消息推送"事件
        NSDictionary *activityInfo = [EGMonitor receivedRemoteNotification:userInfo];
    } else {
        //  点击通知栏打开消息,记录"App 点击通知"事件
        [EGMonitor clickedRemoteNotification:userInfo];
    }
}

#pragma mark - iOS 10中收到推送消息
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
//  iOS 10: App在前台获取到通知
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
    NSDictionary *userInfo = notification.request.content.userInfo;

    if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        //  收到推送消息,追踪"App 消息推送"事件
        NSDictionary *activityInfo = [EGMonitor receivedRemoteNotification:userInfo];
    }
    // 根据APP需要,判断是否要提示用户Badge、Sound、Alert
    completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert);
}

//  iOS 10: 点击通知进入App时触发
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
    NSDictionary *userInfo = response.notification.request.content.userInfo;    
    if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        // [ GTSdk ]:将收到的APNs信息传给个推统计
        [GeTuiSdk handleRemoteNotification:response.notification.request.content.userInfo];

        //  点击通知栏打开消息,记录"App 点击通知"事件
        [EGMonitor clickedRemoteNotification:userInfo];
    }
    completionHandler();
}
#endif

/** SDK收到透传消息回调 */
- (void)GeTuiSdkDidReceivePayloadData:(NSData *)payloadData andTaskId:(NSString *)taskId andMsgId:(NSString *)msgId andOffLine:(BOOL)offLine fromGtAppId:(NSString *)appId {
    // [ GTSdk ]:汇报个推自定义事件(反馈透传消息)
    [GeTuiSdk sendFeedbackMessage:90001 andTaskId:taskId andMsgId:msgId];

    // 数据转换
    NSString *payloadMsg = nil;
    if (payloadData) {
        payloadMsg = [[NSString alloc] initWithBytes:payloadData.bytes length:payloadData.length encoding:NSUTF8StringEncoding];

        //  收到推送消息,追踪"App 消息推送"事件
        NSDictionary *dic = [EGMonitor receivedRemoteNotification:payloadMsg];
    }
}

百度示例

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {

    completionHandler(UIBackgroundFetchResultNewData);

    if (application.applicationState == UIApplicationStateActive) {
        //  App前台 收到推送消息,追踪"App 消息推送"事件
        NSDictionary *activityInfo = [EGMonitor receivedRemoteNotification:userInfo];
    } else if (application.applicationState == UIApplicationStateBackground) {
        //  App前台 收到推送消息,追踪"App 消息推送"事件
        NSDictionary *activityInfo = [EGMonitor receivedRemoteNotification:userInfo];
    } else {
        //  点击通知栏打开消息,记录"App 点击通知"事件
        [EGMonitor clickedRemoteNotification:userInfo];
    }
}

小米示例

- ( void )application:( UIApplication *)application didReceiveRemoteNotification:( NSDictionary *)userInfo {
    [MiPushSDK handleReceiveRemoteNotification :userInfo];

    if (application.applicationState == UIApplicationStateActive) {
            //  App前台 收到推送消息,追踪"App 消息推送"事件
            NSDictionary *activityInfo = [EGMonitor receivedRemoteNotification:userInfo];
            [self showToastWithPara:activityInfo];
        } else if (application.applicationState == UIApplicationStateBackground) {
            //  App后台 收到推送消息,追踪"App 消息推送"事件
            NSDictionary *activityInfo = [EGMonitor receivedRemoteNotification:userInfo];
            [self showToastWithPara:activityInfo];
        } else {
            //  App非活动状态
            //  点击通知栏打开消息,记录"App 点击通知"事件
            [EGMonitor clickedRemoteNotification:userInfo];
        }
 }

// iOS10 应用在前台收到通知
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
    NSDictionary *userInfo = notification.request.content.userInfo;
    if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        [MiPushSDK handleReceiveRemoteNotification:userInfo];

        //  收到推送消息,追踪"App 消息推送"事件
        NSDictionary *activityInfo = [EGMonitor receivedRemoteNotification:userInfo];
    }
    // 根据APP需要,判断是否要提示用户Badge、Sound、Alert
    completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert);
}

// 点击通知进入应用
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
    NSDictionary *userInfo = response.notification.request.content.userInfo;
    if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        [MiPushSDK handleReceiveRemoteNotification:userInfo];

        //  点击通知栏打开消息,记录"App 点击通知"事件
        [EGMonitor clickedRemoteNotification:userInfo];
    }
    completionHandler();
}

4.8

4.8.1 基本设置

说明:可使用易观后台进行广告推送。若系统为iOS及以后系统,可定义推送图片信息;同时可定义点击后链接跳转web页面。

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
#import <UserNotifications/UserNotifications.h>
#endif

#import "EGMonitor.h"

@interface EGAppDelegate ()<UNUserNotificationCenterDelegate>

@end

4.8.1 处理广告信息

#pragma mark *** 广告处理 ( < iOS 10) ***
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
    if (application.applicationState == UIApplicationStateInactive) {

        //  点击广告消息
        [EGMonitor clickedAdNotification:notification.userInfo];
    }
}

#pragma mark *** iOS 10中收到广告消息 ***
//  iOS 10: 前台展示广告信息
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {

    //  回调结果。若不写此方法,在iOS 10之后系统前台时不会有反应
    completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert);
}

//  iOS 10: 点击广告进入App
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {

    NSDictionary *userInfo = response.notification.request.content.userInfo;
    if ([response.notification.request.trigger isKindOfClass:[UNTimeIntervalNotificationTrigger class]]) {
        //  点击广告消息
        [EGMonitor clickedAdNotification:userInfo];
    }

    completionHandler();
}

5. 开启Debug模式

至此SDK已经集成完毕,为了可以快速在页面上看到应用回传的日志,来校验埋点的正确性和完整性,引入了Debug模式。
在EGConfigInstance.debugEnable = YES;模式下,数据将发送到测试服务器,能够实时看到日志;
默认debugEnable = No,正式发布APP时,切记确保为No。

6. 验证SDK集成是否正确

通过以下几步完成数据准确性和完整性的验证:

1)开启Debug模式,在真机上运行测试应用,对相关埋点的地方点击操作;
2)将app退入后台,搜索Xcode打印日志中是否包含“【 eguanLog 】”字样。若显示“【 eguanLog 】-> 数据上传成功!”则表示集成正确;若有其他信息请检查。
3)最多5分钟之内就可以在应用管理中查看日志;
4)系统会默认校验回传日志是否满足在预埋点事件和预上传用户属性中梳理的需求;将在元事件管理和用户属性管理页面显示校验结果;
5)根据结果提示做相应调整,当状态都为 √ 的时候,表示集成正确,关闭Debug模式,即可发布应用(不同渠道包注意填写不同的渠道ID)。

附:IDFA说明

若使用易观方舟iOS SDK默认版本会获取IDFA(identifier for advertising),使开发者更精准的识别用户,提高追踪数据的准确性和稳定性,尤其是对含有广告服务的应用用户追踪有很大的作用。
但根据AppStore的应用审核规定,拒绝上架采集IDFA但未集成任何广告服务的应用。
为此,易观方舟同时提供两个版本的iOS SDK,分别是采集IDFA的默认版本和不采集IDFA版本。

  • 若您希望采集IDFA,追踪广告带来的行为,但您的应用未集成任何广告服务时,返回顶部选择下载默认版本。

注意:在提交Appstore审核时按照以下方式选择IDFA选项,以防止应用因获取IDFA被AppStore拒绝(若您的应用本身含有广告服务,提交时按应用本身情况选择即可)。

替代文字

  • 若您不希望采集IDFA,可以点击下载不含IDFA版,集成时可能存在两种情况:

1) 未集成过默认版本SDK,则在集成不含IDFA版时,无需导入框架AdSupport.framework,其余集成方法同上。

2) 已集成默认版本SDK,但需要更换成不含IDFA版时,请同时移除应用内的相关库文件: AdSupport.framework。

results matching ""

    No results matching ""