#何をするか?
iOS15以降からIDFA許諾ダイアログを表示する方法が少し変わったのでメモ
#原因
Calls to the API only prompt when the application state is: UIApplicationStateActive. Calls to the API through an app extension do not prompt.
iOS15から新たな制限が加わり、「アプリの状態がActiveの時しか表示しない」ようになった模様。
以下公式ドキュメントになります。
https://developer.apple.com/documentation/apptrackingtransparency/attrackingmanager/3547037-requesttrackingauthorization
#これまでの実装
AppDelegteのdidFinishLaunchingWithOptionsでidfaの許諾処理を行なっていたが、ここが呼ばれる時点ではアプリの状態はInactiveなのでダイアログは表示されない。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
if #available(iOS 14, *) {
ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in
GADMobileAds.sharedInstance().start(completionHandler: nil)
})
} else {
// Fallback on earlier versions
GADMobileAds.sharedInstance().start(completionHandler: nil)
}
return true
}
#対応内容
ScenceDelegateのsceneDidBecomeActiveでidfa許諾処理を行うことで対応。
Active状態のはずだが、普通に処理を走らせるだけだとダイアログが表示されないので、処理を1秒遅らせることでidfa許諾ダイアログが表示されるようになりました。
func sceneDidBecomeActive(_ scene: UIScene) {
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
if #available(iOS 14, *) {
ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in
GADMobileAds.sharedInstance().start(completionHandler: nil)
})
} else {
GADMobileAds.sharedInstance().start(completionHandler: nil)
}
}
}