iOS SDK 接入指南

客服MM发表于:2016年07月11日 17:17:16更新于:2020年07月06日 16:49:08


最新版本
V2.9.4
更新时间2020-7-6
更新内容

1. 修复连续快速触发事件时,产生多图bug

2. 添加trigger点击关闭时移除的代理 heziTirggerDidRemoveFromSuperView

最新版本
V2.9.2
更新时间2019-10-30
更新内容

       

修复了某些情况下解析url的出现的崩溃

v2.8.0以前的版本也会出现这个问题

崩溃修复仅仅在v2.9.2及以上修复,老版本请更换

最新版本
V2.9.1
更新时间2019-10-23
更新内容

       

增加了js主动关闭窗口的接口


最新版本
V2.9.0
更新时间2019-10-08
更新内容

       

跟以前版本不兼容

  • 替换掉了原来的UIWebView的实现(HeziSDKWebView),采用了WKWebView的实现(HZSDKWKWebview)

  • 使用流程跟以前基本没变化


最新版本
V2.8.3
更新时间2019-09-05
更新内容
  1. 增加了活动webview加载url的监听方式。可以通过加载url的监听做不同的处理

历史V2.8.2
更新时间2019-09-02 至  2019-09-04
更新内容1. 修复了HeziSDKApplinks中因为服务端数据类型的变动导致的崩溃问题


历史V 2.8.1
更新时间2018-11-21
更新内容

 1. 开放了活动页部分API

 2. 增加了活动页一些回调

 3. 增加了一些触发产生的代理方法

历史版本V 2.8.0
更新时间2018-11-20
更新内容
  1. 提供主动获取sdk版本的API:  + (NSString *)currentVersion;

  2. heziTriggerSuccess方法现在可以获取到触发的数据.可以用来判断是否触发条件成功.

历史版本V 2.7.1
更新时间2018-10-19
更新内容
  1. 优化 sdk

  2. 增加iphone x max xr新手机的适配

历史版本 v2.3.0
更新内容
  1. 优化 sdk

  2.  增加deeplink的scheme参数增加invivation的字段说明

Demo 源码(集成SDK参考使用)

下载 demo


活动盒子iOS SDK接入文档



  • sdk 接入流程

    • 1. 工程设置

    • 2. SDK初始化

    • 3. 活动埋点

    • 一、安装

    • 二、SDK使用

  • 推送功能

    • 推送流程

    • 推送功能 api

    • 极光推送 example

    • 个推 / leanCloud Example

  • DeepLink功能

    • 介绍

    • APP Scheme 配置

    • 创建深度链接

    • 解析深度链接

    • 页面统计功能

    • SDK标签功能使用(可选)

    • 常见BUG

    • v2.8.1主要更新内容


sdk 接入流程


一、安装

下载HeziSDK.zip文件,将zip文件解压,得到HeziSDK文件夹,将HeziSDK文件夹拖入工程即可。

二、SDK使用

1. 工程设置

设置编译参数,在Other Linker Flags里面添加 -ObjC选项。注意O和C两个字母都是大写

00159c31ee484abe21606d411a4b598

- 添加 libsqlite3.tbd库

00159c31f1c81f23a4207892ca0cd60


2. SDK初始化

打开AppDelegate.m文件,导入HeziSDKManager.h

  • 在didFinishLaunchingWithOptions方法里面执行下面方法:

