don*_*han 14 ios swift swiftui apptrackingtransparency ios15
在 iOS 14 中,当应用程序在 SwiftUI 中启动时,它可以显示 ATT(应用程序跟踪透明度)对话框,如下所示。
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
}
Run Code Online (Sandbox Code Playgroud)
但是,在 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 })
}
}
}
Run Code Online (Sandbox Code Playgroud)
Sid*_*ide 14
而不是在didFinishLaunchingWithOptions调用applicationDidBecomeActive中调用应用程序跟踪透明度权限,它将解决您的问题
在应用程序委托中
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
}
}
Run Code Online (Sandbox Code Playgroud)
在信息.plist中
<key>NSUserTrackingUsageDescription</key>
<string>Reason_for_data_tracking</string>
Run Code Online (Sandbox Code Playgroud)
正如 @donchan 已经提到的,使用以下代码:
struct HomeView: View {
var body: some View {
VStack {
Text("Hello!")
}.onReceive(NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification)) { _ in
ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in })
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 -1
如果您正在编写 SwiftUI 应用程序,则可以在开始屏幕上触发它。
struct HomeView: View {
var body: some View {
VStack {
Text("Hello!")
}.onAppear {
ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in })
}
}
}
Run Code Online (Sandbox Code Playgroud)
不要忘记将必要的添加内容添加到 .plist 中。
<key>NSUserTrackingUsageDescription</key>
<string>...</string>
Run Code Online (Sandbox Code Playgroud)
因此,它将在模拟器或真实设备上运行。
| 归档时间: |
|
| 查看次数: |
9863 次 |
| 最近记录: |