我发现如果App想要通过广告赚点饭钱的话,需要加入一个叫做AppTrackingTransparency的框架。只有用户同意这个框架下的授权时,才能收到来自广告商的“个性化”广告,我才能从一份麦当劳1+1套餐升级到一份汉堡王皇堡套餐。
由于这一系列设置发生在上传安装包到商店前,于是这篇就被安排在苹果商店的发布和上架文章之前了。
什么是AppTrackingTransparency
App Tracking Transparency 简称 ATT,是 Apple 推出的用户隐私保护功能。按照 ATT 要求,应用必须先通过许可请求弹窗获得用户许可,然后才能读取广告主标识符 (IDFA),对用户或设备开展跟踪。随着人们对数据隐私安全关注的提高,2021 年 4 月,ATT 与 Apple iOS 14.5 更新同步推出,目的是限制应用开发者能获得的可用于用户跟踪和定向的数据量。
——ADJUST

ATT带来的影响
App Tracking Transparency 的问世从根本上改变了移动营销行业。在此之前,应用开发者和营销人员默认可读取 IDFA,访问 iOS 用户层级数据,用来开展归因。这些归因和监测数据是一切的基础,能指示用户兴趣、人群特征、应用内行为和定向广告的制定,并清晰呈现出推广活动和渠道表现。
——ADJUST
简而言之,如果没有用户授权,这个用户能看到的可能就都是美女跳舞这类抖音或者快手的保底广告了。这些广告单价极低,对开发者而言,收入不好。所以,这篇我们要做的就是如何弹出这个授权,并且让用户明白这个授权的意义。
*注意,许多用户在系统级别关闭了这项功能,这种情况是无能为力的。
**想进一步了解ATT的话,可以点击查看ADJUST的博客。
Unity 3D中的示例
如下图,在window -> Package Manager -> Unity Registry中,找到iOS14 Advertising Support这个包,并且安装它的Samples。

在下图位置找到示例场景并打开。

可以看到这个场景结构很简单。

运行后,会生成一个Context Screen窗口,显然是用来调用授权的。但在编辑器中,它会提示需要在真机上测试才行。

再来看看组件设置。
Context Screen中有2个脚本。

Context Screen Sample中有1个脚本。

很容易就发现Context Screen Manager和Context Screen View是核心脚本。我们继续看一下。
在Context Screen Manager中有这么一段,
启动时,检查ATT的状态,
如果是NOT_DETERMINED(未决定),生成一个Context Screen然后呼叫Context Screen View。然后就毁掉这个窗口。
其他情况,就输出日志。
void Start()
{
#if UNITY_IOS
// check with iOS to see if the user has accepted or declined tracking
var status = ATTrackingStatusBinding.GetAuthorizationTrackingStatus();
if (status == ATTrackingStatusBinding.AuthorizationTrackingStatus.NOT_DETERMINED)
{
var contextScreen = Instantiate(contextScreenPrefab).GetComponent<ContextScreenView>();
// after the Continue button is pressed, and the tracking request
// has been sent, automatically destroy the popup to conserve memory
contextScreen.sentTrackingAuthorizationRequest += () => Destroy(contextScreen.gameObject);
}
#else
Debug.Log("Unity iOS Support: App Tracking Transparency status not checked, because the platform is not iOS.");
#endif
}
在Context Screen View中,则会根据呼叫调用iOS的ATT接口。
public void RequestAuthorizationTracking()
{
#if UNITY_IOS
Debug.Log("Unity iOS Support: Requesting iOS App Tracking Transparency native dialog.");
ATTrackingStatusBinding.RequestAuthorizationTracking();
sentTrackingAuthorizationRequest?.Invoke();
#else
Debug.LogWarning("Unity iOS Support: Tried to request iOS App Tracking Transparency native dialog, " +
"but the current platform is not iOS.");
#endif
}
明白这两段代码之后,我们就build一个iOS版本吧。接下来,我们以默认做法导出的XCODE工程为例。
XCODE中的设置
如下图,UNITY导出的XCODE工程一般就是这个结构。
我们在左边栏点击UNITY-IPHONE,然后点击中间的General页签。找到下方FRAMEWORK那一栏,点击“+”,找到AppTrackingTransparency.framework,添加上。

