CloudKit存储PLIST文档异常:保存无报错但查询结果为空
排查解决步骤
- 首先打印查询返回的错误信息定位问题
你当前的代码只输出了results,没有打印error参数,先补充错误日志输出,可直接定位是权限、网络、索引缺失还是其他服务端错误:[[CKContainer defaultContainer].publicCloudDatabase performQuery:query inZoneWithID:nil completionHandler:^(NSArray *results, NSError *error) { NSLog(@"Results %@", results); NSLog(@"Query Error %@", error); // 补充这行 }]; - 确认CloudKit控制台的索引配置
CloudKit 所有查询操作都需要预先配置对应索引:- 打开苹果开发者后台进入CloudKit控制台,定位到你的应用对应的CloudKit容器,找到
RecordType对应的Schema配置 - 在「Indexes」标签下添加Queryable类型的索引,如果是查询全量记录,基于
recordName字段添加即可 - 检查「Security Roles」配置,确认
_public角色拥有该RecordType的Read权限
- 打开苹果开发者后台进入CloudKit控制台,定位到你的应用对应的CloudKit容器,找到
- 确认plist存储格式符合CloudKit要求
CKRecord不支持直接存储未序列化的NSDictionary/NSArray类型,你需要先将plist对象序列化为NSData后再存入CKRecord,读取后再反序列化:
如果你直接存入未序列化的集合对象,即使保存日志显示正常,服务端实际不会持久化该字段,也会导致查询异常。// 保存时序列化 NSData *plistData = [NSPropertyListSerialization dataWithPropertyList:plist format:NSPropertyListBinaryFormat_v1_0 options:0 error:nil]; record[@"key"] = plistData; // 读取时反序列化 NSData *readData = record[@"key"]; id plist = [NSPropertyListSerialization propertyListWithData:readData options:0 format:nil error:nil]; - 确认运行环境一致
CloudKit的开发(Development)和生产(Production)环境数据完全隔离:- Debug模式运行的App默认访问开发环境,TestFlight/App Store发布版默认访问生产环境
- 你可以在CloudKit控制台切换环境,查看对应环境下的
RecordType下是否存在已保存的记录,先确认数据确实已经成功写入服务端
- 避开同步延迟问题
CloudKit写入操作完成后,存在最多数秒的同步延迟,写入后立刻查询可能拿不到最新数据,可以在写入完成后延迟几秒再触发查询,或者写入成功后先本地缓存数据避免等待。
内容的提问来源于stack exchange,提问作者user717452
相关产品推荐
相关产品推荐