// 设置KEY[[HeziSDKManager sharedInstance] configureKey:@"2363bea83d660828ae9a6be2c9e50048"];// 针对私有化部署的用户需要设置私有化的域名,域名后需要有'/'//[[HeziSDKManager sharedInstance] configureServerDomain:@"https://emma.mydomain.com/"];// 是否开启debug模式[[HeziSDKManager sharedInstance] openDebug:YES];// 设置导航栏样式[[HeziSDKManager sharedInstance] setNavigationBarBackgroundImage:[UIImage imageNamed:@"anniu01"]];/** * 初始化盒子 sdk **///初始化[[HeziSDKManager sharedInstance] initialize];//初始化统计分析功能 分析 app 的启动跟退出 可选功能[[HeziSDKManager sharedInstance]initializeAnalysis];// 初始化 deepLink 可选功能[[HeziSDKManager sharedInstance] initializaDeepLinks:^(HeziSDKAppLinksModel *hzLinksModel) {        NSLog(@"applinek paramsToken==%@",hzLinksModel.token);        NSLog(@"applink custome==%@",hzLinksModel.customeParams);        NSLog(@"applink uid == %@",hzLinksModel.sharerId);        //新增邀请类型 用于邀请有礼         NSLog(@"applink  invitation == %@",hzLinksModel.invitation);        //通过活动的 token 打开一个活动        [[HeziSDKManager sharedInstance]openHeziSDKActivityWithToken:[hzLinksModel token] invivationType:hzLinksModel.invitation user:@{@"username":@"4532413",@"mobile":@"18826457896"} share:^(HeziShareModel *shareContent) {            //通过 deeplink 打开活动后点击分享获取的分享内容            NSLog(@"title====%@",[shareContent title]);        } ];    }];

3. 活动埋点

  1. 触发活动的使用

  • step 1. 在客户端埋点,并且触发后在商家后台触发规则里可以找到埋点的事件,关联活动到此埋点事件。

  • step 2. 关联活动后,再次触发埋点即可看到活动页面,我是在登陆页面LoginViewController的登录方法里面添加的埋点,具体实现可以看下面的代码。

//导入HeziTrigger.h#import "HeziTrigger.h"// 登录埋点self.loginHeziTrigger = [HeziTrigger trigger:@"logged"                                    userInfo:@{@"username":@"18688885454",@"mobile":@"18688885454"}                              showIconInView:homeViewController.view                              rootController:self delegate:homeViewController];

参数说明:

  • trigger 必填,可填下列字段

  1. logged 登录埋点

  2. registered 注册埋点

  3. purchase_success 支付成功埋点

  4. 在商家后台自定义的触发行为

properties 必须的不传值则会触发不成功

提醒: 可选属性和后台活动规则相对应,如果设置了相应的活动规则,而没有传相应的字段,则埋点无法正确触发。例如后台设置了在广州的用户触发,而在埋点的时候没有传入用户所在城市这个参数,我们则无法知道哪些用户是属于广州的,则会出现埋点无法正确触发。

  1. username –唯一 id(必须)接入方自己用户体系中唯一性用户属性

  2. mobile –手机(必须)接入方自己用户体系中的手机号码

  3. nickname –昵 称 (可选)

  4. sex –性 别 (可选)

  5. province –省 份 (可选)

  6. city –城 市 (可选)

  7. price –金额(可选)

  8. custome_datas - 自定义参数 (json 字符串)

  9. extra_params  - 自定义触发条件(json字符串)

  10. defined_tags - 自定义 SDK 标签 (json 字符串)

step 3. 设置动效

// 是否隐藏半个图标,需要先开启自动靠边才行self.loginHeziTrigger.shouldHidden = YES;// 是否自动靠边,开启后拖动会自动靠边self.loginHeziTrigger.shouldBeside = YES;// 自动透明,开启后会自动变为半透明self.loginHeziTrigger.shouldTranslucent = YES;
  • step 4. 设置活动页的分享 
    分享的内容包括下面四个,获取内容后,需要用户自己实现自己的分享逻辑。

property (strong, nonatomic) NSString *title;// 标题property (strong, nonatomic) NSString *content;// 描述property (strong, nonatomic) NSString *imgUrl;// image地址property (strong, nonatomic) NSString *linkUrl;// 活动地址property (strong, nonatomic) UIView *pageView;// 活动页面 view

分享代理的使用方法:

