15
11

More than 1 year has passed since last update.

iOS15でのIDFA許可要求の仕様変更とその対応方法

Last updated at Posted at 2021-09-27

このページの概要

IDFA取得許可リクエストを行ってダイアログを表示する処理について、
iOS15以降では、アプリの状態が Active の場合にリクエストしないと
ダイアログが表示されなくなりました。

特に注意が必要なのは、位置情報やプッシュ通知などの許可要求と連続でリクエストしたり、
他のリクエストのcompletionHandler内で実行している場合です。

問題が発生するパターンと、その対応方法について記載しています。

iOS15で新たに加わった制限の内容

公式ドキュメント

に以下の記載があります。

Calls to the API only prompt when the application state is: UIApplicationStateActive. Calls to the API through an app extension do not prompt.

「アプリの状態がActiveの時しかプロンプトを表示しないよ」とのこと。

【参考】iOSアプリのライフサイクル(Active, Inactive, Backgroud)については下記ページでわかりやすく解説されています。

発生する問題

例として、「プッシュ通知許可リクエスト完了時に、IDFA取得許可リクエストを行う」という実装をしている場合を考えてみます。

NGパターン.swift
UNUserNotificationCenter.current().requestAuthorization(options: authOptions) { (result, options) in
    ATTrackingManager.requestTrackingAuthorization { (status) in
        //IDFA取得リクエスト結果に応じた処理をここに書く
    }
}

上記コードでは、

 プッシュ通知許可要求ダイアログのボタンが押された
  ↓
 IDFA取得許可要求ダイアログを表示

という流れになるので一見正常に動作しそうに見えますが、実際にはこのコードではIDFA許可要求ダイアログは表示されません。

理由は、

 requestTrackingAuthorizationが実行されるタイミングでは、
 アプリの状態が Inactive になっているから

です。

プッシュ通知許可要求ダイアログのボタンが押された時点では、まだアプリが Inactive 状態から Active状態に戻っていないため、iOS15ではIDFA許可要求ダイアログは表示されません。

解決方法

解決方法は簡単。Active状態になるまで少しだけ待ってあげれば良いです。

OKパターン.swift
UNUserNotificationCenter.current().requestAuthorization(options: authOptions) { (result, options) in
    DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
        ATTrackingManager.requestTrackingAuthorization { (status) in
            //IDFA取得リクエスト結果に応じた処理をここに書く
        }
    }
}

asyncAfterで1秒ほど呼び出しを遅らせてあげればOKです。
これでiOS15でもIDFA許可要求ダイアログが表示されます。

動作確認環境

Xcode: 13
iOS: 15.0

以上

15
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
11