iOS15ではアプリ起動時にATTダイアログが出ません。
ドキュメントでは以下の様に書いてあります。
Calls to the API only prompt when the application state is: UIApplicationStateActive
. Calls to the API through an app extension do not prompt.
requestTrackingAuthorization(completionHandler:) | Apple Developer Documentation
The request for user authorization to access app-related data.
つまり起動時はアクティブでないのでダメと言うことです。
NGパターン
AdMobを使用する例です。
import SwiftUI
import AppTrackingTransparency
import GoogleMobileAds
@main
struct SplitBrowserApp: App {
init(){
ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in
GADMobileAds.sharedInstance().start(completionHandler: nil)
}
}
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
Appのイニシャライザではアプリケーションがアクティブでない為まだダメです。
ContentsViewのイニシャライザも同様に動きません。
Viewの表示が出来ていないとダメな為、イニシャライザやonAppearではダイアログが出ません。
対処法
初回起動時にSheetを出しonDisappearでATTダイアログを出しています。
私のアプリは初回起動時にアプリの簡単な説明を表示しているので、それを利用しました。
説明等が不要な場合でもATTダイアログの説明等を挟むようにすると良いと思います。
import SwiftUI
import AppTrackingTransparency
import GoogleMobileAds
struct ContentView: View {
@AppStorage("FirstLaunch") var firstLaunch = true
init(){
if !self.firstLaunch {
ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in
GADMobileAds.sharedInstance().start(completionHandler: nil)
})
}
}
var body: some View {
MainView()
.sheet(isPresented: self.$firstLaunch){
Text("FirstLaunch").onDisappear{
ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in
GADMobileAds.sharedInstance().start(completionHandler: nil)
})
}
}
}
}
AppStorageで初回起動かどうか判断します。
AppStorageはプロパティラッパーなのでそのままsheetのisPresentedに使用できます。
sheetを閉じるとfalseになり保存されるので2回目以降は出ません。
sheetの表示がなくてもAdMobの初期化をしたいのでイニシャライザにも入れておきます。
初回起動時に先にここを通るとダイアログが表示されないのでfirstLaunchを見て判断します。
コメント
[…] 【SwiftUI】iOS15でのATT(AppTrackingTransparency)対応iOS15ではアプリ起動時にATTダ…SwiftSwiftUIAdMobAppStorageSwiftSwiftUIUserDefaultsシェアする Twitter Facebook はてブ Pocket LINE コピーthwork.devをフォローする thwork.dev thwork […]