// 添加登录埋点的代理为homeViewControllerself.loginHeziTrigger.delegate = homeViewController;

HomeViewController.h遵循HeziTriggerActivePageDelegate协议,并实现分享的代理方法

// HomeViewController.h文件遵循HeziTriggerActivePageDelegate协议interface HomeViewController : UIViewController <HeziTriggerActivePageDelegate>// HomeViewController.m文件实现代理#pragma mark - HeziTriggerActivePageDelegate- (void)heziTrigger:(HeziTrigger *)heziSDK share:(HeziShareModel *)shareContent activePage:(UIView *)activePage {    // 分享逻辑 }
  • step 5. 打开活动页的回调

另外需要注意的是关于活动触发这个过程.

在拿到开发者传入的各种数据以后,会拿相关数据请求活动.然后展示活动.

其实关于活动回调有两步,

第一步是触发活动(请求数据成功了,就会调用heziTriggerSuccess方法),

第二步是匹配活动(请求到的数据有活动).

非debug情况下。 没有匹配到活动,服务端返回的是空字符串.

debug模式下。  没有匹配到活动,服务端返回的json有error字段.

这里的debug模式指的.openDebug方法的调用传入的值.

  • 注意:sdk从2.8.0开始

  • - (void)heziTriggerSuccess:(HeziTrigger *)trigger
  • 该协议的方法被替换成了

  • - (void)heziTriggerSuccess:(HeziTrigger *)trigger triggerInformation:(id)triggerInfo;

#pragma mark - HeziSDKOpenActivePageDelegate// 活动页将要打开,返回NO会拦截。- (BOOL)heziTriggerWillOpenActivePage:(HeziTrigger *)heziSDK activityURL:(NSString *)url {    NSLog(@"%s", __FUNCTION__);    return YES;}/** - (void)heziTriggerSuccess:(HeziTrigger *)trigger 的替代方法 当触发请求服务端成功后,会回调该函数.(不管触发成功与否,只要是请求成功后都会触发该结果) 用户可以使用triggerInfo判断是否触发成功 @param triggerInfo 服务端返回的原始数据. */- (void)heziTriggerSuccess:(HeziTrigger *)trigger triggerInformation:(id)triggerInfo{NSError * error = nil;    NSData * data = [NSJSONSerialization dataWithJSONObject:triggerInfo options:NSJSONWritingPrettyPrinted error:&error];    if (!error) {            NSLog(@"heziTriggerSuccess 服务器返回:%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);        }}// 活动页已经打开- (void)heziTriggerDidOpenActivePage:(HeziTrigger *)heziSDK {    NSLog(@"%s", __FUNCTION__);}// 活动页已经关闭- (void)heziTriggerDidCloseActivePage:(HeziTrigger *)heziSDK {    //注意,默认情况下触发的图标点击后不会关闭,需要开发者调用 dismiss 方法    [heziSDK dismiss];    NSLog(@"%s", __FUNCTION__);}// 触发失败,具体是指请求服务端出错会回调.- (void)heziTirgger:(HeziTrigger *)trigger triggerError:(NSError *)error {    NSLog(@"%s", __FUNCTION__);}


  1. 投放活动的使用

  • step 1. 去后台新增活动投放,得到活动位key(也就是position_key)。

  • step 2. 添加埋点,我是在HomeViewController页面添加的埋点

// 导入HeziBanner.h#import "HeziBanner.h"// 初始化,positionKey就是上面的位置key,properties和触发活动的properties一样HeziBanner *banner = [[HeziBanner alloc] initWithPositionKey:@"bfb706d6b8" properties:@{@"username":@"13800138000",@"mobile":@"13800138000"} type:HeziBannerTypeDefault];// 设置默认图和拉伸模式,图片未加载时显示的图片[banner setPlaceholder:[UIImage imageNamed:@"banner"] model:UIViewContentModeScaleAspectFill];// 设置framebanner.frame = CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_WIDTH/2+5);// 添加到父视图[self.view addSubview:banner];
  • 在多张图的情况下,可以添加自动滚动功能,调用以下方法实现

