苹果ASA⼴告投放归因的接⼊
前段时间,苹果终于在⼤陆区开放了应⽤商店的竞价⼴告。毫⽆疑问⼜开启了苹果应⽤导量的新玩法,各⼤⼚商都紧跟脚步吃螃蟹。本篇讲解苹果⼴告中的归因部分。
苹果⼴告其实在海外已运⾏多年,⽽因为IDFA的政策变动,现在苹果有新旧两套归因框架,通常我们都要接⼊。
⼀、iAd 和 AdServices 框架概述
iAd 框架:适⽤于iOS14.3以下版本,基于IDFA,需要⽤户允许使⽤IDFA。尤其iOS14.0起,IDFA的政策变动,要接⼊ATT追踪框架。
归因流程:打开APP -> 调⽤iAd框架 -> 读取⼴告因素(JSON) -> 发送⼴告因素到后端 -> 发送激活⽇志到后端
AdServices 框架:适⽤于iOS14.3及以上版本,不需⽤户授权。
归因流程:打开APP -> 调⽤AdServices框架 -> 读取token -> 发送token到苹果后端换取⼴告因素(JSON) -> 发送⼴告因素到后端 -> 发送激活⽇志到后端
两框架在流程上区别不⼤,得到数据也类似,主要区别是AdServices只有ID,没有具体的名字。详细JSON字段:
两套框架都要接,详细区别不⼤,主要是跟iOS版本相关
区别iAd AdServices
归因窗⼝期30天30天
ATT影响⽀持ATT Opt-In不影响
归因误差率15%-70%不等10%左右或更低
数据延迟三⽅MMP数据称3秒内返回结果⽐例⼤于50%三⽅MMP数据称延迟0.5-1秒
参数丰富度较全较少(只返回ID)
是否⽀持展⽰归因和指纹信息归因不⽀持不⽀持
是否⽀持⾮AppStore上架APP(越狱包)不⽀持不⽀持
▲▲▲⾼版本(14.5+)的idfa获取,要等待弹窗被⽤户授权后才能得到,所以需要延迟调⽤⼴告归因和激活⽇志:
+(void)initSDK{
//... ...
//苹果ASA;延迟4秒再发送,等ATT⽤户操作结果,可能有IDFA
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[MySDK LogAds];
});
//激活⽇志;延迟6秒再发送,先让Ads发送完再发
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(6 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[MySDK LogOpen];
});
//... ...
}
⼆、与第三⽅⼴告的归因的区别
1、第三⽅⼴告(如头条快⼿)使⽤的是⼴告点击的监测短链,由⼴告商回传给我们后台;苹果采⽤的是iAd和AdServices,由接⼊的苹果SDK发送参数到我们后台;
第三⼴告的监测短链⽰例:
host/ad/toutiao/click?adkey=abcde&idfa=__IDFA__&ip=__IP__&os=__OS__&callback=__CALLBACK__
苹果ASA的客户端回传⽰例:
host/ad/asa/click?idfa=xxxx&orgId=1234&campaignId=123456&adGroupId=12345
6&keywordId=12345678
(注意客户端回传的参数,若没有增加IP地址的参数,则需要服务端读取请求者的IP地址,以作归因参数)
2、第三⽅⼴告在点击时回传,苹果⼴告在应⽤打开时回传;
3、第三⽅⼴告使⽤⾃定义的adkey作为⼴告依据,苹果⼴告建议使⽤苹果的⼴告组ID(adGroupId)作为后台⼴告依据;
⼴告组ID可以在的右上⾓查看,如图
⾃⼰BI后台的⼴告列表⽰例:
⼴告序号⼴告名称应⽤渠道adKey标识⼴告短链渠道⼴告ID
12323头条⼴告001游戏A头条1abcde host/...(⽆)
12324苹果⼴告001游戏A苹果1123456
三、苹果端SDK的接⼊
1、准备条件,开发环境 Xcode12.3+,MacOS11+。如果版本不满⾜,则需更新开发软件(和系统)。
2、接⼊⽅法,添加iAd到Xcode项⽬:
1)选择项⽬主⽂件 > TARGETS > General
2)引⼊ iAd.framework、AdServices.framwork、AdSupport.framwork
3)进⼊ Link Binary With Libraries,将上述3个框架都改为Optional
4、代码 MySDK.m(Objective-C)
/** 导⼊上述3个框架*/
#import <iAd/iAd.h>
#import <AdServices/AdServices.h>
#import <AppTrackingTransparency/AppTrackingTransparency.h>
/** 苹果Ads⼴告*/
/** TODO:有些旧设备新系统(iPhone8),会出现token为空的问题*/
+(void)LogAds{
// 14.3之后
if (@available(iOS 14.3, *)) {
NSError *error;
NSString *token = [AAAttribution attributionTokenWithError:&error];
NSLog(@"LogAds:AdServces,Token: %@", token);
if (token != nil) {
// 1、发送POST给苹果得到归因数据
[MySDK sendToken:[MySDK getANullableString:@"token" content:token] completeBlock:^(NSDictionary *attrData) { //异步,会延后
NSLog(@"LogAds:14.3+ Dict: %@", attrData);
//TODO::发送数据给服务端
// ... ...
}];
}
// 14.3之前
} else {
if ([[ADClient sharedClient] respondsToSelector:@selector(requestAttributionDetailsWithBlock:)]) {
NSLog(@"LogAds:iAd called");
[[ADClient sharedClient] requestAttributionDetailsWithBlock:^(NSDictionary *attrData, NSError *error) { //异步,会延后
NSLog(@"LogAds:14- Dict: %@", attrData);
//TODO::发送数据给服务端
// ... ...
}];
}
}
}如何当好中层干部
幕布材质/** 读取可能为空的字符串*/
+(nullable NSString *)getANullableString:(NSString *)desc content:(NSString *)content{
if(content == nil){
return@"";
}
return [NSString stringWithFormat:@"%@", content];
}
/** 发送归因token得到数据 */
+(void)sendToken:(NSString *)token completeBlock:(void(^)(NSDictionary* data))completeBlock{
NSString *url = [NSString stringWithFormat:@"api-adservices.apple/api/v1/"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:url]];
request.HTTPMethod = @"POST";立夏祝福语
[request addValue:@"text/plain" forHTTPHeaderField:@"Content-Type"];
NSData* postData = [token dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:postData];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { NSDictionary * result = NULL;
if (error) {
//请求失败方脸型与发型的搭配
NSLog(@"LogAds:sendToken ERR");
if (completeBlock) {
NSMutableDictionary *nulldict = [NSMutableDictionary dictionary];
completeBlock(nulldict);
}
}else{
// 请求成功
NSError *resError;
NSMutableDictionary *resDic = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&resError];
result = [[NSDictionary alloc] initWithDictionary:resDic];
十月份适合去哪里旅游火化if (completeBlock) {
completeBlock(result);
}
}
}];
[dataTask resume];
}
⾄此,苹果ASA的⼴告归因接⼊告⼀段落
待后台对接好⼴告归因逻辑代码,苹果包上架应⽤商店,就可以了。
附:IDFA的新旧版本的接⼊
#import <AppTrackingTransparency/AppTrackingTransparency.h>
-(void)initSDK{
//... ...
//IDFA iOS14不同⽅式
if (@available(iOS 14, *)) {
// iOS14及以上版本需要先请求权限
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
// 获取到权限后,依然使⽤⽼⽅法获取idfa
// iOS14以后,idfa在回调之后才能获得,应当等回调后再发送⽇志
if (status == ATTrackingManagerAuthorizationStatusAuthorized) {
self->_idfa = [[ASIdentifierManager sharedManager].advertisingIdentifier UUIDString];
}
}];
}else{
_idfa = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
}
//... ...
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论