iOS14.5からのアプリケーショントラッキング透明性(ATT,App Tracking Transparency)にUnity + AdMobを対応させたメモ

スポンサーリンク
AdMob
スポンサーリンク

iOSアプリを審査に出したところ以下のようなメッセージと共にリジェクトされてしまいました。

Guideline 5.1.2 – Legal – Privacy – Data Use and Sharing

We noticed you do not use App Tracking Transparency to request the user’s permission before tracking their activity across apps and websites. The app privacy information you provided in App Store Connect indicates you collect data in order to track the user, including Device ID.

Starting with iOS 14.5, apps on the App Store need to receive the user’s permission through the AppTrackingTransparency framework before collecting data used to track them. This requirement protects the privacy of App Store users.

Next Steps

Here are two ways to resolve this issue:

  • You can remove the tracking functionality from your app and update your app privacy information in App Store Connect.
  • If you decide to continue tracking users, you must implement App Tracking Transparency and request permission before collecting data used to track the user or device.

Resources

  • See Frequently Asked Questions about the new requirements for apps that track users.
  • Learn more about designing appropriate permission requests.

調べた所、iOS14.5からはアプリが広告最適化などの為にトラッキングを許可するかどうかのダイアログを出す(アプリケーショントラッキング透明性、ATT)という取り組みを導入する必要があるそうです。
自分はUnity2019.2の環境で、Live2D Cubism SDK、Firebase Analytics、Firabase Auth、Firebase Database、AdMobという5つのライブラリを使っており、どうやらAdMobのバージョンアップを行う必要があるみたいです。
以下は私の場合のATT対応までの作業メモです。参考になれば幸いです。

スポンサーリンク

Unityを2019.2以前→2019.3以降にする

Unity2019.2以前だと、後の手順で必要なXCode内のビルドターゲット「UnityFramework」が作られません。UnityFrameworkを使わない手段はあるかもしれませんが、情報がなく、他の問題も出てくる可能性があるのでおとなしく2019.3以降にします。Project Settingsでuse deterministic compilationをオフにするなど、エラーを消す為に一部対応が必要になります。

余談ですが、↑のリンク先にも書いていますが、Live2D Cubism SDKは現在Unity2020への対応が怪しいので、Live2Dを使っている場合は2019.*を使うことをおすすめします。
そういうわけもあって、Live2Dを使っている私は今回2019.2.1f1から2019.4.17f1にアップデートしました。

AdMobをアップデートする

Androidにスイッチし、AdMobのUnity用プラグインであるGoogleMobileAdsをアップデートします。v3.18.3を使っていたので、最新のv5.4.0にします。https://github.com/googleads/googleads-mobile-unity/releases/tag/v5.4.0 ここからunitypackageファイルをDLし、インポートします。
[Assets]> [Import Package]> [Custom Package]を選択し、ダウンロードした GoogleMobileAdsPlugin.unitypackage ファイルを選択します。すると、しばらくresolving android dependenciesが走ります。

Firebaseをアップデートする

依存性があるのでFirebaseのバージョンも7.*にアップデートする必要があります。もしFirebaseのバージョンが低すぎるとMac側でのpodコマンドで依存性のエラーが出ます。
https://firebase.google.com/download/unity ここからDLします。
展開した後、dotnet4の中に入っているunitypackageから必要なものを入れます。
私はfirebase unity sdkのバージョンを6.7.0から7.2.0にアップデートしました。
iOSビルドした時に生成されるPodfileはこんな感じにアップデート前後で変わります。

#アップデート前
source 'https://github.com/CocoaPods/Specs.git'
source 'https://github.com/CocoaPods/Specs'
platform :ios, '10.6'

target 'Unity-iPhone' do
pod 'Firebase/Auth', '6.10.0'
pod 'Firebase/Core', '6.10.0'
pod 'Firebase/Database', '6.10.0'
pod 'Google-Mobile-Ads-SDK', '~> 7.68'
end
#アップデート後
source 'https://github.com/CocoaPods/Specs.git'
source 'https://github.com/CocoaPods/Specs'
platform :ios, '10.6'

