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
相关产品推荐
相关产品推荐

