About com.unity.ads.ios-support

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)。

3. 为什么不建议手动调用?

即使你是广告主,手动调用 com.unity.ads.ios-support 中的这个 API 也是非常复杂的,原因如下:

  1. 计时器逻辑复杂: 苹果规定每次更新转化值,计时器会重置 24 小时。你需要精密的逻辑来确保不会因为频繁更新导致数据永远发不出去,或者错过了上报窗口。
  2. SKAdNetwork 版本差异: iOS 15/16 引入了 SKAdNetwork 4.0,逻辑变得更加复杂(粗粒度/细粒度转化值、多次回调)。Unity 的这个简易包可能没有处理好这些复杂的兼容性。
  3. 数据映射: 你需要自己在服务器端维护 “数值 5” 对应 “充值” 这样的映射表。

总结

  • 对于 AdMob 中介接入 Unity Ads 的你:
    • 不需要调用 SKAdNetwork.updateConversionValue。
    • 请把注意力集中在 requestTrackingAuthorization (ATT 弹窗) 上,这个是必须要做的。
  • 这个 API 放在包里是干嘛的?
    • 它是留给那些既不接 MMP,又想自己做买量归因测试的极少数开发者的。对于绝大多数变现开发者,它是个“僵尸”API,不用理会。