target 'UnityFramework' do
pod 'Firebase/Analytics', '7.11.0'
pod 'Firebase/Auth', '7.11.0'
pod 'Firebase/Core', '7.11.0'
pod 'Firebase/Database', '7.11.0'
pod 'Google-Mobile-Ads-SDK', '~> 7.68'
end
target 'Unity-iPhone' do
end
use_frameworks!

あまり詳しくないのですが、Unityにあるpackage managerからもFirebaseもアップデート出来るみたいなのですが、以前に公式のunitypackageからインストールしていた場合、package managerからアップデートするとよく分からない状態になるみたいです。
iOSビルドをしてみても、生成されるpodfileの中身に変化がありません。なので基本package managerは触らないようにしています。最初からpackage managerだけ使っていたら問題ないのかもしれません。

AdMobやFirebaseをアプデしたタイミングでGoogle Version Handlerというダイアログが出て「would you like to delete the following obsolete files in your project?」と聞かれたらApplyします。

Firebaseのアップデートに際して必要なスクリプト編集を行う

私の場合は、FirebaseApp.DefaultInstance.SetEditorDatabaseUrl()が廃止になっているなどの変更があった為、以下のようにソースを書き換えました。

// using Firebase.Unity.Editor; 削除

//FirebaseApp app = FirebaseApp.DefaultInstance; 削除
//FirebaseApp.DefaultInstance.SetEditorDatabaseUrl("***"); 削除

AppOptions options = new AppOptions(); 追加
options.DatabaseUrl = new System.Uri("***"); 追加
FirebaseApp app = FirebaseApp.Create(options); 追加

if (app.Options.DatabaseUrl != null){
   //app.SetEditorDatabaseUrl(app.Options.DatabaseUrl); 削除
   app.Options.DatabaseUrl=(app.Options.DatabaseUrl); 追加
}

.mmファイルを作成する

名前は何でもいいので、拡張子.mmのテキストファイルを作成し、編集します。

#import <AppTrackingTransparency/AppTrackingTransparency.h>
#import <AdSupport/AdSupport.h>

extern "C" void _requestIDFA() {
    if (@available(iOS 14.5,*)) {
        [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
            // Tracking authorization completed. Start loading ads here.
            // [self loadAd];
          }];
    }
}

出来たファイルをUnityのプロジェクト欄の\Assets\Plugins\iOS直下に入れます。

参考:https://hirokuma.blog/?p=3003#toc2

Unity用のスクリプトを作成

以下のような処理を記述したC#スクリプトを作成します。例としてIDFAという名前にします。

using UnityEngine;
using System.Runtime.InteropServices;

public class IDFA : MonoBehaviour
{

#if UNITY_IOS

    [DllImport("__Internal")]
    private static extern void _requestIDFA();

#endif

    void Start()
    {
#if UNITY_IOS
        _requestIDFA();
#endif
    }

}

アプリの最初のシーンで空のオブジェクトにこのファイルをアタッチします。

Mac,XCodeでの設定

冗長ですが、自分がやっている全体の流れをそのまま載せます。
プロジェクトのディレクトリの中にコンソールで入り

chmod 755 *.sh
pod install --repo-update

を実行します。
次に、「Unity-iPhone.xcworkspace」からXCodeを起動します。
Project「Unity-iPhone」からInfoを選び、Localizationsの「japanese deprecated」を消して「Other→Japanese(ja-jp)」を追加します。
余談ですが、Live2d Cubism SDKを使っている場合は、全てのPROJECTおよびTARGETSのBuild SettingsのArchitecturesの「armv7」を削除し「arm64」だけにします。
InfoPlist.strings(English)に

CFBundleDisplayName="app name";
NSUserTrackingUsageDescription="This identifier will be used to deliver personalized ads to you";

を追記し、InfoPlist.strings(Japan)に

CFBundleDisplayName="アプリ名";
NSUserTrackingUsageDescription="あなたの好みに合わせた広告を表示する為に使用されます";

を追記します。CFBundleDisplayNameはアプリ名、NSUserTrackingUsageDescriptionはATTの確認ダイアログの文言です。
そのままFile inspectorを開き、target membership の Unity-iPhoneとUnity-iPhone testsをチェックします。これでアプリ名とATTダイアログのローカライズが出来ました。

