适配iPad的iOS应用在M1 Mac上无法触发追踪授权,如何正确请求权限?
解决「专为iPad设计」的iOS App在M1 Mac上无法请求追踪权限的问题
核心限制说明
苹果官方明确:通过「Mac(专为iPad设计)」部署的iOS移植App,无法调用ATTrackingManager.requestTrackingAuthorization弹出授权对话框,且调用trackingAuthorizationStatus始终返回.notDetermined。这是因为这类App的追踪权限完全由用户在系统设置中手动控制,App没有主动发起请求的权限。
可行解决方案
1. 调整App权限请求逻辑
针对iOS App运行在Mac上的场景,修改现有代码:
- 先判断当前运行环境是否为Mac平台
- 若为Mac平台,跳过
requestTrackingAuthorization调用,改为引导用户手动开启权限
修改后的示例代码:
if #available(iOS 14, *) { // 判断是否是iOS App运行在Mac上 if ProcessInfo.processInfo.isiOSAppOnMac { // 引导用户前往系统设置开启追踪权限 let alert = UIAlertController(title: "需要追踪权限", message: "请前往系统设置 > 隐私与安全性 > 追踪,开启允许本App追踪的权限", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "前往设置", style: .default) { _ in guard let settingsUrl = URL(string: UIApplication.openSettingsURLString) else { return } UIApplication.shared.open(settingsUrl) }) alert.addAction(UIAlertAction(title: "取消", style: .cancel)) // 注意:需在主线程弹出alert DispatchQueue.main.async { self?.present(alert, animated: true) } } else { // 非Mac平台,正常请求权限 ATTrackingManager.requestTrackingAuthorization { [weak self] status in switch status { case .authorized: DispatchQueue.main.async { self?.didTrackingAuthorized?() } case .denied: print("FB - Denied") case .notDetermined: self?.setup() print("FB - Not Determined") case .restricted: print("FB - Restricted") @unknown default: print("FB - Unknown") } } } }
2. 转为Mac Catalyst App(可选,若需主动弹窗请求)
如果你的业务需要主动弹出追踪授权对话框,可将App从「专为iPad设计」转为Mac Catalyst App:
- 在Xcode的项目设置中,将部署目标改为「Mac Catalyst」
- 确保Info.plist中添加
NSUserTrackingUsageDescription键,描述追踪用途 - 此时调用
ATTrackingManager.requestTrackingAuthorization会在macOS上正常弹出授权对话框,和iOS平台逻辑一致
注意事项
- 无论哪种方案,都必须在Info.plist中配置
NSUserTrackingUsageDescription,否则即使在支持的平台也会请求失败 - 引导用户前往设置时,需明确告知操作路径,避免用户找不到对应的设置项
内容的提问来源于stack exchange,提问作者Melany
相关产品推荐
相关产品推荐

