GMP 资源位 SDK 是 GMP 对外提供的资源位数据管理的 SDK 。
资源位 SDK 主要提供两种接入方式
用户调用 API 接口,获取 GMP 资源位配置数据,自行处理视图渲染、交互监听,在交互变化时通知 SDK。
SDK 内部完成一系列流程,包括 请求配置、数据处理、视图渲染(banner 视图的样式)、图片缓存、交互监听、事件上报。
需提供 iOS 应用包名和开发者 team id,然后在 GMP 后台配置(管理中心-消息管理-客户端SDK-鉴权配置),需保证与 app 的实际信息一致,可联系您的客户端开发人员获取。该项配置用于接口的安全鉴权校验,不会用于其他用途。
示例如下:
team id:55XXXX22XX bundle id:com.example.gmp
在 GMP 控制台中配置 APP 的鉴权信息
iOS 鉴权所需的配置信息以及获取方式如下
team id 需要在苹果开发者后台上获取,在账号页面下滑,找到会员资格详细信息,其中的团队 ID 就是 team id
iOS 工程上的 bundl identifier
注意
资源位 SDK 集成 Demo,可参考 https://www.volcengine.com/docs/6315/1130446
Demo 需要在初始化时配置对应的参数才能获取到对应的数据
资源位 SDK 依赖 Finder SDK 进行数据回流,在使用资源位 SDK 前,请确保已经集成了 Finder SDK,并且 Finder SDK 版本在 6.15.2 以上。
Finder iOS SDK接入指南地址:Finder接入
推荐使用 cocoapods 集成资源位 SDK,在 Podfile 中,引入 SDK,并执行pod install --repo-update
更新Pods
iOS 弹窗、资源位 SDK 版本记录
//需要额外添加一个这两个source source 'https://github.com/CocoaPods/Specs.git' source 'https://github.com/volcengine/volcengine-specs.git' pod 'GMPReachSDK', '请到版本记录获取最新版本', :subspecs => [ 'Popup', 'Resource', 'Core', 'Finder' #数据上报功能子库,当引入此子库时,SDK 会默认使用 Finder SDK 来进行数据上报和获取 id,若不使用 Finder SDK 上报数据,可不引入此库,但需要自己实现数据上报功能,详见 4.2其他平台uba配置部分 ]
推荐您远程引入SDK。如特殊情况需要手动引入,请补充阅读本小节。
请在 iOS 弹窗、资源位 SDK 版本记录 下载对应版本文件,然后将下载好的文件解压后拉入项目工程中即可
说明
如果您的工程中未引入 SDWebImage 库,还需下载以下文件,并且解压后拖入到项目工程中
在gmp首页,点击右上角头像-项目管理,即可进入项目后台页查看对应项目的项目id和应用id(项目id是初始化资源位sdk的appid,应用id是用于初始化Finder SDK的appid)
进入火山引擎控制台,点击右上角头像 icon,红框中的账号 ID 即是 mainAccountId
首先您需要初始化 Finder SDK,具体可参考:初始化 Finder SDK - 火山引擎
在初始化的地方导入 GMPReachSDK.h
,建议在 appdelegate.m
的 didFinishLaunchingWithOptions
方法中进行资源位 SDK 的初始化。
注意
如果您的app中涉及隐私弹窗协议,请在同意隐私协议之后进行 SDK 初始化
#import <GMPReachSDK/GMPReachSDK.h> - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { GMPReachConfig *reachConfig = [[GMPReachConfig alloc] init]; reachConfig.appId = @"{{APPID}}"; // GMP 项目ID reachConfig.host = @"{{host}}"; // 私有化部署域名 reachConfig.enableLog = YES; // 是否打开日志 reachConfig.teamId = @"XXXXXXXX"; // 开发者账号 teamid,从苹果开发者后台获取,请确保与 GMP 平台上配置的一致 //如果项目支持自动登陆,用户画像已经存在,需要提前设置上 reachConfig.uuid = @"uuid"; reachConfig.uuidType = @"uuid_type"; // 设置资源位的缓存等级 GMPResourceManager.sharedManager.cacheLevel = GMPResourceCacheLevelAllCache; [GMPResourceManager startWithConfig:reachConfig]; }
注意
如果您的app中涉及隐私弹窗协议,请在同意隐私协议之后进行 SDK 初始化
#import <GMPReachSDK/GMPReachSDK.h> - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { GMPReachConfig *reachConfig = [[GMPReachConfig alloc] init]; reachConfig.appId = @"{{APPID}}"; // GMP 项目ID reachConfig.enableLog = YES; // 是否打开日志 reachConfig.mainAccountId = @"{{MainAccountId}}"; // SaaS 火山引擎账号 id reachConfig.teamId = @"XXXXXXXX"; // 开发者账号 teamid,从苹果开发者后台获取,请确保与 GMP 平台上配置的一致 //如果项目支持自动登陆,用户画像已经存在,需要提前设置上 reachConfig.uuid = @"uuid"; reachConfig.uuidType = @"uuid_type"; // 设置资源位的缓存等级 GMPResourceManager.sharedManager.cacheLevel = GMPResourceCacheLevelAllCache; [GMPResourceManager startWithConfig:reachConfig]; }
ReachConfig 详细配置如下
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
appId | NSString | 是 | GMP 项目ID,获取方法见 3.1.1 |
host | NSString | 是 | 私有化部署的域名(SaaS 环境下无需设置此属性) |
enableLog | BOOL | 否 | 是否打开日志 |
uuid | NSString | 否 | 用户id,若初始化 SDK 时已存在自有帐号体系的用户 id,则需传入自有帐号体系用户 id,否则传空 |
uuidType | NSString | 否 | 自有帐号体系的用户 id 在 cdp 上对应的 id code |
enableLog | BOOL | 否 | 是否打开日志 |
teamId | NSString | 是 | 开发者账号 teamid,从苹果开发者后台获取,请确保与 GMP 平台上配置的一致 |
mainAccountId | NSString | 是 | saas 环境下必须传入,获取方法详见 3.1.2 |
ubaInstance | id |
否 | 设置finder配置,如无特殊需求可不传入 |
以下是资源位 SDK 需要传入的参数
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
reachConfig | GMPReachConfig | 是 | 触达配置 |
如您的产品中有账户体系,请在用户登录后立即设置 uuid,以保证用户登录前后口径一致性。Finder SDK 登陆态变化可参考:Finder SDK 登陆态变化
除此之外,您还需要及时通知资源位SDK用户画像的变化
警告
在SDK版本 >= 2.1.0 之后,更新用户画像只能通过手动更新,旧版升级上来的请改成手动更新模式
注意 : 务必在 BDAutoTrack.setCurrentUserUniqueID 设置前调用手动更新
2.1.0 以下版本需要为 ReachConfig 增加以下配置:
GMPReachConfig *reachConfig = [[GMPReachConfig alloc] init]; // 设置自动更新 uuid 为关闭 reachConfig.isAutoUpdateUserId = NO; // ...省略其他配置... [GMPResourceManager startWithConfig:reachConfig];;
以下配置在各个SDK版本均要配置
登录用户
// uuid: 自有账号体系 id // uuidType: 自有账号体系 id 类型,需要在 CDP 平台上查看对应的 id code [GMPResourceManager updateUUID:@“uuid” uuidType:@"uuidType"];
退出登录
// uuid , uuid type 填空字符串 [GMPResourceManager updateUUID:@“” uuidType:@""]; [BDAutoTrack clearUserUniqueID]
若使用 Finder SDK 进行数据上报,则无需关注此部分。若确认不使用 Finder SDK 上报数据,而是使用自己的 UBA 库进行数据上报,则需自行实现 UBA 上报能力,并注入到 SDK 中
// 首先需要实现 GMPUBAInterface 接口 @interface UBAImplement : NSObject <GMPUBAInterface> @end @implementation UBAImplement - (instancetype)init { if (self = [super init]) { // 在 UBA 事件发生时应调用 GMPPopupManager consumeEvent 方法通知事件发生 [[BDAutoTrack sharedTrack] setEventHandler:^BDAutoTrackEventPolicy(BDAutoTrackDataType type, NSString * _Nonnull event, NSMutableDictionary<NSString *, id> * _Nonnull properties) { [GMPPopupManager consumeEvent:event params:properties]; return BDAutoTrackEventPolicyAccept; } forTypes:BDAutoTrackDataTypeAll]; } return self; } - (NSDictionary *)getCommonParams { // 返回 UBA 额外参数,会附加于 SDK 请求中,需传入 appid 即可 return @{ @"finder_app_id": @([[BDAutoTrack appID] integerValue]) }; } - (NSString *)getDid { // 返回 UBA 的唯一设备标识,若无返回 nil 即可 return [BDAutoTrack rangersDeviceID];; } - (NSString *)getBaseId { // 返回 UBA 的唯一用户标识,若无返回 nil 即可 return [BDAutoTrack ssID]; } - (BOOL)eventV3:(NSString *)event params:(NSDictionary *)params { // 使用 UBA 的事件上报接口进行事件上报 return [BDAutoTrack eventV3:event params:params]; } @end
// 完成自定义 UBA 类实现后,需要在 SDK 初始化时将 UBA 实例传入 GMPReachConfig GMPReachConfig *reachConfig = [[GMPReachConfig alloc] init]; reachConfig.ubaInstance = [[UBAImplement alloc] init];
说明
资源位SDK内置了兜底缓存 & 用户缓存的双重缓存逻辑 (兜底缓存为gmp前端配置的兜底素材,用户缓存为上一次拉取该资源位id返回的素材),其中用户缓存优先级大于兜底缓存,在网络异常/gmp服务端异常时会读取本地缓存或兜底素材作为对应资源位id的返回,如果接入方本身具有兜底能力可以在接入时设置资源位的缓存等级
缓存等级 | 策略 |
---|---|
GMPResourceCacheLevelNoneCache | 不开启缓存 |
GMPResourceCacheLevelDefaultResourceCache | 只开启兜底缓存 |
GMPResourceCacheLevelLastRequestCache | 只开启用户缓存(缓存上一次请求的素材) |
GMPResourceCacheLevelAllCache | 开启所有缓存,若不设置缓存等级,默认使用此策略 |
代码示例
// 设置资源位的缓存等级 GMPResourceManager.sharedManager.cacheLevel = GMPResourceCacheLevelAllCache;
通过 SDK 生成资源位视图,并根据 resourceId 填充资源位数据,视图的位置尺寸由用户定义
属性变量名称 | 属性含义 |
---|---|
autoScrollTimeInterval | 轮播时间间隔,单位为秒(s),默认为5s |
autoScroll | 自动轮播,默认YES |
placeholderImage | 轮播视图为空的默认错误占位图 |
imageViewContentMode | 图片的填充模式,包括轮播图以及没有轮播图时的背景图 |
currentPageIndicatorImage | pageControl 选中时的图片 |
normalPageIndicatorImage | pageControl 未选中时的图片 |
currentPageIndicatorColor | 非图片模式pageControl 选中的颜色 |
normalPageIndicatorColor | 非图片模式pageControl 未选中的颜色 |
currentPageIndicatorSize | pageControl 选中时的大小 |
normalPageIndicatorSize | pageControl 未选中时的大小 |
pageIndicatorSpaing | pageControl 间距大小 |
isShowPageControl | 是否显示pageControl |
在需要的位置调用资源位视图的初始化方法并加载指定资源位 id,示例
#import <GMPReachSDK/GMPReachSDK.h> GMPResourceView *resourceView = [[GMPResourceView alloc] init]; resourceView.delegate = self; [resourceView loadResource:@"resource_id"];
加载资源位数据方法介绍
/** * 加载资源位数据 * @param resourceID 资源位 id */ - (void)loadResource:(nonnull NSString *)resourceID;
资源位回调方法
在创建资源位视图后,设置资源位视图的代理 resourceView.delegate = self
,可在代理中实现以下代理方法监听,resourceView 的数据请求状态,resourceView 的交互行为。
/** * 资源位数据加载成功 * * @param resourceView 资源位视图 */ - (void)resourceDataLoadSuccess:(GMPResourceView *)resourceView; /** * 资源位数据加载失败 * * @param resourceView 资源位视图 * @param error 错误对象 */ - (void)resourceDataLoadFailed:(GMPResourceView *)resourceView error:(NSError *)error; /** * 资源位帧位展示 * * @param resourceView 资源位视图 * @param index 展示到第几个帧位 */ - (void)resourceView:(GMPResourceView *)resourceView didScrollToIndex:(NSInteger)index; /** * 资源位点击 * * @param resourceView 资源位视图 * @param navigateUrl 跳转链接 */ - (BOOL)resourceView:(GMPResourceView *)resourceView didClickNavigateUrl:(NSString *)navigateUrl;
说明
说明:为避免闪屏网络请求对启动的阻塞,每次闪屏拉取都是 先取上一次成功的缓存渲染,再默默拉取最新资源位缓存到本地
字端 | 说明 | 类型 |
---|---|---|
imageContentMode | 作用于图片类型资源位填充模式,默认值 UIViewContentModeScaleToFill | enum |
#import <GMPReachSDK/GMPReachSDK.h> GMPSplashView *splashView = [[GMPSplashView alloc] initWithRootViewController:rootVC]; splashView.delegate = self; [splashView loadResource:@"resource_id"];
闪屏页方法回调
@protocol GMPSplashViewDelegate <NSObject> /** * 启动页数据加载成功 * * @param splashView 启动页视图 * @param resourceData 资源位数据 */ - (void)splashView:(GMPSplashView *)splashView resourceLoadSuccess:(GMPResourceData *)resourceData; /** * 启动页数据加载失败 * * @param splashView 启动页视图 * @param error 错误信息 */ - (void)splashView:(GMPSplashView *)splashView resourceLoadFailed:(NSError *)error; /** * 启动页点击 * * @param splashView 启动页视图 * @param url 跳转链接 * * @return 是否自行处理跳转链接 YES:自行处理 NO:SDK 默认处理 */ - (BOOL)splashView:(GMPSplashView *)splashView didClick:(NSString *)url; /** * 启动页展示成功 * * @param splashView 启动页视图 * @param resourceData 素材数据 */ - (void)splashView:(GMPSplashView *)splashView showSuccess:(GMPResourceData *)resourceData; /** * 启动页展示成功 * * @param splashView 启动页视图 * @param error 错误信息 */ - (void)splashView:(GMPSplashView *)splashView showFailed:(NSError *)error; /** * 启动页展示成功 * * @param splashView 启动页视图 * @param resourceData 资源位数据 */ - (void)splashView:(GMPSplashView *)splashView showFinished:(GMPResourceData *)resourceData;
仅提供资源位数据
属性名 | 类型 | 含义 |
---|---|---|
resourceID | NSString | 资源位 id |
items | NSArray |
资源位下所有帧位集合 |
属性名 | 类型 | 含义 |
---|---|---|
resourceID | NSString | 所属资源位 id |
frameID | NSArray |
资源位下所有帧位集合 |
materialID | NSString | 素材 id |
type | GMPResourceItemType | 素材类型
|
text | NSString | 文本 |
imageUrl | NSString | 图片链接 |
navigateUrl | NSString | 跳转链接 |
customizeInfo | NSArray |
自定义类型资源位内容合集 |
extra | NSString | 扩展json字段 用于存放和具体资源位类型关系比较大的信息 比如闪屏页存倒计时 |
属性名 | 类型 | 含义 |
---|---|---|
customizeType | NSInteger | 自定义类型
|
text | NSString | 文本 |
imageUrl | NSString | 图片url |
navigateUrl | NSString | 素材点击跳转链接url |
fieldName | NSString | 自定义字端参数名称 |
fieldShowName | NSString | 自定义字显示名称 |
resourcesCollectionIds | NSArray |
内容合集 |
在需要拉取资源位数据的页面导入对应的 .h 文件
根据 resourceId(资源位id)获取对应的资源位数据,相关 api 如下
/** * 请求单个资源位数据 * * @param resourceID 资源位 id * @param success 请求成功回调 * @param failure 请求失败回调 */ + (void)resourceDataWithResourceID:(NSString *)resourceID success:(void(^)(GMPResourceData *resourceData))success failure:(void(^)(NSError *error))failure; /** * 请求多个资源位数据 * * @param resourceIDs 一组资源位 id * @param success 请求成功回调 * @param failure 请求失败回调 */ + (void)resourceDataWithResourceIDs:(NSArray<NSString *> *)resourceIDs success:(void(^)(NSArray<GMPResourceData *> *resourceDatas))success failure:(void(^)(NSError *error))failure;
使用示例
// 请求资源位数据 [GMPResourceManager resourceDataWithResourceID:@"resourceID" success:^(GMPResourceData* resourceData) { // 请求数据成功回调 } failure:^(NSError* error) { // 请求数据失败回调 }];
说明
我们推荐您使用sdk渲染的方式接入闪屏页,但如果存在某些定制化接入的需求可以参考下列方法获取闪屏页配置信息并完成自渲染和数据上报
下列为 GMPResourceItem 类获取闪屏页配置的方法
字段名 | 类型 | 含义 |
---|---|---|
getCountDown | NSInteger | 获取素材配置的倒计时,单位为s,如果不存在则默认返回-1 |
getValidDate | NSInteger | 获取素材失效时间戳,单位为ms,如果不存在该字段则默认返回-1 |
使用示例
NSInteger countDown = [resourceItem getCountDown];// 获取倒计时 double validDate = [resourceItem getValidDate];// 获取素材失效时间戳 if (vaildDate != -1 && vaildDate < [[NSDate date] timeIntervalSince1970] * 1000) { // 素材失效 } //素材未失效 if(countDown != -1) { // 设置倒计时数据 }
埋点上报相关方法,请在对应的资源位帧位展示成功、失败和点击时调用 GMPBannerTracker
对应的类方法进行上报。
#import <GMPReachSDK/GMPReachSDK.h> /// 资源位展示成功埋点 /// @param resourceItem 展示成功的帧位对象 + (void)trackerForResourceShowSuccess:(GMPResourceItem *)resourceItem; /// 资源位展示失败埋点 /// @param resourceItem 展示失败的帧位对象 /// @param errorMessage 错误信息 + (void)trackerForResourceShowFailed:(GMPResourceItem *)resourceItem errorMessage:(NSString *)errorMessage; /// 素材点击埋点 /// @param resourceItem 被点击素材的帧位对象 /// @param errorMessage 错误信息 /// @param isClickUrl 是否跳转链接 + (void)trackerForItemClick:(GMPResourceItem *)resourceItem errorMessage:(NSString *)errorMessage isClickUrl:(BOOL)isClickUrl;
示例:
#import <GMPReachSDK/GMPReachSDK.h> /// 资源位展示成功埋点 [GMPResourceTracker trackerForResourceShowSuccess:resourceItem]; /// 资源位展示失败埋点 [GMPResourceTracker trackerForResourceShowFailed:resourceItem errorMessage:errorMessage]; /// 素材点击埋点 [GMPResourceTracker trackerForItemClick:resourceItem errorMessage:errorMessage isClickUrl:YES];
算法资源位是通过算法推荐结合用户的行为偏好数据,实现个性化的资源位物料下发
属性名 | 类型 | 含义 |
---|---|---|
resourceId | NSString | 算法资源位id |
spm | NSString | SPM(Super Position Model)全称超级位置模型,主要用于标识行为发生的位置。SPM位置编码由A/B/C/D四段构成,各分段分别代表 A:业务, B:页面, C:页面区块, D:区块内点位。段之间用$##$分隔,即A$##$B$##$C$##$D,spm各段建议传明文。某一段为空时直接传空字符串,如第二段为空, 则传“A$##$$##$C$##$D”。 |
contextItemId | NSString | 算法资源位的推荐类型为相关推荐时,传入 GMPRecResourceItem 的 contentId |
contextItemType | NSString | 算法资源位的推荐类型为相关推荐时,传入 GMPRecResourceItem 的 recContentType |
page | NSInteger | 推荐列表页数(默认为0,轮播可以不传) |
属性名 | 类型 | 含义 |
---|---|---|
resourceID | NSString | 资源位id |
items | NSArray< GMPRecResourceItem> | 素材列表 |
resourceType | GMPRecResourceType(枚举) | 算法资源位类型(BANNER:轮播 RECOMMENDED_LIST:推荐列表) |
属性名 | 类型 | 含义 |
---|---|---|
resourceID | NSString | 资源位id |
materialID | NSString | 素材id |
frameID | NSString | 帧位id |
title | NSString | 素材标题,对应物料上传的item_title |
type | NSString | 素材类型,对应物料上传的itemType |
customizeInfo | NSDictionary | 素材数据,对应物料上传的json内容 |
resourceType | GMPRecResourceType(枚举) | 算法资源位类型(BANNER:轮播 RECOMMENDED_LIST:推荐列表) |
recParams | GMPRecParams | 算法资源位请求参数 |
GMPRecParams *params = [[GMPRecParams alloc] init]; params.resourceId = @"currentRecListId"; params.contextItemId = @"contextItemId"; params.contextItemType = @"currentRecType"; params.spm = @"spm"; params.page = 1;
[GMPResourceManager getRecResource:params success:^(GMPRecResourceData * _Nonnull resourceData) { // 成功回调 } failure:^(NSError * _Nonnull error) { // 失败回调 }];
GMPRecParams *params = [[GMPRecParams alloc] init]; params.resourceId = @"currentRecListId"; params.contextItemId = @"contextItemId"; params.contextItemType = @"currentRecType"; params.spm = @"spm"; params.page = newpage;, [GMPResourceManager getRecResource:params success:^(GMPRecResourceData * _Nonnull resourceData) { // 成功回调 } failure:^(NSError * _Nonnull error) { // 失败回调 }];
埋点上报相关方法,请在对应的资源位帧位展示成功、失败和点击时调用 GMPBannerTracker
对应的类方法进行上报。
#import <GMPReachSDK/GMPReachSDK.h> /// 资源位展示成功埋点 /// @param resourceItem 展示成功的帧位对象 + (void)trackerForResourceShowSuccess:(id<GMPResourceBaseItem>)resourceItem; /// 资源位展示失败埋点 /// @param resourceItem 展示失败的帧位对象 /// @param errorMessage 错误信息 + (void)trackerForResourceShowFailed:(id<GMPResourceBaseItem>)resourceItem errorMessage:(NSString *)errorMessage; /// 素材点击埋点 /// @param resourceItem 被点击素材的帧位对象 /// @param errorMessage 错误信息 /// @param isClickUrl 是否跳转链接 + (void)trackerForItemClick:(id<GMPResourceBaseItem>)resourceItem errorMessage:(NSString *)errorMessage isClickUrl:(BOOL)isClickUrl; /// 素材停留时长 /// @param resourceItem 帧位对象 /// @param duration 停留时长 + (void)trackerForStayDuration:(id<GMPResourceBaseItem>)resourceItem duration:(NSInteger)duration;
示例:
#import <GMPReachSDK/GMPReachSDK.h> /// 资源位展示成功埋点 [GMPResourceTracker trackerForResourceShowSuccess:resourceItem]; /// 资源位展示失败埋点 [GMPResourceTracker trackerForResourceShowFailed:resourceItem errorMessage:errorMessage]; /// 素材点击埋点 [GMPResourceTracker trackerForItemClick:resourceItem errorMessage:errorMessage isClickUrl:YES]; /// 素材停留时长 [GMPResourceTracker trackerForStayDuration:resourceItem duration:duration];
错误码 | 错误信息 | 错误原因 |
---|---|---|
400 | param empty | 参数错误,请检查 sdk 是否正常初始化,是否存在参数漏出传 |
500 | Server error | 服务器异常 |
100001 | network error | 设备网络异常 |
100002 | json serializa error | Json 序列化异常 |
100003 | resource id empty | 请求的资源位 id 为空 |
100004 | resource is empty | 资源位数据为空,请检查资源位配置和资源位 id 是否正确 |
100005 | render error | 资源位 sdk 渲染错误,不支持的渲染类型 |
100006 | authorization error | 鉴权失败 |
200001 | resource expire | 资源位过期资源位过期 |
200002 | resource download failed | 资源位素材下载失败 |
日志过滤"GMPResource"查看是否有资源位初始化完成日志
检查初始化配置是否正确,可在日志中过滤"GMPResource"查看错误日志,或者抓包查看请求是否成功响应