我的应用程序因显示 GDPR(Google 的 UMP)和 ATT 使用户感到困惑而被 Apple 拒绝。具体来说,如果用户位于欧洲经济区,GDPR 将首先显示。这时ATT才开始出现。根据苹果公司的要求:“如果用户拒绝一次跟踪权限,请勿要求他们在同一权限请求流程中再次允许跟踪。在用户授予跟踪权限之前,不应有任何跟踪活动”。所以我需要知道用户填写 GDPR 表单的结果,以便我可以决定是否显示 ATT。
我还是没有解决办法。
这是我的代码
func setupAdvertisement() {
fatalError("This method must be overridden in the subclass")
}
func requestATTAuthorization() {
if #available(iOS 14.5, *) {
let trackingAuthorizationStatus = ATTrackingManager.trackingAuthorizationStatus
if trackingAuthorizationStatus == .notDetermined {
ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in
})
}
}
}
func showAdvertisement() {
if #available(iOS 14.5, *) {
let trackingAuthorizationStatus = ATTrackingManager.trackingAuthorizationStatus
if trackingAuthorizationStatus == .notDetermined {
ATTrackingManager.requestTrackingAuthorization(completionHandler: { [weak self] status in
DispatchQueue.main.async {
self?.setupAdvertisement()
}
})
} else {
DispatchQueue.main.async {
self.setupAdvertisement()
}
}
} else {
DispatchQueue.main.async {
self.setupAdvertisement()
}
}
}
@objc func showAdBasedOnConsentStatus() {
let consentStatus = UMPConsentInformation.sharedInstance.consentStatus
switch consentStatus {
case UMPConsentStatus.required:
loadForm()
case UMPConsentStatus.obtained:
showAdvertisement()
case UMPConsentStatus.notRequired:
showAdvertisement()
case UMPConsentStatus.unknown:
print("Error showAdBasedOnConsentStatus()")
@unknown default:
print("Error showAdBasedOnConsentStatus()")
}
}
func UMPSetup() {
let parameters = UMPRequestParameters()
parameters.tagForUnderAgeOfConsent = false
UMPConsentInformation.sharedInstance.requestConsentInfoUpdate(
with: parameters,
completionHandler: { [weak self] error in
if let error = error {
print(error)
} else {
let formStatus = UMPConsentInformation.sharedInstance.formStatus
if formStatus == UMPFormStatus.available {
self?.loadForm()
} else {
self?.requestATTAuthorization()
}
}
})
}
func loadForm() {
UMPConsentForm.load(completionHandler: { form, loadError in
if loadError != nil {
} else {
if UMPConsentInformation.sharedInstance.consentStatus == UMPConsentStatus.required {
form?.present(from: self, completionHandler: { dismissError in
if UMPConsentInformation.sharedInstance.consentStatus == UMPConsentStatus.obtained {
self.showAdBasedOnConsentStatus()
}
self.loadForm()
})
} else {
}
}
})
}
首先,除了 GDPR 同意书之外,您还应该让
UMP
处理 IDFA 消息。这样您就不需要在代码中显示 IDFA 消息。 Here解释了如何实现它,非常简单,不需要代码,您只需要编辑plist
文件,链接ATT
框架并在您的AdMob配置文件上创建IDFA消息。我现在无法真正对其进行测试,但我认为 Google 足够聪明,可以为您解决问题,因为这是 Apple 的要求。
如果情况并非如此,另一个用户提供了一个“很棒的解决方案”,可以让您了解设置后的用户 GDPR 首选项。我最近对此进行了测试,它仍然有效。
既然是关于IDFA的,我想你应该看看canShowPersonalizedAds()
方法。
我们不会将 UMP 用于
IDFA,仅用于 GDPR。 但是我认为如果你不使用 Google 的 UMP,那么关于实现的总体思路:
从代码中手动显示 IDFA 提示(Apple 的本机
UIAlert
Allow tracking
或 Ask App Not to Track
)消除 IDFA 提示后,请出示 GDPR 同意书。但仅适用于 EU/EEU/UK 用户,如果不是 EU/EEU/UK 用户,请继续下一步。由于我们是在 Apple 平台上,所以我会先选择 IDFA,然后再选择 GDPR。
⬇️ 这里还建议了苹果拒绝电子邮件/消息中的“下一步”:⬇️
如果用户拒绝一次跟踪权限,请勿要求他们在同一权限请求流程中再次允许跟踪。在用户授予跟踪权限之前,不应进行任何跟踪活动。如果您在应用跟踪透明度权限请求中选择“要求应用不跟踪”后收集数据,请修改 GDPR 提示并明确您收集数据但不跟踪。
如果您的应用在显示应用跟踪透明度权限请求之前显示了 GDPR 提示,则无需修改 GDPR 提示的措辞。