Swift

iOS14关于IDFA获取权限调研

2020-09-10  本文已影响0人  GarrettGao

场景

Apple宣布 2020-9-16 发布iOS14新系统,iOS14系统具官网了解,如果需要获取IDFA(广告符),需要用户授权。我们公司合作的第三方广告目前都是通过IDFA在跟踪用户。
iOS13之前的版本可以直接获取,只要用户不手动去设置页面关闭。

所以小调研了一下。

测试设备:iPhone6,iOS14Beta7
开发工具:Xcode11

调用判断IDFA是否开启开关,无论设置里限制广告跟踪的开关是否打开,都是返回 false,但是直接获取却是正确的IDFA值。(不知道是不是iOS14Beta系统的bug)

import AdSupport
 
    // 是否可以获取IDFA,iOS14永远返回 false,但是打印 ASIdentifierManager.shared().advertisingIdentifier.uuidString 有值
    if ASIdentifierManager.shared().isAdvertisingTrackingEnabled {
        debugPrint("开着:\(ASIdentifierManager.shared().advertisingIdentifier.uuidString)")
    } else {
        debugPrint("关了:\(ASIdentifierManager.shared().advertisingIdentifier.uuidString)")
    }

打印结果:

"关了:7DE78ED0-3854-4840-A49C-2F33B9DC201B"

iOS14后正确的获取方式:

测试设备:iPhone6,iOS14Beta7
开发工具:Xcode12,Beta2

Xcode12引入新的Framework AppTrackingTransparency,代码如下:

import AdSupport
import AppTrackingTransparency
 
    if #available(iOS 14, *) {
             
        ATTrackingManager.requestTrackingAuthorization { (status) in
            switch status {
             case .denied:
                debugPrint("用户拒绝")
                break
            case .authorized:
                 debugPrint("用户允许")
                debugPrint("IDFA:\(ASIdentifierManager.shared().advertisingIdentifier.uuidString)")
                break
            case .notDetermined:
                debugPrint("用户没有选择")
            default:
                break
            }
        }
    } else {
        // iOS13及之前版本,继续用以前的方式
        if ASIdentifierManager.shared().isAdvertisingTrackingEnabled {
            debugPrint("可以获取:\(ASIdentifierManager.shared().advertisingIdentifier.uuidString)")
        } else {
            debugPrint("用户未打开IDFA开关")
        }
    }

同时 info.plist也要添加一个权限提示配置:
NSUserTrackingUsageDescription:Vaule为要提示用户授权的一句话,配置完成。

还有一个变动是,iOS14的广告跟踪权限放到了每个App的设置中,而不像之前在隐私全局设置中。


IMG_2EC8D9B22F3C-1.jpeg

启动App后,会类似推送或者定位的权限提示一样,有一个系统弹窗。


IMG_2294.PNG

结论:

如果有需要使用IDFA的App,或者和第三方广告有合作的App,需要产品层面设计上考虑,如果用户需选择“要求App不跟踪”,引导用户跳转到设置打开的流程。

技术需要考虑的问题

是要使用 AppTrackingTransparency,必须升级到Xcode12,如果升级到意味着要兼容iOS14,是否还有别的坑。
目前已经发现的坑是,UITableViewCell直接 cell.addSubView(viewTest), viewTest会无法触发到手势响应(像是被cell.contentView遮盖住了)。
必须改为 cell.contentView.sddSubView(viewTest),我们项目是通过这种方式全局兼容的。
不太清楚是不是 Xcode12Beta版本问题,因为目前正式版Xcode12还未发布。

也可以尝试:

如果我们不着急升级Xcode12,依然使用Xcode11暂时先打包;不判断广告符是否授权,直接获取,是不是依然可以获取到iOS14设备的真实IDFA?

目前拿一台iPhone6的iOS14Beta7测试是可以的,需要更多的测试结果来证明猜测。

上一篇下一篇

猜你喜欢

热点阅读