// 第一个参数为是否开启自动滚动,第二个参数为滚动的时间间隔[banner autoScroll:YES duration:3];
  • 信息图的埋点,在tableView:cellForRowAtIndexPath:中可使用setPositionKey:properties:方法来处理,自定义的homeTableViewCell里面coverHeziBanner初始化时不使用initWithPositionKey:properties:type:方法初始化。

[cell.coverHeziBanner setPositionKey:@"5dd44fa808" properties:@{@"username":@"13800138000",@"mobile":@"13800138000"}];[cell.coverHeziBanner setPlaceholder:[UIImage imageNamed:@"img_infor"] model:UIViewContentModeScaleAspectFill];cell.coverHeziBanner.delegate = self;
  • 启动图埋点,设置type为HeziBannerTypeLaunch,并设置消失时间属性dismissTimeInterval

self.launchBanner = ({    HeziBanner *banner = nil;    NSString *key = [[NSUserDefaults standardUserDefaults]valueForKey:@"launch"];    banner = [[HeziBanner alloc] initWithPositionKey:key?key:@"aec2f815a4" properties:@{@"username":@"18688885454",@"mobile":@"18688885454"} type:HeziBannerTypeLaunch];    banner.dismissTimeInterval = 3;    banner.frame = [UIScreen mainScreen].bounds;    banner.delegate = self;    banner;});[[UIApplication sharedApplication].keyWindow addSubview:self.launchBanner];
  • step 3. 设置活动页的分享 
    分享的内容包括下面四个,获取内容后,需要用户自己实现自己的分享逻辑。

property (strong, nonatomic) NSString *title;// 标题property (strong, nonatomic) NSString *content;// 描述property (strong, nonatomic) NSString *imgUrl;// image地址property (strong, nonatomic) NSString *linkUrl;// 活动地址

回调的方式有两种,一种是用block,一种是用delegate。 
block方式的使用方法:

