苹果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发送参数到我们后台;
第三广告的监测短链示例:
https://api.myhost.com/ad/toutiao/click?adkey=abcde&idfa=__IDFA__&ip=__IP__&os=__OS__&callback=__CALLBACK__
苹果ASA的客户端回传示例:
https://api.myhost.com/ad/asa/click?idfa=xxxx&orgId=1234&campaignId=123456&adGroupId=123456&keywordId=12345678
(注意客户端回传的参数,若没有增加IP地址的参数,则需要服务端读取请求者的IP地址,以作归因参数)
2、第三方广告在点击时回传,苹果广告在应用打开时回传;
3、第三方广告使用自定义的adkey作为广告依据,苹果广告建议使用苹果的广告组ID(adGroupId)作为后台广告依据;
广告组ID可以在苹果投放后台的右上角查看,如图
自己BI后台的广告列表示例:
广告序号 | 广告名称 | 应用 | 渠道 | adKey标识 | 广告短链 | 渠道广告ID |
12323 | 头条广告001 | 游戏A | 头条1 | abcde | https://api.myhost.com/... | (无) |
12324 | 苹果广告001 | 游戏A | 苹果1 | 123456 |
三、苹果端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:有些旧设备新系统,会出现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:@"https://api-adservices.apple.com/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];
}
//... ...
}
苹果ASA广告投放归因的接入的更多相关文章
- 如何科学衡量广告投放效果?HMS Core分析服务助您科学归因
日益多元化的广告形式以及投放成本的不断攀升,让广告主们更加关注每一次广告投放带来的实际价值. 然而,广告主一般仅能从平台获得展示.点击.下载等前端效果字段,实际的用户注册.激活等后端深度转化指标并无法 ...
- 苹果搜索广告后台大揭秘,最全最细致详解,手把手设置教程「后附官方视频」-b
WWDC2016 搜索广告分会视频和 PPT 发布了,ASO100 带开发者第一时间了解 Search Ads 后台设置(文末有原声视频). 首先介绍一下搜索广告的模式和竞价规则 广告模式为 CPT( ...
- 广告投放效果难判断?集成华为DTM为您轻松实现!
在进行广告投放时,你是否遇到这样的困扰: 花了一大笔预算去投放推广,不知道实际效果如何? 用户看到投放的广告,产生了哪些有价值的行为? 当前广告投放的渠道和类型等投放策略,是否需要调整? 此时我们就需 ...
- 移动互联网广告 - 第十更 - 广告投放运营 DashBoard - 2016/12/10
广告投放运营 DashBoard设计 移动互联网互联网广告投放,数据监控DashBoard,基础样例示意,下图仅供参考(来自于互联网).
- a bitwise operation 广告投放监控
将随着时间不断增大的数字N个依次编号为1到N的N个球,颜色每次随机为红黑蓝,时间上先后逐个放入篮子中,计算离现在最近的24个球的红.黑.蓝颜色数 广告投放监控 a bitwise operation ...
- 腾讯公司数据分析岗位的hadoop工作 线性回归 k-means算法 朴素贝叶斯算法 SpringMVC组件 某公司的广告投放系统 KNN算法 社交网络模型 SpringMVC注解方式
腾讯公司数据分析岗位的hadoop工作 线性回归 k-means算法 朴素贝叶斯算法 SpringMVC组件 某公司的广告投放系统 KNN算法 社交网络模型 SpringMVC注解方式 某移动公司实时 ...
- RTB--Real TimeBidding模式的互联网广告(实时竞价的广告投放)
RTB(real time bidding)实时竞价允许广告买家根据活动目标.目标人群以及费用门槛等因素对每一个广告及每次广告展示的费用进行竞价.竞价成功后获得广告展示机会,在展示位置上展示广告. 其 ...
- Facebook 广告投放相关概念简介(1)
本文不涉及具体代码实现,仅对开发API的前置内容做简单介绍,想参考代码请绕行! 广告主(广告管理工具) ·需要推广自己的应用.网站.主页,所以有了广告管理工具 . ·一个广告主仅可拥有一个广告账户(可 ...
- 【Tableau】电商广告投放的地域分析
分析师的职责是利用处理数据获取信息,提炼规律,帮助企业正确决策业务方向. 所以,一个好的分析师绝不能被数据所困,既要深入业务,理解业务,也要高瞻远瞩,以领导者的思维借助数据分析的辅助做出判断. [结构 ...
随机推荐
- postman之get请求
get请求:
- 算法竞赛中的常用JAVA API :HashSet 和 TreeSet(转载)
算法竞赛中的常用JAVA API :HashSet 和 TreeSet set set容器的特点是不包含重复元素,也就是说自动去重. HashSet HashSet基于哈希表实现,无序. add(E ...
- 适配Android4.4~Android11,调用系统相机,系统相册,系统图片裁剪,转换文件(对图片进行上传等操作)
前言 最近Android对于文件的许多方法进行了修改,网络上又没有对Android4到Android11关于系统相机.系统相册和系统裁剪的适配方案,我花了几天事件总结了一下,先上源码 DEMO源码 先 ...
- SpringCloud升级之路2020.0.x版-15.UnderTow 订制
本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 我们使用 Spri ...
- pikachu PHP反序列化 XXE SSRF
PHP反序列化在理解这个漏洞前,你需要先搞清楚php中serialize(),unserialize()这两个函数. 另外这个漏洞一般是在代码审计的时候发现的,在扫描或者黑盒测试的时候很难发现.1.序 ...
- VirtualBox-虚拟硬盘扩容-win7
问题: 我在VirtualBox下搭建的win7系统只设置了一个C盘,当初只给硬盘分配32G,如今深受生活的毒打,发现只剩5G可用,装个PS都费劲. 我要扩容,扩容! 当前环境: VirtualBox ...
- MySQL:互联网公司常用分库分表方案汇总!
转载别人 一.数据库瓶颈 不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值.在业务Service来看就是,可用数据库连接少甚至无连接可用 ...
- ASP.NET Core教程:在ASP.NET Core中使用HttPClient调用WebService
一.前言 在以前的一篇文章中,曾经讲述过如何在ASP.NET Core中调用WebService.但是那种方式是通过静态引用的方式去调用的,如果是在生产环境中,肯定不能使用这种方式去调用,幸运的是微软 ...
- WPF简易聊天室
一.聊天界面如下
- (3)hadoop单节点配置
hadopp版本hadoop-2.6.0-cdh5.7.0 下载地址http://archive-primary.cloudera.com/cdh5/cdh/5/ 同样使用flashFXP上 ...