一、问题描述

苹果IDFA新政并非其调整设备标识符的首次尝试,其此前已相继禁止读取IMEI、IMSI、UDID等标识符。谷歌2019年也限制获取Android Q标识符。目前,世界各国对标识符获取使用的监管立法明显滞后于行业发展,设备标识符的收紧还只是底层操作系统厂商的自发行为。设备标识符全都掌握在操作系统厂商手中,软件对硬件的依附关系决定了软件开发者获取设备标识符的被动地位。是否硬件设备厂商基于底层操作系统的优势,可以自顾自地制定规则,禁止用户在该操作系统安装其他竞争性应用、限制应用内打赏的支付渠道、就应用内打赏收取一定比例的分成等,而软件开发者只能顺从?在软硬件厂商的互动博弈中,硬件设备厂商改动操作系统的平台权力边界值得关注。
——摘自《澎湃新闻》

苹果在iOS14及后续系统中启用ATT框架,限制应用读取用户设备的广告标识符IDFA,以保护用户隐私。意味着此前在系统层面默认开启的IDFA权限将下沉到应用层面,且默认关闭。该权限一旦关闭,精准营销就将彻底丧失生命力。

本次项目上实现了广告SDK的接入的功能,由于个性化广告的存在需要实现请求IDFA(否则影响收益),项目存在开屏、首页以及支付三个位置的广告,经考虑将权限请求放置于首页广告展示之前。

ios开发请求获取用户位置 申请获取idfa信息_开发语言

二、实现方法

查阅苹果官方文档Asidentifiermanager的相关内容后,发现原有的确认是否授权的方法ASIdentifierManager.shared().isAdvertisingTrackingEnabled已弃用,提示功能已经被应用跟踪透明框架所取代。

Warning
This property is deprecated. Functionality has been replaced by the App Tracking Transparency framework.

ios开发请求获取用户位置 申请获取idfa信息_ios开发请求获取用户位置_02


继续往下看苹果官方文档ATTrackingmanager的相关内容,发现可以通过使用ATTrackingManager.requestTrackingAuthorization方法来请求权限。

ios开发请求获取用户位置 申请获取idfa信息_swift_03


至此理论问题解决,开始编写代码。

三、代码展示

1 IDFA权限请求方法

⚠️注意:
(1)原项目存在开屏、首页以及支付完成三个位置的广告,且单独控制开关,在任一位置广告存在的条件下即请求;
(2)由前文“苹果在iOS14及后续系统中启用ATT框架”可知,请求权限的条件应限制为iOS14以及之后的版本;
(3)该请求仅提示一次,不论用户选择授权或拒绝,都不会再次提示。

if HYConfig.shareConfig.isShowAdd1 == true || HYConfig.shareConfig.isShowAdd2 == true || HYConfig.shareConfig.isShowAdd3 == true {
	if #available(iOS 14, *) {
		ATTrackingManager.requestTrackingAuthorization {[self] status in
			print("请求IDFA状态: \(status)");
			if status == .authorized {
				print("获取到IDFA: \(ASIdentifierManager.shared().advertisingIdentifier)");
			}
			self.showHomeAd();
		}
	} else {
		self.showHomeAd();
	}
}

2 广告展示方法

⚠️注意:
由于各项目需求不同,该方法仅作展示,不过应注意首页广告需延迟展示。

func showHomeAd() {
	if (HYConfig.shareConfig.isShowAdd2 == true) {
		let time: TimeInterval = 1
		DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + time) {
			HYAdCore.shareCore.runInteractionAd(posId: HYAdCore.POS_AD_ID1, vc: self);
		}
	} else {
		print("首页不展示广告");
	}
}