[banner share:^(HeziShareModel *shareContent) {    // 分享逻辑}];

代理的使用方法:

// 添加banner的代理为homeViewController,也就是自己banner.delegate = self;

HomeViewController.h遵循HeziBannerOpenActivePageDelegate协议,并实现分享的代理方法

// HomeViewController.m文件遵循HeziBannerOpenActivePageDelegate协议interface HomeViewController () <HeziBannerOpenActivePageDelegate>// HomeViewController.m文件实现代理#pragma mark - HeziBannerOpenActivePageDelegate- (void)heziBanner:(HeziBanner *)heziBanner share:(HeziShareModel *)shareContent {    // 分享逻辑}
  • step 4. 打开活动页的回调

#pragma mark - HeziBannerOpenActivePageDelegate// 活动页将要打开,返回NO会拦截。activityURL是活动的 url- (BOOL)heziBannerWillOpenActivePage:(HeziBanner *)heziBanner activityURL:(NSString *)url{   NSLog(@"%@", NSStringFromSelector(@selector(heziBannerWillOpenActivePage:)));    return YES;}// 活动页已经打开- (void)heziBannerDidOpenActivePage:(HeziBanner *)heziBanner {    NSLog(@"%@", NSStringFromSelector(@selector(heziBannerDidOpenActivePage:)));}// 用来处理启动页活动地址不存在,点击后不会消失的问题- (void)heziBanner:(HeziBanner *)heziBanner didOpenActivePageError:(NSError *)error {    NSLog(@"%@", NSStringFromSelector(@selector(heziBanner:didOpenActivePageError:)));}// 活动页已经关闭- (void)heziBannerDidCloseActivePage:(HeziBanner *)heziBanner {    NSLog(@"%@", NSStringFromSelector(@selector(heziBannerDidCloseActivePage:)));}// 判断是否有数据//banner获取数据为空,并且有错误信息的时候的回调事件-(void)heziBanner:(HeziBanner *)heziBanner loadDataError:(NSError *)error{    //banner 没请求到数据,用户需要处理 banner 隐藏/显示 跳转等逻辑}

推送功能

活动盒子支持使用第三方平台推送活动盒子的活动到客户端,要使用推送功能的商家, app 必须要接入第三方的推送 sdk, 活动盒子本身是不具备推送的能力的

现在支持的第三方推送平台列表

平台字段平台描述
HeziSDK_JPush极光推送平台
HeziSDK_GeTui个推推送平台
HeziSDK_LeanCloudleanCloud推送平台

推送流程


推送功能 api

  • 提交推送设备 id 到活动盒子

字段属性描述
registrationID第三方推送平台的推送 id
platform平台标识 HeziSDK_JPush/HeziSDK_GTui
 [[HeziSDKManager sharedInstance]configPushRegisterId:registrationID platform:HeziSDK_JPush];
  • 处理用户点击消息的页面跳转

字段属性描述
userInfo推送的消息字典对象
properties用户的信息字典对象
share活动的分享回调
 NSDictionary *params = @{@"username":@"18826457895",@"mobile":@"188216457896"};//isHzSDkMsg 是否活动盒子推送的活动 BOOL isHzMsg = [[HeziSDKManager sharedInstance]         dealWithPushMessage:userInfo properties:params share:^(HeziShareModel *shareContent) {            //打开的活动触发分享的内容                    }];        if(isHzMsg==NO){            //如果不是活动盒子推送的数据 自己处理推送的消息            }

极光推送 example

提交推送的 id 到盒子后台

//2.1.9版本新增获取registration id block接口。    [JPUSHService registrationIDCompletionHandler:^(int resCode, NSString *registrationID) {        if(resCode == 0){            //提交极光的 id 到盒子的后台            [[HeziSDKManager sharedInstance]configPushRegisterId:registrationID platform:HeziSDK_JPush];        }        else{            NSLog(@"registrationID获取失败,code:%d",resCode);        }    }];

处理用户点击极光推送的消息

// iOS 10 Support app点击消息的回调- (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]]) {        NSLog(@"活动盒子 sdk");        [JPUSHService handleRemoteNotification:userInfo];        NSDictionary *params = @{@"username":@"18826457895",@"mobile":@"188216457896"};        BOOL isHzMsg = [[HeziSDKManager sharedInstance]         dealWithPushMessage:userInfo properties:params share:^(HeziShareModel *shareContent) {            //打开的活动触发分享的内容                    }];        if(isHzMsg==NO){            //如果不是活动盒子推送的数据 自己处理推送的消息        }    }    NSNumber *badge = response.notification.request.content.badge;  // 推送消息的角标    completionHandler();  // 系统要求执行这个方法    [JPUSHService setBadge:badge.intValue-1];    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:badge.intValue-1];}

个推 / leanCloud Example

提交推送的 id 到盒子后台 
g

//提交个推注册 id 用于精准推送-(void)GeTuiSdkDidRegisterClient:(NSString *)clientId{    //获取个推的注册 id    NSLog(@"个推注册 id= %@",clientId);    [[HeziSDKManager sharedInstance]configPushRegisterId:clientId platform:HeziSDK_GTui];}//提交leanCloud id 到盒子后台用于精准推送 - (void)application:(UIApplication *)applicationdidRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {    NSString *token = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];    token = [token stringByReplacingOccurrencesOfString:@" " withString:@""];    //提交token 作为 leanCloud 的 id到盒子的后台    [[HeziSDKManager sharedInstance]configPushRegisterId:token platform:HeziSDK_LeanCloud];}

处理个推/leanCloud的推送消息

//  iOS 10: 点击通知进入App时触发- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {    NSLog(@"didReceiveNotification:%@", response.notification.request.content.userInfo);    NSDictionary *userInfo =response.notification.request.content.userInfo;    NSDictionary *params = @{@"username":@"18826457895",@"mobile":@"188216457896"};    BOOL isHzMsg = [[HeziSDKManager sharedInstance] dealWithPushMessage:userInfo properties:params share:^(HeziShareModel *shareContent) {        NSLog(@"title = %@",shareContent.title);        NSLog(@"content = %@",shareContent.content);                                                    }];    if(isHzMsg==NO){        UIAlertView *view = [[UIAlertView alloc]initWithTitle:@"个推接收到信息" message:[NSString stringWithFormat:@"%@",userInfo]  delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];        [view show];    }    // [ GTSdk ]:将收到的APNs信息传给个推统计    [GeTuiSdk handleRemoteNotification:response.notification.request.content.userInfo];    completionHandler();}

个推的透传参数处理

/**当 app在活动状态时,盒子 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];        NSDictionary *payLoadDic= [self dictionaryWithJsonString:payloadMsg];         //给信息加上信息 id 用于统计用户打开数            [payLoadDic setValue:taskId forKey:@HEZI_PUSH_MSG_ID];        if (payLoadDic) {            [self addLocalNotificationWithUserInfo:payLoadDic];        }    }    // 控制台打印日志    NSString *msg = [NSString stringWithFormat:@"taskId=%@,messageId:%@,payloadMsg:%@%@", taskId, msgId, payloadMsg, offLine ? @"<离线消息>" : @""];    NSLog(@"\n>>[GTSdk ReceivePayload]:%@\n\n", msg);}

显示通知栏消息

#pragma mark - 私有方法#pragma mark 添加本地通知-(void)addLocalNotificationWithUserInfo:(NSDictionary *)userInfo{    NSArray *keys = [userInfo allKeys];    NSString *hzTitle = nil;    NSString *hzContent = nil;    NSString *extras = nil;    NSDictionary *activityDic = nil;    if([keys containsObject:@"hzsdk_title"]){        hzTitle =  [userInfo objectForKey:@"hzsdk_title"];    }    if([keys containsObject:@"hzsdk_content"]){        //盒子 sdk 推送的通知栏内容        hzContent =  [userInfo objectForKey:@"hzsdk_content"];    }    if([keys containsObject:@"hzsdk_extras"]){        //盒子 sdk 推送的活动信息        extras =  [userInfo objectForKey:@"hzsdk_extras"];        if(extras){                   if([extras isKindOfClass:[NSString class]]){            activityDic = [self dictionaryWithJsonString:extras];        }else if([extras isKindOfClass:[NSDictionary class]]){            activityDic = extras;        }          //添加推送的 id 用于统计推送的打开数        if([keys containsObject:@HEZI_PUSH_MSG_ID]){            msgid = [userInfo objectForKey:@HEZI_PUSH_MSG_ID];        }        //添加推送的 id 用于统计推送的打开数        if(msgid){            [activityDic setValue:msgid forKey:@HEZI_PUSH_MSG_ID];        }        }    }    NSDictionary *dic = [[NSDictionary alloc] init];    dic = @{@"msgType":@"sysMsg"};    if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0 && [[UIDevice currentDevice].systemVersion floatValue] < 10.2){        UILocalNotification *notice = [[UILocalNotification alloc] init];        notice.alertTitle = hzTitle;        notice.alertBody = hzContent;        notice.alertAction = @"打开应用"; //待机界面的滑动动作提示        notice.alertLaunchImage = @"Default";//通过点击通知打开应用时的启动图片,这里使用程序启动图片//        notice.applicationIconBadgeNumber = 1;        notice.soundName = UILocalNotificationDefaultSoundName;//收        notice.userInfo = activityDic;        [[UIApplication sharedApplication] presentLocalNotificationNow:notice];    }else if([[UIDevice currentDevice].systemVersion floatValue] >= 10.0){        // 添加提醒        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];        UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];        //    content.sound = [UNNotificationSound soundNamed:@"cod_sound.caf"];        content.title =hzTitle;        content.body = hzContent;        content.sound = [UNNotificationSound defaultSound];        content.userInfo =activityDic;//        content.badge = [NSNumber numberWithInteger:1];        UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:1 repeats:NO];        UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"record" content:content trigger:nil];        [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {            NSLog(@"添加本地通知成功");        }];    }}

DeepLink功能

介绍

盒子 sdk 的 deeplink 不支持 ios 9 的Universal Linking 的功能,盒子仅以 app Scheme 的方式为活动页面提供deeplink 功能服务

APP Scheme 配置

  • 打开 info.plist

  • 找到 URL Types,没有话右键 add row 添加

  • 添加URL Scheme


创建深度链接

//生成深度链接 第一个参数表示活动原始分享链接 scheme 表示为 app 设置的 url scheme, customerParams表示用户的自定义参数  NSString *deepLinkURL = [[HeziSDKManager sharedInstance]buildDeepLinkWithUrl:shareContent.linkUrl  scheme:@"hzsdk://" customeParams:@{@"key":@"value"}];  //生成的深度链接用于 app 分享出去

解析深度链接

在 appdelegate 的didFinishLaunchingWithOptions方法中设置解析回调

//放在 initialize 方法前 // 初始化 deepLink 可选功能    [[HeziSDKManager sharedInstance] initializaDeepLinks:^(HeziSDKAppLinksModel *hzLinksModel) {        NSLog(@"applinek paramsToken==%@",hzLinksModel.token);        NSLog(@"applink custome==%@",hzLinksModel.customeParams);        NSLog(@"applink uid == %@",hzLinksModel.sharerId);        //新增邀请类型 用于邀请有礼         NSLog(@"applink  invitation == %@",hzLinksModel.invitation);        //通过活动的 token 打开一个活动        [[HeziSDKManager sharedInstance]openHeziSDKActivityWithToken:[hzLinksModel token] invivationType:hzLinksModel.invitation user:@{@"username":@"4532413",@"mobile":@"18826457896"} share:^(HeziShareModel *shareContent) {            //通过 deeplink 打开活动后点击分享获取的分享内容            NSLog(@"title====%@",[shareContent title]);        } ];    }];

在 appdelegate 的接受 url schem 的参数的相关方法中设置解析 url scheme 的方法

-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options{    //活动盒子 解析 url    [[HeziSDKManager sharedInstance]dealWithUrl:url];    return YES;}-(BOOL)application:(UIApplication*)application           openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication        annotation:(id)annotation{    //活动盒子 解析 url    [[HeziSDKManager sharedInstance]dealWithUrl:url];    return YES;}

* 获取解析的活动 token 打开活动参与*

-(void)openHeziSDKActivityWithToken:(NSString *)token   invivationType:(NSString *)invitation user:(NSDictionary *)userInfo share:(void(^)(HeziShareModel *shareContent))shareBlock


页面统计功能

1.在 appdelegate 初始化时 用上统计分享功能

[[HeziSDKManager sharedInstance]initializeAnalysis];

2.在页面的的生命周期调用

-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
//盒子页面统计功能
[[HeziSDKManager sharedInstance]onPageStart:@"首页"];
}
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
//盒子页面统计功能
[[HeziSDKManager sharedInstance]onPageEnd:@"首页"];
}

SDK标签功能使用(可选)

1.在触发或者投放功能里面添加参数即可

NSDictionary *userInfo = @{@"username":@"13800138000",@"mobile":@"13800138000",@"age":@"1",@"constellation":@"1"};
[HeziTrigger trigger:@"purchase_success"userInfo:userInfoshowIconInView:self.view rootController:selfuiEdgeInsets:UIEdgeInsetsMake(0, 0, 0, 0)delegate:self];

2.SDK标签值列表规范:SDK标签值列表规范


// 系统自带SDK标签分类

'age': '1',                           // 年龄段

'constellation ': '1',                // 星座

'education': '1',                     // 学历

'salary': '1',                        // 年收入

'interest': '1',                      // 兴趣

'industry ': '1',                     // 行业

'car ': '1',                          // 车辆

'house ': '1',                        // 住房

'marital ': '1',                      // 婚姻状况

'children ': '1',                     // 子女状况

'online_shop ': '1',                  // 网购行为

'risk_sensitivity ': '1',             // 风险敏感度

'price_sensitivity ': '1',            // 价格敏感度

'category_preferences ': '1',         // 品类偏好

'shopping_times ': '1',               // 每月购物频次

'shopping_time_preference': '12:59',  // 购物时间偏好

'max_price': '100.00',                // 单次购物最高金额

// 自定义SDK标签分类与标签值(二者必须同时存在)

'defined_category': '班级',            // 自定义标签分类

'defined_tag': '学生'                  // 自定义标签


 // 同时定义多个标签(格式必须为json字符串,键名为标签分类,键值为标签)
   'defined_tags': "{\"手机品牌\":\"华为\",\"手机型号\":\"Note10\"}"


v2.8.1新暴露的功能

此版本主要公开了

HeziSDKWebView

这个类.

此类是活动页的载体.

某些用户需要自定义某一些样式的活动页,可以使用该类的属性和方法.

下面的例子以是一种新的获取分享参数的方法,开发者这可以自己添加按钮,并将分享模型分享出去.

第一步.监听trigger的生命周期,设置活动页的代理

- (void)heziTriggerDidOpenActivePage:(HeziTrigger *)heziSDK activityPage:(HeziSDKWebView *)activePage
{   
     /*     实际项目的时候最最好判断一下     
     if (heziSDK == xxx) {          }     
     */    
     //设置活动页面的代理    
     activePage.webShareDelegate = self;
 }


第二步,webShareDelegate代理对象实现相关的代理方法.

- (void)heziSDKWebViewStartLoad:(HeziSDKWebView *)heziWebView
{    
    //do some thing 活动页准备加载
}

- (void)heziSDKWebView:(HeziSDKWebView *)heziWebView didCatchShareContent:(HeziShareModel *)model
{    
    //活动页加载完成后会自动获取分享数据,然后调用该代理方法返回分享数据
    NSLog(@"获取到分享的数据 : %@",model.linkUrl);
}


v2.9.0 版本概述


  • SDK 2.9.0 中用HZSDKWKWebview(使用的是WKWebview)替代掉了HeziSDKWebView(不再使用,因为使用的是UIWebview)

  • HeziSDKWebViewDefine 定义了HZSDKWKWebview所需scriptMessages以及userScript。有定义WKWebView的代理方法。

新版本的使用流程跟以前的版本基本上一样,替换一下有关Webview的代理方法即可。


如何自定义活动页?

用户可以自定义WKWebview的包装类,在触发活动的代理中拦截打开内置的HZSDKWKWebview,使用自定义WKWebview去展示。

自定义所需要的内容(交互的方法名)可以从HeziSDKWebViewDefine中获取

 拦截,以点击banner为例:

    //是否拦截活动跳转 
 - (BOOL)heziBannerWillOpenActivePage:(HeziBanner *)heziBanner activityURL:(NSString *)url bannerPoistion:(int)pst{
    //判断是否要自己打开活动页面
    NSLog(@"url=====>%@ bannerPosition===>%d",url,pst);
    return false; //false 拦截   true 采用默认的HZSDKWKWebview打开活动
 }

 





常见BUG


00159c1e268ca5b42a465c2875430b4

这个bug是只有刮刮卡活动才会出现,只会引起断点,不影响正常使用,直接跳过即可,在Xcode里面点击下图的这个按钮就行了。


相关问题



001596eff0df37be8166197eb06c1cd