SwiftUI中AppTransparencyTracking功能不生效,遗漏了什么配置?
SwiftUI IDFA权限申请异常修复方案
你当前通过@UIApplicationDelegateAdaptor关联自定义AppDelegate的写法是正确的,功能无法运行是由以下几个遗漏配置和代码问题导致的:
1. 修复AppDelegate代码逻辑错误
现有代码存在两个明显问题:
requestIDFA方法被嵌套定义在didFinishLaunchingWithOptions方法内部,且没有被主动调用didFinishLaunchingWithOptions方法没有返回布尔值,会触发编译异常
修正后的完整代码如下:
import AppTrackingTransparency import AdSupport class AppDelegate: NSObject, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { // 应用启动完成后主动调用IDFA请求方法 requestIDFA() return true } // 将IDFA请求方法移至类层级定义 func requestIDFA() { // 新增iOS 14.5+版本判断,低于该版本无需申请权限可直接获取IDFA if #available(iOS 14.5, *) { ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in // 权限申请完成后在此处加载广告 // loadAd() }) } else { let idfa = ASIdentifierManager.shared().advertisingIdentifier.uuidString // 低版本直接加载广告 // loadAd() } } }
2. 添加Info.plist隐私权限声明
必须在项目Info.plist中添加用户追踪权限的描述文案,否则系统会直接拦截权限申请弹窗,不会向用户展示:
- 右键Info.plist选择
Open As -> Source Code - 在
<dict>标签内部添加如下键值对:
<key>NSUserTrackingUsageDescription</key> <string>需要获取您的广告标识符以向您推送适配的个性化内容</string>
描述文案可根据实际业务场景调整,不能为空,否则会被App Store审核驳回
3. 调整调用时机适配系统规则
ATTrackingManager的权限申请仅能在应用进入前台活跃状态后触发,如果你遇到启动阶段弹窗不弹出的情况,可以将requestIDFA的调用时机调整到首屏页面的onAppear回调中执行,避免在应用未完成启动的阶段调用被系统忽略。
内容的提问来源于stack exchange,提问作者vinny
相关产品推荐
相关产品推荐

