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

Google Consent SDK:如何在UserDefaults中存储‘Status’数组?

解决Consent表单重复展示的问题

我明白你的困扰——每次启动都弹表单确实很烦,咱们用UserDefaults来记录已经处理过的状态就能搞定!核心逻辑是先检查已存储的状态列表,再决定是否展示表单,而不是上来就加载。

具体实现步骤

  • 定义一个常量作为存储状态数组的Key,方便后续维护
  • 获取当前用户的PACConsentStatus
  • 从UserDefaults中读取已存储的状态数组(如果是第一次启动,就初始化一个空数组)
  • 判断当前状态是否在已存储的数组里:
    • 如果存在:直接跳过表单展示
    • 如果不存在:加载并展示表单,完成后把当前状态添加到数组,再存回UserDefaults

修改后的完整代码

// 定义存储用的Key,建议放在类的顶部或者全局常量文件里
static NSString *const kStoredConsentStatusesKey = @"StoredConsentStatuses";

- (void)checkAndShowConsentForm {
    // 1. 获取当前的consent状态
    PACConsentStatus currentStatus = PACConsentInformation.sharedInstance.consentStatus;
    
    // 2. 从UserDefaults读取已存储的状态数组
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSMutableArray *storedStatuses = [[defaults objectForKey:kStoredConsentStatusesKey] mutableCopy];
    // 如果是第一次启动,数组为空,初始化一个空的可变数组
    if (!storedStatuses) {
        storedStatuses = [NSMutableArray array];
    }
    
    // 3. 判断当前状态是否已经处理过
    NSNumber *currentStatusNumber = @(currentStatus);
    if ([storedStatuses containsObject:currentStatusNumber]) {
        // 状态已存在,不展示表单
        NSLog(@"当前状态已处理过,跳过Consent表单");
        return;
    }
    
    // 4. 状态未处理,加载并展示表单
    [form loadWithCompletionHandler:^(NSError *_Nullable error) {
        NSLog(@"加载完成。错误:%@", error);
        if (error) {
            // 处理错误
            return;
        }
        
        [form presentFromViewController:self dismissCompletion:^(NSError *_Nullable error, BOOL userPrefersAdFree) {
            if (error) {
                // 处理错误
                return;
            }
            
            if (userPrefersAdFree) {
                // 用户偏好付费版,这里可以添加对应的逻辑
            } else {
                // 更新当前consent状态(根据你的需求设置)
                PACConsentInformation.sharedInstance.consentStatus = PACConsentStatusPersonalized;
                // 把当前状态转换成NSNumber存入数组(因为UserDefaults不能直接存枚举)
                [storedStatuses addObject:currentStatusNumber];
                // 把更新后的数组存回UserDefaults
                [defaults setObject:storedStatuses forKey:kStoredConsentStatusesKey];
                [defaults synchronize]; // 可选,iOS 10+会自动同步,这里加上更保险
                NSLog(@"已将当前状态存入UserDefaults,下次启动不再展示表单");
            }
        }];
    }];
}

关键细节说明

  • 为什么用NSNumber存枚举?因为UserDefaults不能直接存储枚举类型,所以要把PACConsentStatus转换成NSNumber再存储和读取。
  • synchronize方法:在iOS 10及以上系统,UserDefaults会自动同步到磁盘,但手动调用可以确保数据立即保存,避免意外丢失。
  • 常量Key:用常量代替硬编码的字符串,能减少拼写错误,也方便后续修改。

这样修改后,只有当用户的consent状态从未被处理过的时候,才会展示表单,下次启动就不会再弹啦!

内容的提问来源于stack exchange,提问作者itzo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:01:14