全てのTARGETSに対し、Signing & Capabilitiesでauto signing managementにしてteamを指定します。UnityFrameworkにも忘れずに。
TARGETSのバージョン番号とビルド番号を確認します。UnityFrameWorkは1.0のままです。

Info.Plistを開き、右クリックしてRaw Keys & Valuesを選びます。これで本来のKey名が表示されます。NSUserTrackingUsageDescriptionというKeyをString型で追加します。すでに上に書いたInfoPlist.stringsでローカライズしていますが、一応適当な文言を入れておきます。
GADApplicationIdentifierが追加されており、AdMobのIDが入力されている事を確認します。自動で追加されていると思います。
SKAdNetworkItemsが追加されている事を確認します。Unity2019.2では追加されていませんでしたが、Unity2019.3以降では自動で追加されていると思います。
GADIsAdManagerAppをBoolean型で追加し、1を入れます。
UIRequiredDeviceCapabilitiesを削除します。

おまけ:エラーなど対応まとめ

上は結果的に判明した手順のみ書いていますが、途中で様々なエラーに苦しめられました。検索して来る人もそのエラーメッセージの方が解決の手がかりになるでしょうから、最後に列挙しておきます。

AdMob SDKをアップデートするとUnityで色々エラーが出る

Assets\GoogleMobileAds\Api\Core\AdapterStatus.cs(17,18): error CS0101: The namespace 'GoogleMobileAds.Api' already contains a definition for 'AdapterStatus'
Assets\GoogleMobileAds\Api\Core\AdErrorEventArgs.cs(19,18): error CS0101: The namespace 'GoogleMobileAds.Api' already contains a definition for 'AdErrorEventArgs'
Assets\GoogleMobileAds\Api\Core\AdFailedToLoadEventArgs.cs(20,18): error CS0101: The namespace 'GoogleMobileAds.Api' already contains a definition for 'AdFailedToLoadEventArgs'
Assets\GoogleMobileAds\Api\Core\AdRequest.cs(22,18): error CS0101: The namespace 'GoogleMobileAds.Api' already contains a definition for 'AdRequest'
Assets\GoogleMobileAds\Api\Core\AdSize.cs(24,18): error CS0101: The namespace 'GoogleMobileAds.Api' already contains a definition for 'AdSize'
Assets\GoogleMobileAds\Api\Reward.cs(20,18): error CS0101: The namespace 'GoogleMobileAds.Api' already contains a definition for 'Reward'
Assets\GoogleMobileAds\Api\ServerSideVerificationOptions.cs(20,18): error CS0101: The namespace 'GoogleMobileAds.Api' already contains a definition for 'ServerSideVerificationOptions'
Assets\GoogleMobileAds\Api\Core\AdapterStatus.cs(33,17): error CS0101: The namespace 'GoogleMobileAds.Api' already contains a definition for 'AdapterState'
Assets\GoogleMobileAds\Api\Core\AdPosition.cs(18,17): error CS0101: The namespace 'GoogleMobileAds.Api' already contains a definition for 'AdPosition'
Assets\GoogleMobileAds\Api\Gender.cs(18,17): error CS0101: The namespace 'GoogleMobileAds.Api' already contains a definition for 'Gender'
Assets\GoogleMobileAds\Api\Core\AdapterStatus.cs(25,18): error CS0111: Type 'AdapterStatus' already defines a member called '.ctor' with the same parameter types
Assets\GoogleMobileAds\Api\Core\AdRequest.cs(27,17): error CS0111: Type 'AdRequest' already defines a member called '.ctor' with the same parameter types
Assets\GoogleMobileAds\Api\Core\AdRequest.cs(54,20): error CS0111: Type 'AdRequest.Builder' already defines a member called '.ctor' with the same parameter types
Assets\GoogleMobileAds\Api\Core\AdRequest.cs(79,28): error CS0111: Type 'AdRequest.Builder' already defines a member called 'AddKeyword' with the same parameter types
Assets\GoogleMobileAds\Api\Core\AdRequest.cs(85,28): error CS0111: Type 'AdRequest.Builder' already defines a member called 'AddTestDevice' with the same parameter types
Assets\GoogleMobileAds\Api\Core\AdRequest.cs(91,30): error CS0111: Type 'AdRequest.Builder' already defines a member called 'Build' with the same parameter types
Assets\GoogleMobileAds\Api\Core\AdRequest.cs(96,28): error CS0111: Type 'AdRequest.Builder' already defines a member called 'SetBirthday' with the same parameter types
Assets\GoogleMobileAds\Api\Core\AdRequest.cs(102,28): error CS0111: Type 'AdRequest.Builder' already defines a member called 'SetGender' with the same parameter types
Assets\GoogleMobileAds\Api\Core\AdRequest.cs(108,28): error CS0111: Type 'AdRequest.Builder' already defines a member called 'AddMediationExtras' with the same parameter types
Assets\GoogleMobileAds\Api\Core\AdRequest.cs(114,28): error CS0111: Type 'AdRequest.Builder' already defines a member called 'TagForChildDirectedTreatment' with the same parameter types
Assets\GoogleMobileAds\Api\Core\AdRequest.cs(120,28): error CS0111: Type 'AdRequest.Builder' already defines a member called 'AddExtra' with the same parameter types
Assets\GoogleMobileAds\Api\Core\AdSize.cs(43,16): error CS0111: Type 'AdSize' already defines a member called '.ctor' with the same parameter types
Assets\GoogleMobileAds\Api\Core\AdSize.cs(107,30): error CS0111: Type 'AdSize' already defines a member called 'Equals' with the same parameter types
Assets\GoogleMobileAds\Api\Core\AdSize.cs(117,37): error CS0111: Type 'AdSize' already defines a member called 'op_Equality' with the same parameter types
Assets\GoogleMobileAds\Api\Core\AdSize.cs(127,37): error CS0111: Type 'AdSize' already defines a member called 'op_Inequality' with the same parameter types
Assets\GoogleMobileAds\Api\Core\AdSize.cs(137,29): error CS0111: Type 'AdSize' already defines a member called 'GetHashCode' with the same parameter types
Assets\GoogleMobileAds\Api\ServerSideVerificationOptions.cs(25,17): error CS0111: Type 'ServerSideVerificationOptions' already defines a member called '.ctor' with the same parameter types
Assets\GoogleMobileAds\Api\ServerSideVerificationOptions.cs(36,20): error CS0111: Type 'ServerSideVerificationOptions.Builder' already defines a member called '.ctor' with the same parameter types
Assets\GoogleMobileAds\Api\ServerSideVerificationOptions.cs(40,28): error CS0111: Type 'ServerSideVerificationOptions.Builder' already defines a member called 'SetUserId' with the same parameter types
Assets\GoogleMobileAds\Api\ServerSideVerificationOptions.cs(46,28): error CS0111: Type 'ServerSideVerificationOptions.Builder' already defines a member called 'SetCustomData' with the same parameter types
Assets\GoogleMobileAds\Api\ServerSideVerificationOptions.cs(52,50): error CS0111: Type 'ServerSideVerificationOptions.Builder' already defines a member called 'Build' with the same parameter types

