##このページの概要
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取得許可リクエストを行う」という実装をしている場合を考えてみます。
UNUserNotificationCenter.current().requestAuthorization(options: authOptions) { (result, options) in
ATTrackingManager.requestTrackingAuthorization { (status) in
//IDFA取得リクエスト結果に応じた処理をここに書く
}
}
上記コードでは、
プッシュ通知許可要求ダイアログのボタンが押された
↓
IDFA取得許可要求ダイアログを表示
という流れになるので一見正常に動作しそうに見えますが、実際にはこのコードではIDFA許可要求ダイアログは表示されません。
理由は、
requestTrackingAuthorizationが実行されるタイミングでは、
アプリの状態が Inactive になっているから
です。
プッシュ通知許可要求ダイアログのボタンが押された時点では、まだアプリが Inactive 状態から Active状態に戻っていないため、iOS15ではIDFA許可要求ダイアログは表示されません。
##解決方法
解決方法は簡単。Active状態になるまで少しだけ待ってあげれば良いです。
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
以上