0
2

【SwiftUI】ATTが表示されない問題の解決策

Posted at

はじめに

「ATTが表示されない」で検索すると同じ問題で記事を書いてる方が割といます。
それらの記事はDispatchQueue.main.asyncAfter(deadline: .now() + 1.0)で遅延実行してATTを表示させてました。
1秒遅延させたら表示されないってことはなかなかないと思いますが、個人的には美しくないと思うので、別の解決策を考えました。

原因

おそらく、applicationStateactiveになっている時に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
                }
        }
    }
}

解決方法

onReceivedidBecomeActiveNotificationを監視します。

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はなぜか実行されていませんでした
なんで???笑

0
2
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
0
2