应用跟踪透明度合规

iOS 14 及更高版本要求发布者在跨应用程序跟踪用户的设备时获得许可。此设备设置称为应用跟踪透明度或 ATT。Unity 建议实施自定义权限流程。

发布者应在初始化任何旨在接收 IDFA 设置的 SDK 之前触发 ATT 权限请求。

重要:Apple 规定此请求每次安装仅触发一次,但用户可以随时在 iOS 设置菜单中编辑其偏好。

以下是在显示 ATT 权限请求时常见的用户流程

  1. (推荐) 配置一个 ATT 上下文屏幕,解释选择加入广告商跟踪的价值。

  2. 为在您请求授权时显示的系统权限警报配置用户跟踪说明。如果您想请求用户跟踪权限,则此步骤是必需的。

  3. 在您的项目中实施权限流程。

    • 检查设备的授权状态。
    • 如果设备的授权状态未知,请向最终用户呈现 ATT 上下文屏幕和权限请求。

显示 ATT 上下文屏幕

定向广告比上下文广告提供更高的回报率。根据 Apple 的政策,您每次应用程序安装只能提示用户选择加入接收定向广告。因此,Unity 建议实施一个解释选择加入好处的上下文屏幕。

Unity 的 iOS 14 支持包 包含一个示例上下文屏幕场景,其中包含一个完全可自定义的预制上下文屏幕资产。文本仅供示例使用。如果您在公共应用程序中使用它,它将与您的提交内容的其余部分受到相同的认证指南的约束。由于这是一个为选择加入定向广告辩护的机会,Unity 建议您自定义所包含的消息和图像。

重要:您必须使用 iOS 14 支持包版本 0.3.0 或更高版本,以及 Unity 版本 2018.4.33f1 或更高版本才能使用本节中描述的资产。

在 Unity 版本 2019.1 或更高版本中使用该资产

更新版本的 Unity 编辑器支持从包管理器窗口导入示例。

  1. 在 Unity 编辑器中,选择 **窗口** > **包管理器** 以打开包管理器窗口。
  2. 在包管理器窗口中,选择 **iOS 14 支持广告支持** 包。
  3. 在包描述的底部,在示例部分找到 **01 上下文屏幕**,然后选择 **导入到项目**。
  4. 在项目窗口中,选择 **Assets** > **Samples** > **iOS 14 Advertising Support** > **01 Context Screen Scenes** > **Context Screen Sample** 以打开上下文屏幕示例场景。

导入示例场景后,您可以复制和修改它,或复制预制件以供您现有的某个场景使用。

在 Unity 版本 2019.0 或更早版本中使用该资产

旧版本的 Unity 需要您将示例打开为单独的 Unity 项目。

  1. Unity Hub 中,在 **项目** 下,选择 **添加**。
  2. 导航到您从包存储库下载的 com.unity.ads.ios-support 文件夹,然后选择 SampleProject~ 并选择 **选择文件夹**。
  3. 选择要与示例项目一起使用的 Unity 版本并打开它。
  4. 在 Unity 编辑器的项目窗口中,选择 **Assets** > **Samples** > **iOS 14 Advertising Support** > **01 Context Screen** > **Context Screen Sample** 以打开上下文屏幕示例场景。

要将资产合并到您的项目中

  1. 在示例项目目录中,复制 Assets/Samples/iOS 14 Advertising Support/01 - Context Screen 文件夹。
  2. 根据您的首选组织结构,将复制的文件夹粘贴到您的活动项目的目录中。
  3. 打开您的活动项目并确认已复制 01 - Context Screen 资产。
  4. 打开 **上下文屏幕示例** 场景并进入播放模式以确认预期行为。

预期行为

该场景将显示为空。当您进入 播放模式 时,上下文屏幕将出现。当您在上下文屏幕上选择 **下一步** 时,不会发生任何操作,因为本机 ATT 请求仅在 iOS 设备上发生。

ContextScreenManager 脚本 (Assets/Samples/iOS 14 Advertising Support/01 - Context Screen/Scripts/ContextScreenManager) 确保上下文屏幕在场景启动时出现,并且仅在用户之前未收到 ATT 权限请求时出现。

重要:您可以使用您自己的消息、外观和感觉来实现自定义上下文屏幕。如果您确实使用了自定义上下文屏幕预制件,请确保在检查器中将其分配给 ContextScreenManager 脚本的 contextScreenPrefab 字段。

ContextScreenView 脚本 (Assets/Samples/iOS 14 Advertising Support/01 - Context Screen/Scripts/ContentScreenView) 在用户通过调用 SDK 的 RequestAuthorizationTracking API 关闭上下文屏幕时触发 Apple 的 ATT 权限请求。

显示 ATT 权限请求