再点击中间的info页签,如下图,添加一个Privacy – Tracking Usage Description,并在Value栏写下用途(任意语言皆可)。这里就写了for att test。
*发布时需要用正式的语言,用户是可以看到这些字的。

完成这些设置后,build到自己的设备,就可以开始测试了。
iOS中的展示
如下图,打开设备的“设置”,找到“隐私”,“跟踪”

如下图,如果关掉箭头位置的开关,就会全局关闭这个授权(许多用户就是这么干的)。下面的列表则是使用这个授权的应用。

发现问题
通过以上测试,我们会发现2个主要问题:
1、UNITY的示例过于简单,只是完成了调用系统授权,剩下的什么都没做(当然也不能怪UNITY,流程处理是业务问题,和她无关)。
2、体感上,设备了解授权情况不是瞬间,而是有几秒时间。这会导致游戏看上去像卡住了一样。
最佳实践
1、为授权专门制作一个条款确认界面/场景
实际上,除了APPLE的ATT之外,国内外都有一些强制或非强制的合规要求,比如国内的隐私弹窗,欧洲的GDPR等等。
把这些内容分散在不同地方,显然会导致业务逻辑变复杂,并且降低转化效果。
与其如此,不如就把这些东西装在一起。即便这个窗口可能只会出现一次,让用户看明白,知道自己在干什么,没有比这个更重要的了。
但是,我们肯定也不能直接贴上冗长的隐私条款等等信息。没人喜欢阅读这些。

如上图,
左侧的正面例子来自汤姆猫跑酷,配合游戏形象,简述了这个页面是干什么的,也可以点击文字链接打开相关页面。
右侧的负面例子来自ADMOB生成的GDPR授权窗口。
2、在授权界面出现前判断ATT状态,而非授权界面出现时
假设在上一步我们做了一个漂亮的确认界面,但是,因为APP和系统通信的时间是未知的。如果判断ATT状态也放在这个界面,时间稍长一些,就会出现每次进入都看到确认界面并且一闪而过的情况。这种体验就很糟糕了。
所以,把判断前置。判断完成后,再根据情况打开授权界面或者直接进入游戏。
3、在可能较长的通信时间中,让画面动起来
许多开发者喜欢用空白场景去初始化一些SDK或者某些组件。但是,如前所述,由于通信时间无法确认,我们就有必要为此制作一些进度条或者小动画,去减缓那短短几秒的无聊感。
记住,用户可以忍受预期中的等待,但绝不喜欢短暂的空白。
4、为确认界面和授权文本设置多语言
如果我们的APP是针对单一语言,那么在XCODE那步中的设置就足够满足我们的需求了。但如果是面向多语言的呢?
总不能让中国用户看英语界面吧,大部分用户看到这种情况是直接关闭的,比直接把隐私条款列在界面上还要糟糕。再者,既然都专门做界面了,那就再花点心力准备多语言文本吧。
授权文本同理,但需要通过修改XCODE中的info.plist来实现这个功能。
5、切勿在ATT完成授权前(无论结果),初始化广告SDK
合规需求。除了广告外,也包含数据后台等等SDK,原则上都应该在这步完成后才能初始化。
总结
这篇我们详细了解了ATT,以及如何在实践中使用ATT,并提供了该内容的最佳实践。
随着各国和硬件厂商对隐私管理的加强,类似的合规内容在未来肯定会更加严格和复杂。建议每隔半年或1年就更新下自己在这方面的知识储备,这几年的隐私要求更新是非常快的。稍有不慎,就有可能导致APP警告甚至下架。
所以,ATT只是这一阶段的一个侧面,无论对于个人还是公司开发者,都应该加强这方面的学习与实践。

本文首发于我们的公众号:在苹果商店发布你的游戏完全攻略(1)| 广告跟踪授权及其最佳实践