iOS 15でATT(App Tracking Transparency)の許可ダイアログが表示されない場合の対処法

2022.07.14

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Apple Store Connectからアプリのリジェクトの通達を受けた。

Guideline 2.1 - Information Needed

We're looking forward to completing our review, but we need more information to continue. Your app uses the AppTrackingTransparency framework, but we are unable to locate the App Tracking Transparency permission request when reviewed on iOS 15.5.

レビューが完了するのを楽しみにしていますが、続行するにはさらに情報が必要です。アプリはAppTrackingTransparencyフレームワークを使用していますが、iOS 15.5で確認したときに、AppTrackingTransparency許可リクエストを見つけることができません。

ユーザーの追跡に使用できるデータが収集される前に許可リクエストが表示される必要があるのですが、それがiOS 15系で表示されておらず、審査リジェクトを受けてしまいました。

今回はこのリジェクトの対処法を調べたので記載しておきます。

環境

  • Xcode 13.2.1

前提

今回は、以前からAppTrackingTransparencyは実装していて審査通過していたが、なぜかiOS 15系で表示されなくなってリジェクトされた場合の対処法です。

ATTの許可リクエストとは

広告を導入しているアプリで見かける上記のようなリクエストになります。 ユーザーをトラッキングしたり、デバイスの広告識別子にアクセスしたりする許可をリクエストする為に使用します。

App Store Connectからのアドバイス

App Store Connectのリジェクトメールの中にはNext Stepsとして実装に関するアドバイスが記載されていました。

If you've implemented App Tracking Transparency but the permission request is not appearing on devices running the latest OS, please review the available documentation and confirm App Tracking Transparency has been correctly implemented.

App Tracking Transparencyを実装したが、最新のOSを実行しているデバイスに許可リクエストが表示されない場合は、ドキュメントを確認し、AppTrackingTransparencyが正しく実装されていることを確認してください。

ドキュメントを確認

ATTの許可ダイアログを表示させる為のメソッドrequestTrackingAuthorization(completionHandler:)のドキュメントを確認すると、

Calls to the API only prompt when the application state is UIApplicationStateActive. The authorization prompt doesn’t display if another permission request is pending user confirmation. Concurrent requests aren’t preserved by iOS, and calls to the API through an app extension don’t prompt. Check the trackingAuthorizationStatus for a status of ATTrackingManager.AuthorizationStatus.notDetermined to determine if you need to make an additional call.

APIの呼び出しは、アプリケーションの状態がUIApplicationStateActiveの場合にのみ行われ、表示します。別の許可リクエストがユーザーの確認を保留している場合、この許可リクエストは表示されません。同時リクエストはiOSによって保持されず、アプリ拡張機能を介したAPIの呼び出しはプロンプトを表示しません。追加の呼び出しを行う必要があるかどうかを判断するには、trackingAuthorizationStatusでATTrackingManager.AuthorizationStatus.notDeterminedのステータスを確認してください。

対策案

ドキュメントの内容から、

  • アプリケーションの状態がUIApplicationStateActiveの時にリクエストを表示するようにする
  • 別の許可リクエストの呼び出しタイミングと被らないようにする
  • リクエストの呼び出しを行う際は、AuthorizationStatus.notDeterminedのステータスを確認する

こちらの内容で修正していくことにしました。

対策

アプリケーションがアクティブの時にリクエストを行う

AppDelegateのみの場合

AppDelegateのみの場合は、AppDelegateapplicationDidBecomeActive内で許可リクエストの呼び出しを行います。

func applicationDidBecomeActive(_ application: UIApplication) {
  // ここで許可リクエストを行う
   requestAppTrackingTransparencyAuthorization()
}

SceneDelegateがある場合

SceneDelegateがある場合は、sceneDidBecomeActive内で許可リクエストの処理を行います。

func sceneDidBecomeActive(_ scene: UIScene) {
  // ここで許可リクエストを行う
   requestAppTrackingTransparencyAuthorization()
}

次にrequestAppTrackingTransparencyAuthorization()について説明していきます。

許可リクエストを表示する

リクエストを表示する際に、別のリクエストと呼び出しのタイミングを被らないようにしつつ、AuthorizationStatusが.notDeterminedの場合にだけリクエストを行うようにします。

private func requestAppTrackingTransparencyAuthorization() {
    if #available(iOS 14.5, *) {
                // .notDeterminedの場合にだけリクエスト呼び出しを行う
        guard ATTrackingManager.trackingAuthorizationStatus == .notDetermined else { return }

        // タイミングを遅らせる為に処理を遅延させる
        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
            ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in
                // リクエスト後の状態に応じた処理を行う
            })
        }
    }
}

プッシュ通知等の許可リクエストが同じようなタイミングで呼ばれてしまう場合だと、ATTの許可リクエストが表示されなかった為、DispatchQueue.main.asyncAfter(deadline: .now() + 1.0)でATT許可リクエストの処理を1秒遅延させると表示されるようにしました。

結果

無事に審査を通過しました!

おわりに

今回はレビュワーからの真摯なアドバイスもあり無事に解決に辿り着きました。OSによって挙動が若干変わることがあるので、テストの際はOSのメジャーバージョンを網羅的に確認しておきたいですね。

この記事が誰かの救いになれば幸いです。

参考