こういうのが出ますが、旧バージョンのプラグインで場所が違うのにクラス名が同じなのでエラーが出てます。私の場合は重複しているファイルの中で\Assets\GoogleMobileAds\Api\Coreフォルダに入ってるものが新しく、\Assets\GoogleMobileAds\Api\直下のものは古かったので、古い方の重複ファイルを全て削除した所エラーは無くなり、問題なく動くようになりました。
具体的には、
Api\AdRequest.cs
Api\AdStatus.cs
Api\AdErrorEventArgs.cs
Api\AdFailedToLoadEventArgs.cs
Api\AdSize.cs
Api\Reward.cs
Api\ServerSideVerificationOptions.cs
Api\AdPosition.cs
Api\Gender.cs
を削除しました。

CocoaPods could not find compatible versions for pod “FirebaseCore”みたいなエラーが出る

pod install –repo-updateすると

CocoaPods could not find compatible versions for pod "FirebaseCore":
  In Podfile:
    Firebase/Auth (= 6.10.0) was resolved to 6.10.0, which depends on
      Firebase/CoreOnly (= 6.10.0) was resolved to 6.10.0, which depends on
        FirebaseCore (= 6.3.1)

    Firebase/Auth (= 6.10.0) was resolved to 6.10.0, which depends on
      FirebaseAuth (~> 6.3.0) was resolved to 6.3.1, which depends on
        FirebaseCore (~> 6.2)

    Firebase/Core (= 6.10.0) was resolved to 6.10.0, which depends on
      FirebaseAnalytics (= 6.1.3) was resolved to 6.1.3, which depends on
        FirebaseCore (~> 6.3)

