You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 13:36:04