使用 IOS 13 编译的应用程序的 IOS14 跟踪权限
Posted
技术标签:
【中文标题】使用 IOS 13 编译的应用程序的 IOS14 跟踪权限【英文标题】:IOS14 tracking permission for apps compiled with IOS 13 【发布时间】:2020-12-07 09:39:55 【问题描述】:在 ios14 中要使用Advertising Identifier
,您需要请求许可,但是 AppStore 上已经可用的应用程序的行为是什么(使用 IOS13 SDK 编译)?
我已将设备更新到 IOS14 Beta 4 并从 AppStore 下载了应用程序。一旦我打开应用程序,它不会自动请求任何跟踪权限,Advertising Identifier
是00000-0000-0000
。
这是否意味着我必须提交使用 IOS14 SDK 编译的应用更新并请求跟踪权限,否则 Advertising Identifier
将不可用?
【问题讨论】:
【参考方案1】:是的,您需要提交新的应用版本。它不会自动请求跟踪权限,因为它应该通过开发人员实例化。
因此,您需要使用AppTrackingTransparency
框架并请求用户许可:
if #available(iOS 14, *)
ATTrackingManager.requestTrackingAuthorization _ in
else
// Fallback on earlier versions
【讨论】:
【参考方案2】:您必须从 ios 14 实现 AppTrackingTransparency
才能显示跟踪权限。通过这个实现,您可以收集 IDFA。
在 AppDelegate 中执行此操作
import AppTrackingTransparency
在didFinishLaunchingWithOptions launchOptions
写这样的函数
if #available(iOS 14, *)
self.requestIDFAPermission()
然后写这个函数
func requestIDFAPermission()
if #available(iOS 14, *)
let semaphore = DispatchSemaphore(value: 0)
DispatchQueue.main.async
ATTrackingManager.requestTrackingAuthorization (status) in
if (status == .authorized)
let idfa = ASIdentifierManager.shared().advertisingIdentifier
print("IDFA: " + idfa.uuidString)
else
print("Failed to get IDFA")
semaphore.signal()
semaphore.wait()
还有一件事。您应该在 Plist 中添加Privacy - Tracking Usage Description
。
【讨论】:
这会导致死锁,因为 AppDelegate 已经在主线程上运行。您正在等待主线程上的信号量信号,因此异步块无法执行。作为另一项改进,当您已经在函数本身中执行此操作时,无需检查 ios 14 的可用性。以上是关于使用 IOS 13 编译的应用程序的 IOS14 跟踪权限的主要内容,如果未能解决你的问题,请参考以下文章
命令 MergeSwiftModule 失败,退出代码为非零:为 iOS 13.0 编译,但模块“xxxTests”的最低部署目标为 iOS 14.2:
一个额外的 UITableViewCellContentView 覆盖出现在 iOS 14 上的 TableView 中,防止点击,但在 iOS 13 上工作正常
从 iOS 13.6.1 升级到 iOS 14 时应用行为发生变化