为了符合 Apple 的 ATT 指南,您必须为请求对话框提供说明,然后在您的应用程序中实施权限请求。

重要:您必须在游戏中投放广告之前实施权限请求。

配置用户跟踪说明

Apple 要求 ATT 权限请求的说明。您可以使用 Info.plist 文件中的 NSUserTrackingUsageDescription 键来设置说明。要提供一条消息,告知用户您请求使用设备跟踪数据的原因

  1. 在 Xcode 项目导航器中,打开 Info.plist 文件。

  2. 单击属性列表编辑器中任何键旁边的添加按钮 (+) 以创建新的属性键。

  3. 输入键名 NSUserTrackingUsageDescription

  4. 选择字符串值类型。

  5. 在值字段中输入应用程序跟踪透明度消息。以下是一些示例

    • "我们将使用您的数据来提供更好的个性化广告体验。"
    • "我们会尝试根据您使用的应用程序、您所在的设备以及您所在的国家/地区向您展示最令您感兴趣的应用程序和产品的广告。"
    • "我们会尝试根据您使用的应用程序向您展示最令您感兴趣的应用程序和产品的广告。"

重要:Apple 提供了有关所有面向最终用户的隐私相关功能的具体 应用商店指南,其中定义了可接受的使用方式和消息传递。Unity 不提供法律建议。因此,本页面的信息不能替代寻求您自己的法律顾问以确定您业务和流程的法律要求以及如何解决这些要求。

Unity 开发者可以选择创建 构建后步骤,该步骤会自动将用户跟踪说明添加到文件中,而不是在每次生成构建时手动配置它。此脚本需要位于项目的 Assets/Editor 文件夹中,如下所示

#if UNITY_IOS
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
using System.IO;
 
public class PostBuildStep {
    // Set the IDFA request description:
    const string k_TrackingDescription = "Your data will be used to provide you a better and personalized ad experience.";
 
    [PostProcessBuild(0)]
    public static void OnPostProcessBuild(BuildTarget buildTarget, string pathToXcode) {
        if (buildTarget == BuildTarget.iOS) {
            AddPListValues(pathToXcode);
        }
    }
 
    // Implement a function to read and write values to the plist file:
    static void AddPListValues(string pathToXcode) {
        // Retrieve the plist file from the Xcode project directory:
        string plistPath = pathToXcode + "/Info.plist";
        PlistDocument plistObj = new PlistDocument();
 
 
        // Read the values from the plist file:
        plistObj.ReadFromString(File.ReadAllText(plistPath));
 
        // Set values from the root object:
        PlistElementDict plistRoot = plistObj.root;
 
        // Set the description key-value in the plist:
        plistRoot.SetString("NSUserTrackingUsageDescription", k_TrackingDescription);
 
        // Save changes to the plist:
        File.WriteAllText(plistPath, plistObj.WriteToString());
    }
}
#endif

在 Unity 中实施 ATT 权限请求

iOS 14 支持包提供了访问 Apple API 的权限,用于检查设备的权限状态,并在状态不确定时显示请求。

以下脚本说明了一个使用 UNITY_IOS 预编译定义的简单权限请求实现,以确保代码仅在 iOS 设备上运行时执行

using UnityEngine;
#if UNITY_IOS
// Include the IosSupport namespace if running on iOS:
using Unity.Advertisement.IosSupport;
#endif
 
public class AttPermissionRequest : MonoBehaviour {
    void Awake() {
#if UNITY_IOS
        // Check the user's consent status.
        // If the status is undetermined, display the request request:
        if(ATTrackingStatusBinding.GetAuthorizationTrackingStatus() == ATTrackingStatusBinding.AuthorizationTrackingStatus.NOT_DETERMINED) {
            ATTrackingStatusBinding.RequestAuthorizationTracking();
        }
#endif
    }
}

在 Xcode 中实施 ATT 权限请求

Note: Refer to the Apple developer documentation for more information about permission request implementation.

以下示例脚本说明了一个简单的权限请求实现

#import <AppTrackingTransparency/AppTrackingTransparency.h>
 
- (void)requestTrackingAuthorization {
    [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
        // Tracking authorization completed. Start loading ads here.
    }];
}

测试您的权限请求

要测试您的实现,将您的项目构建为 iOS,然后在 Xcode 中打开它。如果您打开 `Info.plist` 文件(默认情况下,它位于应用程序包的根文件夹中),您应该会看到在构建后步骤中添加的 `NSUserTrackingUsageDescription` 描述。

接下来,在测试设备上构建并启动应用程序。第一次启动项目时,应该会显示 ATT 权限请求。

Note: Per Apple requirements, if you dismiss the request and launch the app a second time, the request won’t trigger. If you want to test the implementation again, you will need to uninstall and reinstall the app.​

其他资源