Swift/iOS解析Google GDPR同意字符串及合规政策问询
关于AdMob GDPR合规与应用权限限制的政策疑问
我正在为2024年1月AdMob要求的欧盟GDPR合规做准备,发现如果用户选择不同意权限,或是通过“管理选项”设置的权限组合不符合要求,AdMob将无法填充广告。
我找到一个Android端解析UMP同意字符串的方案,可以根据用户的同意表单响应判断AdMob广告是否可投放,并且已经将相关辅助方法转换为iOS的Swift代码,分享如下:
//MARK: GDPR: 解析Google UMP同意字符串 func fetchUserDefault(forKey: String) -> String { let prefs = UserDefaults.standard if let value = prefs.string(forKey: forKey) { return value } else { return ""; } } func canShowAds() -> Bool { let purposeConsent = self.fetchUserDefault(forKey: "IABTCF_PurposeConsents"); let vendorConsent = self.fetchUserDefault(forKey: "IABTCF_VendorConsents"); let vendorLI = self.fetchUserDefault(forKey: "IABTCF_VendorLegitimateInterests"); let purposeLI = self.fetchUserDefault(forKey: "IABTCF_PurposeLegitimateInterests"); /* 最终用户需授予Google以下同意权限: 存储和/或访问设备上的信息(用途1) Google基于合法利益(或发布商配置CMP请求的同意)可执行: 选择基础广告(用途2) 衡量广告效果(用途7) 开展市场调研以生成受众洞察(用途9) 开发和改进产品(用途10) 对于个性化广告: 创建个性化广告档案(用途3) 选择个性化广告(用途4) 必须在供应商偏好列表中同意Google广告产品,才能获取AdMob广告 */ let googleId = 755; let hasGoogleVendorConsent = self.hasAttribute(vendorConsent, googleId); let hasGoogleVendorLI = self.hasAttribute(vendorLI, googleId); var indexes = [Int](); indexes.append(1); var indexesLI = [Int](); indexesLI.append(2); indexesLI.append(7); indexesLI.append(9); indexesLI.append(10); return self.hasConsentFor(indexes, purposeConsent, hasGoogleVendorConsent) && self.hasConsentOrLegitimateInterestFor(indexesLI, purposeConsent, purposeLI, hasGoogleVendorConsent, hasGoogleVendorLI); } func canShowPersonalizedAds() -> Bool { let purposeConsent = self.fetchUserDefault(forKey: "IABTCF_PurposeConsents"); let vendorConsent = self.fetchUserDefault(forKey: "IABTCF_VendorConsents"); let vendorLI = self.fetchUserDefault(forKey: "IABTCF_VendorLegitimateInterests"); let purposeLI = self.fetchUserDefault(forKey: "IABTCF_PurposeLegitimateInterests"); let googleId = 755; let hasGoogleVendorConsent = self.hasAttribute(vendorConsent, googleId); let hasGoogleVendorLI = self.hasAttribute(vendorLI, googleId); var indexes = [Int](); indexes.append(1); indexes.append(3); indexes.append(4); var indexesLI = [Int](); indexesLI.append(2); indexesLI.append(7); indexesLI.append(9); indexesLI.append(10); return self.hasConsentFor(indexes, purposeConsent, hasGoogleVendorConsent) && self.hasConsentOrLegitimateInterestFor(indexesLI, purposeConsent, purposeLI, hasGoogleVendorConsent, hasGoogleVendorLI); } private func hasConsentFor(_ indexes: [Int], _ purposeConsent: String, _ hasVendorConsent: Bool) -> Bool { for p in indexes { if (!self.hasAttribute(purposeConsent, p)) { return false; } } return hasVendorConsent; } private func hasAttribute(_ input: String, _ index: Int) -> Bool { let characters = Array(input) ///扩展方法:使用"return Array(self)" if (characters.count < index-1) { return false } let indexValue = characters[index-1] return (indexValue == "1") } private func hasConsentOrLegitimateInterestFor(_ indexes: [Int], _ purposeConsent: String, _ purposeLI: String, _ hasVendorConsent: Bool, _ hasVendorLI: Bool) -> Bool { for p in indexes { let purposeAndVendorLI = self.hasAttribute(purposeLI, p) && hasVendorLI; let purposeConsentAndVendorConsent = self.hasAttribute(purposeConsent, p) && hasVendorConsent; let isOk = purposeAndVendorLI || purposeConsentAndVendorConsent; if (!isOk) { return false; } } return true; }
现在我已经能通过解析同意字符串判断应用是否可以投放AdMob广告,想咨询:如果因为用户的权限配置导致无法展示广告,进而限制用户使用应用,是否违反App Store或Google Play的相关政策?
政策判断
直接因用户权限配置无法展示广告而限制应用使用的行为违反App Store和Google Play的核心政策,具体依据如下:
App Store 政策要求
- 依据Apple《App Store审核指南》,应用不得因用户拒绝非必要权限或隐私选择而限制核心功能使用。若应用依赖广告变现,必须提供无广告的替代访问方式(如付费解锁),或确保核心功能不依赖广告展示。
- 隐私选择需为「opt-in」模式,不得将权限同意作为应用使用的强制条件,除非权限是应用核心功能的必需项(广告权限显然不属于此范畴)。
Google Play 政策要求
- 依据Google Play《开发者政策中心》,应用不得因用户拒绝广告相关权限或隐私同意而限制核心功能使用。开发者必须保证用户即使拒绝个性化广告或所有广告权限,仍能正常使用应用核心功能。
- Google明确要求,广告变现类应用需提供合理替代方案,不得将广告权限与应用访问权绑定。
合规建议
- 若应用依赖广告变现,当无法展示广告时,可提供免费非广告变现替代方案(如合规展示非个性化广告),或提供付费移除广告/解锁完整功能的选项。
- 禁止将广告权限作为应用核心功能的前置条件,核心功能必须对所有用户开放,无论其隐私选择如何。
内容的提问来源于stack exchange,提问作者danny
相关产品推荐
相关产品推荐

