UnityAds で iOS 14 の App Tracking Transparency 対応
はじめに
iOSアプリで Unity Ads を使用したところ、いくつかのガイドラインに違反しリジェクトされてしまいました。
- Guideline 5.1.1 - Legal - Privacy - Data Collection and Storage
- Guideline 5.1.2 - Legal - Privacy - Data Use and Sharing
UnityAds で必要な対応
基本的には以下のドキュメントに従えば問題ありません。
1. Unity Ads SDK のアップグレード
Unity Ads SDK (Advertisement) を 3.5.1 以上にアップグレードします。
2. iOS 14 サポートパッケージのインストール
Unity エディタで Window > Package Manager を選択してパッケージマネージャを開き、「iOS 14 Advertising Support」をインストールします。
3. ATT (App Tracking Transparency) 許可申請の表示
説明文の追記
ATT 許可申請で表示する説明文を Info.plist ファイルに自動的に追記する PostBuild 処理を追加するため、Assets > Editor ディレクトリ配下に次の内容のファイルを作成します。
using UnityEditor;
using UnityEditor.Callbacks;
#if UNITY_IOS
using UnityEditor.iOS.Xcode;
#endif
using System.IO;
public class PostBuildStep
{
private const string k_TrackingDescription = "【ATT許可申請ダイアログに表示されるメッセージ】";
[PostProcessBuild(0)]
public static void OnPostProcessBuild(BuildTarget buildTarget, string pathToXcode)
{
if (buildTarget == BuildTarget.iOS)
{
AddPListValues(pathToXcode);
}
}
static void AddPListValues(string pathToXcode)
{
string plistPath = pathToXcode + "/Info.plist";
PlistDocument plistObj = new PlistDocument();
plistObj.ReadFromString(File.ReadAllText(plistPath));
PlistElementDict plistRoot = plistObj.root;
plistRoot.SetString("NSUserTrackingUsageDescription", k_TrackingDescription);
File.WriteAllText(plistPath, plistObj.WriteToString());
}
}
許可申請の表示
アプリ起動時に ATT 許可申請を表示するため、シーンに空の GameObject を配置し、次の内容の Script を割り当てます。
using UnityEditor;
#if UNITY_IOS
using Unity.Advertisement.IosSupport;
#endif
public class AttPermissionRequest : MonoBehaviour
{
void Awake()
{
#if UNITY_IOS
if (ATTrackingStatusBinding.GetAuthorizationTrackingStatus() == ATTrackingStatusBinding.AuthorizationTrackingStatus.NOT_DETERMINED)
{
ATTrackingStatusBinding.RequestAuthorizationTracking();
}
#endif
}
}
4. Unity Ads へ ATT 許可申請の結果を通知
ATT 許可申請でユーザが選択した結果を Unity Ads へ設定します。
これを行わないと、ATT 許可申請の選択の後、Unity Ads がデータ収集の許可を求めるダイアログを表示してしまい、Guideline 5.1.1 違反でリジェクトされる可能性があります。
Unity Ads の初期化の前に、次のコードを実行します。
if (ATTrackingStatusBinding.GetAuthorizationTrackingStatus() == ATTrackingStatusBinding.AuthorizationTrackingStatus.AUTHORIZED
{
MetaData gdprMetaData = new MetaData("gdpr");
gdprMetaData.Set("consent", "true");
Advertisement.SetMetaData(gdprMetaData);
}
else
{
MetaData gdprMetaData = new MetaData("gdpr");
gdprMetaData.Set("consent", "false");
Advertisement.SetMetaData(gdprMetaData);
}
注意事項
ATT 許可申請は iOS 14.5 未満だとダイアログが表示されません。
そのため、次のようにダイアログの選択を待ち続けるような処理を行ってしまうと、iOS 14.5 未満ではフリーズしてしまうため、注意が必要です。
while (ATTrackingStatusBinding.GetAuthorizationTrackingStatus() == ATTrackingStatusBinding.AuthorizationTrackingStatus.NOT_DETERMINED)
{
yield return null;
}
私は実機テストで iPhone 5s を使用していて問題に気づくことができました。(iPhone 5s の最終アップデートは iOS 12)