iOS14以降では、アプリが IDFA 取得するためにはApp Tracking Transparency(ATT)を用いたTrackingの許可をユーザーに求めなければならなくなりました。
ここではその許可を求めるダイアログを表示するための実装方法についてご紹介します。
最近、Admobで以下のような実装を促すメッセージが表示されていました。
iOS 14 に対応したアプリを準備しましょう Apple が新しい AppTrackingTransparency フレームワークを 発表したことに伴い、iOS アプリに変更を加える必要があります。 広告収入に大幅な減少が生じないよう、GMA SDK 7.64.0 以降を 実装し、同意メッセージを設定してください。
iOSで広告を効率よく適切に表示するためには、App Trackingを有効にして端末に一意に割り振られた番号 IDFA (Identifier for Advertisers)をアプリで取得する必要があります。広告収入を減らさないためにも実装するようにしましょう。
開発環境
- Unity 2019.4.18f1
- Xcode 12.4
- iOS 14.4
App Tracking 許可リクエストするタイミング
IDFA にアクセスするための App Tracking Transparency 許可リクエストを表示する必要があります。
Admobなどで広告を表示する前に許可をリクエストして設定しておく必要がありますので、今回はアプリの起動時にどこかのStart()で表示させることにします。
App Tracking 許可リクエスト処理の実装
以下にApp Tracking Transparency許可リクエストを発行する際のUnityのサンプルコードを示します。
using System.Runtime.InteropServices;
#if UNITY_IOS
[DllImport("__Internal")]
private static extern void _requestIDFA();
#endif
// Start is called before the first frame update
void Start()
{
#if UNITY_IOS
_requestIDFA();
#endif
}
ここで_requestIDFA()はNativeコードのAPIになります。NativeのコードはAssets/Plugins/iOSにソースコード.mmファイルを格納しておくことでXcodeでビルドする際に自動的にリンクされます。
今回は以下のようにiOS14以降であればApp Tracking Transparencyのリクエストを発行するシンプルなものにしました。_Sample()はprint出力するNative実行のためのお試し関数なので、正しく動いているかどうか確認したい時にご利用ください。
#import <AppTrackingTransparency/AppTrackingTransparency.h>
#import <AdSupport/AdSupport.h>
extern "C" void _requestIDFA() {
if (@available(iOS 14,*)) {
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
// Tracking authorization completed. Start loading ads here.
// [self loadAd];
}];
}
}
extern "C" void _Sample() {
NSLog(@"Hello World!");
}
これでコードの実装は完了ですが、AppTrackingTransparency/AppTrackingTransparency.hやAdSupport/AdSupport.hの参照でXcodeビルド時にリンクエラーが出てしまいます。frameworkの追加が必要となります。
Xcode FrameWorkの追加
前述のコードをビルドするためにはXcodeでFrameWorkの追加が必要となります。今回はUnity側に設定する方法とXcode側に設定する方法の2種類の設定方法について説明します。
UnityにFrameworkを設定
UnityにFrameworkを設定するにはXcodeのディレクトリからFrameworkを見つけてPluginとしてコピーします。
この方法だと、一度設定しておけばUnityでビルドすると自動でXcodeにFrameworkをImportしておいてくれるので非常に便利です。一方、XcodeのバージョンアップなどによりFrameworkに変更があった際に更新を忘れてしまうデメリットもあります。
今回使用するFrameworkはXcodeの以下のディレクトリに格納してあります。
Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/AdSupport.framework Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/AppTrackingTransparency.framework
Xcode.appのディレクトリが不明な場合は以下ようにFinderからパッケージの内容を表示を選択することで表示できます。

AdSupport.framework及びAppTrackingTransparency.frameworkをフォルダごとUnityプロジェクトのAssets\Plugins\iOSに格納します。

このように格納しておけば、あとはXcodeで手を加えることなくビルドできます。
XcodeでFrameworkを設定
Xcodeに設定する場合はUnityでXcodeプロジェクト生成後に設定することになります。
ビルドでプロジェクトデータをリプレイスする度に設定が必要となりますが、常にXcodeのバージョンに追従した最新のものが意識せずとも設定、使用できるというメリットがあります。

上記の通り、XcodeのプロジェクトのTARGETSからUnity.frameworkを選択してFramework and Librariesの項目から追加します。
Info.plistの設定
最後にPrivacy Tracking Useage Descriptionにユーザーに許可を案内するダイアログに表示する文字列を設定します。
これを設定せずに、Tracking許可ダイアログを表示すると例外に飛ばされてしまうので必ず設定します。設定はXcodeのフォルダツリーからInfo.plistを選択して追加します。

設定はリストの一番上の+から追加します。ValueにはDialogに表示させたい文字列を設定します。Info.plistの編集については以下の記事にもまとめております。
実機での動作確認
実際にアプリで動作させた結果が以下です。


文言はなんて入れればいいか迷ったのですが、ユーザーに適切でない広告が表示されてしまうのでONにしてねと入れています。まだ審査中ですので、リジェクトされたらまた文言を考えようと思います。
2021/3/20 追記:この文言だと審査に通る場合と落ちる場合の二通りありました。落ちた場合はDataが何に使用されるのか説明を追記することで審査に合格できました。もしひっかかったら、「よりあなたに合った広告を選択するためにデータを使用します」という旨を追加表示するようにすれば大丈夫です。
おわりに
トラッキングの許可要求ですが、思ったより簡単に実装することができました。今回の対応はユーザーが拒否できるので、実装しておいて損することはないとは思います。懸念があるとするならば、ユーザーには聞きなれない文言が表示されることになり、あやしいアプリなのではと拒否反応を示される可能性もあるので、その点注意が必要です。
ゲームであればある程度遊んでもらった後、広告を表示する前にダイアログを表示させるなどタイミングを工夫してもいいかもしれません。
コメント
[…] 【Unity】[iOS] IDFA へのアクセス許可設定 iOSで広告を効率よく適切に表示す… […]
[…] 【Unity】[iOS] Admob のための SKAdNetwork 設定AdMobを使用していると、AdMobのホーム画面に SKAdNetwork を使用できるよう設定されていないアプリがあります と警告が出ることがあるかと思います。今回はそもそもSKAdNetworkとは何なのか?UnityのiO…hirokuma.blog2021.03.02 【Unity】[iOS] IDFA へのアクセス許可設定 iOSで広告を効率よく適切に表示す… […]
[…] ATTのリクエストについての詳細はこちらの記事にまとめております。 […]