ios - iOS 15:如何在 SwiftUI 中启动应用程序时显示 ATT 对话框
问题描述
在 iOS 14 中,它可以在 SwiftUI 中启动应用程序时显示 ATT(App Tracking Transparency)对话框,如下所示。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
if #available(iOS 14, *) {
ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in
// loadAd()
})
} else {
// loadAd()
}
return true
}
但是,在 iOS 15.0 中,它不起作用。苹果文档描述如下。
仅当应用程序状态为:UIApplicationStateActive 时才提示调用 API。通过应用扩展调用 API 不会提示。 https://developer.apple.com/documentation/apptrackingtransparency/attrackingmanager/3547037-requesttrackingauthorization
当应用程序在 iOS 15 中启动时如何显示 ATT 对话框?
2021/9/28 更新 我解决了如下。
struct HomeView: View {
var body: some View {
VStack {
Text("Hello!")
}.onReceive(NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification)) { _ in
ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in })
}
}
}
解决方案
而不是在 applicationDidBecomeActive 中调用didFinishLaunchingWithOptions调用应用程序跟踪透明度权限,它将解决您的问题
在AppDelegate中
func applicationDidBecomeActive(_ application: UIApplication) {
requestDataPermission()
}
func requestDataPermission() {
if #available(iOS 14, *) {
ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in
switch status {
case .authorized:
// Tracking authorization dialog was shown
// and we are authorized
print("Authorized")
case .denied:
// Tracking authorization dialog was
// shown and permission is denied
print("Denied")
case .notDetermined:
// Tracking authorization dialog has not been shown
print("Not Determined")
case .restricted:
print("Restricted")
@unknown default:
print("Unknown")
}
})
} else {
//you got permission to track, iOS 14 is not yet installed
}
}
在info.plist
<key>NSUserTrackingUsageDescription</key>
<string>Reason_for_data_tracking</string>
推荐阅读
- python - 将多个 2D 数据集堆叠到新的第三维(xarray)
- css - 使用两个相同的属性选择器 [class][class]
- java - 如何使用多态性从模型类创建 GUI 类
- php - 从 webm 10sec 块创建 HLS 流
- php - 如何在 Yii2 中仅以 json 格式响应错误?
- python - Python class setter - are class attributes reassigned every time a new instance is created?
- javascript - moo 词法分析器是否支持所有正则表达式语法?
- laravel - Laravel 作业批处理:PendingDispatch::__invoke() 不存在
- vim - 有人可以提供 Vim 命令 gqip 的分解描述吗?
- android - 如何控制在我的应用程序的后台活动期间在颤动/飞镖中创建的对象?