苹果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】电商广告投放的地域分析
分析师的职责是利用处理数据获取信息,提炼规律,帮助企业正确决策业务方向. 所以,一个好的分析师绝不能被数据所困,既要深入业务,理解业务,也要高瞻远瞩,以领导者的思维借助数据分析的辅助做出判断. [结构 ...
随机推荐
- mock请求时出现中文乱码的解决
请求返回的乱码如图: 原mock代码如下 [ { "description":"这是我们的第一个mock例子", "request":{ & ...
- 记一次在Windows10桌面环境搭建Jekins的吐血经历
目录 写在前面 故事背景 踩坑详情 最后总结 写在前面 首先声明,除非万不得已,千万不要在Windows环境做这个事情,否则就等着各种坑吧. 本人一贯的立场都是坚持用正确的方法做事,显然在Window ...
- 列出文件夹中分级目录java
package test; import java.io.File; public class exportFileName { public static void main(String[] ar ...
- mysqldump备份恢复数据
//导出数据(多个表以空格间隔)mysqldump -h 127.0.0.1 -uroot -p123456 --default-character-set=utf8 pandora report & ...
- sqli-labs lesson 38-45
从page3也就是less 38开始进入了堆叠注入(stacked injection) stacked injection: 简单来说就是进行SQL注入时注入了多条语句.因为之前我们都是只进行过注入 ...
- S3C2440—11.und异常
文章目录 1 未定义指令 2 中断向量表 3 设置一个未定义指令 4 调用C函数 5 UND异常处理程序 6 汇编源码 7 注意点 lr与pc 保存现场 中断向量表的跳转 程序执行顺序 问题 1 未定 ...
- 3 分钟了解 JSON Schema
大家好,我不是鱼皮. 幸运又不幸,我是一名程序员,他也是一名程序员. 周末,我在开发网站,他在开发游戏,两个人一起写代码,一起写 Bug 头秃,竟也有了一丝别样的浪漫,好不自在! 今天,他遇到了一个后 ...
- noip30
T1 一眼看,觉得是个状压,然而又觉得不太行,去打暴力了,然而暴力都打挂的我biss. 正解: 还是暴力,考虑 \(meet \; in \; the \; middle\) 显然对于每个数,只有三种 ...
- noip25
T1 经过一波大力推式子,发现答案是 \(\frac{n^{2}-1}{9}\) . 式子回头再补,可能会 Code #include<cstdio> #define re registe ...
- ReentrantLock可重入锁lock,tryLock的区别
void lock(); Acquires the lock. Acquires the lock if it is not held by another thread and returns im ...