はじめに
「ATTが表示されない」で検索すると同じ問題で記事を書いてる方が割といます。
それらの記事はDispatchQueue.main.asyncAfter(deadline: .now() + 1.0)
で遅延実行してATTを表示させてました。
1秒遅延させたら表示されないってことはなかなかないと思いますが、個人的には美しくないと思うので、別の解決策を考えました。
原因
おそらく、applicationState
がactive
になっている時にATTリクエストしないとアラートが表示されないっぽい?です。
applicationState
の確認方法です。
func debugApplicationState(mark: String) {
switch UIApplication.shared.applicationState {
case .active:
print("\(mark): active")
case .inactive:
print("\(mark): inactive")
case .background:
print("\(mark): background")
@unknown default:
print("\(mark): @unknown")
}
}
import SwiftUI
class AppDelegate: NSObject, UIApplicationDelegate {
func application(
_: UIApplication,
didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]? = nil
) -> Bool {
debugApplicationState(mark: "1") // background
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
debugApplicationState(mark: "2") // active
}
return true
}
}
@main
struct sampleApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup {
ContentView()
.onReceive(NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification)) { _ in
debugApplicationState(mark: "3") // active
}
}
}
}
解決方法
onReceive
でdidBecomeActiveNotification
を監視します。
import SwiftUI
import AppTrackingTransparency
@main
struct sampleApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup {
ContentView()
.onReceive(NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification)) { _ in
ATTrackingManager.requestTrackingAuthorization { status in
switch status {
case .notDetermined:
print("トラッキング許可の有無が未設定です")
case .restricted:
print("トラッキングが制限されています")
case .denied:
print("トラッキングが拒否されました")
case .authorized:
print("トラッキングが許可されました")
@unknown default:
print("不明な状態です")
}
}
}
}
}
}
おわり
AppDelegateのapplicationDidBecomeActive
はなぜか実行されていませんでした
なんで???笑