苹果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】电商广告投放的地域分析
		分析师的职责是利用处理数据获取信息,提炼规律,帮助企业正确决策业务方向. 所以,一个好的分析师绝不能被数据所困,既要深入业务,理解业务,也要高瞻远瞩,以领导者的思维借助数据分析的辅助做出判断. [结构 ... 
随机推荐
- python自动化之(自动生成测试报告)
			前言: 用python执行测试脚本, 测试报告是记录我们测试过程的问题, 方便我们对整个测试过程的把控. 这里引用的是别人写好的模板, 我们拿过来用就OK, 能力强者可自行编写模板 测试报告图模板: ... 
- 从理发店小弟到阿里P10大牛,一位高中学渣的“登天”之路
			蚂蚁金服,可能是众多程序猿眼中梦寐以求的归宿,无数拿过数不清奖状的各个高校走出的学子精英都挤破头皮,只为能在蚂蚁占有一席之地. 蚂蚁金服里不乏各种深藏不露的大佬,到了那里才会深刻明白一山还有一山高这句 ... 
- mock请求时出现中文乱码的解决
			请求返回的乱码如图: 原mock代码如下 [ { "description":"这是我们的第一个mock例子", "request":{ & ... 
- Python3中的字符串相关操作
			Python3的字符串操作相关函数详解 字符串内建函数 1. capitalize() 将字符串中的第一个字符转换成大写,其他字母变成小写.例: >>> "hello Wo ... 
- Python - typing 模块 —— TypeVar 泛型
			前言 typing 是在 python 3.5 才有的模块 前置学习 Python 类型提示:https://www.cnblogs.com/poloyy/p/15145380.html 常用类型提示 ... 
- Docker搭建Svn服务器
			一.下载镜像 # 搜索镜像 docker search svn # 下载镜像 docker pull garethflowers/svn-server 二.启动镜像 # 编辑配置文件 vim dock ... 
- 什么是挂载,Linux挂载详解
			前面讲过,Linux 系统中"一切皆文件",所有文件都放置在以根目录为树根的树形目录结构中.在 Linux 看来,任何硬件设备也都是文件,它们各有自己的一套文件系统(文件目录结构) ... 
- Quartz任务调度(5)TriggerListener分版本超详细解析
			TriggerListener 在我们的触发器监听器中,也包含了一系列监听方法 方法 说明 getName() 定义并返回监听器的名字 triggerFired() 当与监听器相关联的 Trigger ... 
- Mybatis轻松入门(仅要求会用看着一个就够了,略过源码分析部分即可)
			文章目录 ==一.概念== 二.快速入门 1.开发步骤 2.环境搭建 2.1.导入Mybatis的坐标和其他坐标 2.2.创建User表 2.3.编写实体 2.4.编写UserMapper配置文件 2 ... 
- VS code快速创建vue模板
			忘记了.vue文件的格式或者不想手动敲那段模板代码怎么办?VS code快速创建vue模板帮你偷个小懒 第一步:新建模板并保存 打开 VS code,依次点击 file > Preference ... 
