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以降にする
- AdMobをアップデートする
- Firebaseをアップデートする
- .mmファイルを作成する
- Unity用のスクリプトを作成
- Mac,XCodeでの設定
- おまけ:エラーなど対応まとめ
- AdMob SDKをアップデートするとUnityで色々エラーが出る
- CocoaPods could not find compatible versions for pod “FirebaseCore”みたいなエラーが出る
- The type or namespace name ‘Editor’ does not exist in the namespace ‘Firebase.Unity’ (are you missing an assembly reference?)みたいなエラーが出る
- XCodeでビルド時にLexical or Preprocessor issue ‘preprocessor.h’ file not foundのようなエラーが出る
- テストをするとADMob関連でNSException例外が出てすぐ終了する
- iTunes StoreにアップロードするとUIRequiredDeviceCapabilitiesというエラーが出る
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をまるっと削除すると解決しました。古い形式をサポートするかどうかの設定みたいですが、設定ごと無くなったみたいです。
コメント