CocoaPods could not find compatible versions for pod "GoogleAppMeasurement":
  In Podfile:
    Firebase/Core (= 6.10.0) was resolved to 6.10.0, which depends on
      FirebaseAnalytics (= 6.1.3) was resolved to 6.1.3, which depends on
        GoogleAppMeasurement (= 6.1.3)

    Google-Mobile-Ads-SDK (~> 7.68) was resolved to 7.69.0, which depends on
      GoogleAppMeasurement (~> 7.0)

みたいなエラーが出てきます。いろんなサイトを調べてみたところ、「pod updateしろ」とか「pod installしろ」とか「pod repo updateしろ」とか「podfileのplatform:ios, 9.0を10.6に変えろ」とかありますが、どれも効果はありませんでした。
原因は上の方に書いているように、AdMobのバージョンに対しFirebaseのバージョンが低すぎます。Firebaseを7.*にアップデートします。
pod した時にignoring云々という警告がズラズラと出てきた場合は、sudo gem pristine –allします。パーミッションがどうこうと怒られる場合は、rubyの権限を変える必要があります。

rbenv install -l # rbenvでインストールできるrubyバージョンを確認
rbenv install 2.6.3 # rubyをrbenv管理下にする
vi .bash_profile # .bash_profileを編集

viを立ち上げたら、

export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

と.bash_profileに追記。ターミナルを再起動してwhich rubyで「/usr/bin/ruby」でなく「ホームディレクトリ.rbenv以下」になってたらOK

The type or namespace name ‘Editor’ does not exist in the namespace ‘Firebase.Unity’ (are you missing an assembly reference?)みたいなエラーが出る

上で説明しているように、using Firebase.Unity.Editor;を削除して、SetEditorDatabaseUrl()などの古いメソッドを置き換えます。

XCodeでビルド時にLexical or Preprocessor issue ‘preprocessor.h’ file not foundのようなエラーが出る

Unityで何かプラグインを入れるなどの変更があった後にAppendでiOSビルドすると起こる事が多いようです。
iOSビルドする時に、出力先のフォルダの中身を削除してからビルドするようにします。もしくはappendかreplaceか聞かれた時にreplaceにします。

テストをするとADMob関連でNSException例外が出てすぐ終了する

Exception	NSException *	"The Google Mobile Ads SDK was initialized without AppMeasurement. Google AdMob publishers, follow instructions here: https://googlemobileadssdk.page.link/admob-ios-update-plist to include the AppMeasurement framework and set the -ObjC linker flag. Google Ad Manager publishers, follow instructions here: https://googlemobileadssdk.page.link/ad-manager-ios-update-plist"	0x000000028291d710

デバッグ実行するとこういう例外が出て即座に止まります。
検索してもGADApplicationIdentifierを入れろというようなものばかり出てきますが、私の場合はそれでは解決せず、GADIsAdManagerAppをBoolean型で追加し、1を入れると解決しました。

iTunes StoreにアップロードするとUIRequiredDeviceCapabilitiesというエラーが出る

App Storeにバンドルをアップロードすると出て来るエラー。
このまま審査に出しても「This bundle is invalid. The key UIRequiredDeviceCapabilities in Info.plist may not contain values that would prevent this application from running on devices that were supported by previous version.」というのが即座に帰ってきます。
info.plistからKey:UIRequiredDeviceCapabilitiesをまるっと削除すると解決しました。古い形式をサポートするかどうかの設定みたいですが、設定ごと無くなったみたいです。

1 Star2 Stars3 Stars4 Stars5 Stars (まだ投票されていません)
読み込み中...

コメント

タイトルとURLをコピーしました