com.unity.ads.ios-support Provides support for App Tracking Transparency and SkAdNetwork API newly introduced in Apple iOS 14.
App Tracking Transparency

这个东东会在APP首次启动的时候,弹出如上所示的一个弹窗,提示用户是否允许追踪用户的活动。这是iOS 14+之后的强制性要求,必做内容。在程序代码的实现上,就是在程序启动后,执行任何用户活动之前,执行如下代码,带出弹窗。
#if UNITY_IOS
// check with iOS to see if the user has accepted or declined tracking
var status = ATTrackingStatusBinding.GetAuthorizationTrackingStatus();
Version currentVersion = new Version(Device.systemVersion);
Version ios14 = new Version("14.5");
if (status == ATTrackingStatusBinding.AuthorizationTrackingStatus.NOT_DETERMINED && currentVersion >= ios14)
{
bool bStatus = false;
ATTrackingStatusBinding.RequestAuthorizationTracking((s)=>{bStatus=true;} );
while ( !bStatus ) {
yield return null;
}
}
#endif而以上代码的执行时机非常重要,如果你把代码放到 MonoBehaviour 的 Awake中执行,就会出现程序还没有准备好,弹窗不出现的问题。示例代码演示的执行时机在 Start 方法中,但是实际测试下来,发现更好的位置是在程序启动好之后,首次获得焦点后延迟一点点的时间点上更为恰当,
private bool hasRequestedTracking = false;
IEnumerator RequestATTWithDelay()
{
yield return new WaitForSeconds(1.0f);
// do RequestAuthorizationTracking work here
}
void OnApplicationFocus(bool hasFocus)
{
if (hasFocus && hasRequestedTracking )
{
hasRequestedTracking = true;
StartCoroutine(RequestATTWithDelay());
}
}之前,我把 RequestAuthorizationTracking 放到了 Awake中,此时程序还没有加载好,代码执行之后就直接返回0了,弹窗怎么也弹不出来,这个问题困扰了我好久。
SkAdNetwork API
该部分代码是 unity ads 的归因处理,绝大多数的开发者基本用不到这里的功能,它们就是僵尸API.
如果你只是在游戏中接广告来赚钱(变现/流量主),你永远不需要调用 SKAdNetwork.updateConversionValue。
只有当且仅当你的游戏是 “被广告推广的对象”(即你在花钱买量,让别人下载你的游戏),并且你没有接入第三方归因工具(MMP)时,你才需要手动调用它。
以下是详细的场景分析:
1. 场景一:流量主 / 变现 (Publisher) —— 你目前的状态
- 你的角色: 你开发了游戏 A,在里面接入 AdMob 和 Unity Ads,展示别人的广告(比如“万国觉醒”)。
- 流程: 玩家在你的游戏 A 里点击了“万国觉醒”的广告 -> 下载并打开了“万国觉醒”。
- 谁负责调用 API? 是**“万国觉醒”**的开发商需要在他们的代码里调用 updateConversionValue。
- 你需要做什么? 什么都不用做。 你的任务只是确保 Info.plist 里有 SKAdNetwork ID,让 iOS 知道这广告是你展示的,钱能算给你。
2. 场景二:广告主 / 买量 (Advertiser)
- 你的角色: 你花钱在 Unity Ads 平台上投放广告,希望别人下载你的游戏 A。
- 流程: 玩家在别的游戏里看到了你的广告 -> 下载并打开了你的游戏 A。
- 为什么需要调用? 苹果为了保护隐私,不告诉广告平台具体是“谁”下载了,只允许你回传一个 0-63 的整数(Conversion Value)。你需要通过这个值告诉广告平台这个用户的质量(例如:0代表安装,10代表过了新手教程,63代表充值了)。
- 怎么调用?
- 情况 A(推荐):使用 MMP (AppsFlyer, Adjust, Singular 等)
- 如果你接入了 AppsFlyer 或 Adjust SDK,千万不要自己手动调用 updateConversionValue。MMP SDK 会全权接管,你如果手动调用会和 MMP 冲突,导致数据错乱。
- 情况 B(罕见):自建归因
- 如果你没钱买 MMP,完全靠自己统计。那么你需要在玩家触发关键行为(如通关、充值)时,调用 SKAdNetwork.updateConversionValue(cv)。
- 情况 A(推荐):使用 MMP (AppsFlyer, Adjust, Singular 等)
3. 为什么不建议手动调用?
即使你是广告主,手动调用 com.unity.ads.ios-support 中的这个 API 也是非常复杂的,原因如下:
- 计时器逻辑复杂: 苹果规定每次更新转化值,计时器会重置 24 小时。你需要精密的逻辑来确保不会因为频繁更新导致数据永远发不出去,或者错过了上报窗口。
- SKAdNetwork 版本差异: iOS 15/16 引入了 SKAdNetwork 4.0,逻辑变得更加复杂(粗粒度/细粒度转化值、多次回调)。Unity 的这个简易包可能没有处理好这些复杂的兼容性。
- 数据映射: 你需要自己在服务器端维护 “数值 5” 对应 “充值” 这样的映射表。
总结
- 对于 AdMob 中介接入 Unity Ads 的你:
- 不需要调用 SKAdNetwork.updateConversionValue。
- 请把注意力集中在 requestTrackingAuthorization (ATT 弹窗) 上,这个是必须要做的。
- 这个 API 放在包里是干嘛的?
- 它是留给那些既不接 MMP,又想自己做买量归因测试的极少数开发者的。对于绝大多数变现开发者,它是个“僵尸”API,不用理会。

