CloudKit CKSubscription生产环境失效 无法部署订阅至生产环境
CKSubscription生产环境失效、开发环境订阅不在Dashboard显示的解决方法
首先明确核心权限规则:
只有**公共数据库(Public)**的CKSubscription属于容器全局Schema资源,禁止直接在生产环境创建,必须从开发环境部署生效;私有数据库(Private)、共享数据库(Shared)的订阅是绑定单个iCloud用户的用户级资源,生产环境允许客户端正常创建,不会触发权限错误。
你遇到的报错attempting to create a subscription in a production container,只会在向生产环境的公共数据库写入订阅时触发,结合你看不到开发环境订阅的问题,分场景处理:
场景1:你实际使用的是私有/共享数据库订阅
这种情况不需要走Dashboard部署流程,你遇到报错基本是三个原因:
- 代码错将订阅写入了公共数据库,而非你预期的私有/共享数据库,检查你调用save方法的对象是不是
publicCloudDatabase,如果是,替换为对应的privateCloudDatabase/sharedCloudDatabase即可 - 客户端CloudKit环境错配:Xcode直接运行的Debug包默认连接开发环境,TestFlight、App Store安装的包默认连接生产环境,如果你手动修改过Run Scheme里的CloudKit环境配置,会导致环境错乱触发报错
- 重复创建订阅:这类用户级订阅不要在App启动时无脑重复创建,先调用
fetchAllSubscriptions(completionHandler:)拉取当前用户已存在的订阅,仅当目标订阅不存在时再执行创建操作,避免重复提交报错
场景2:你使用的是公共数据库订阅,开发环境创建后Dashboard列表不显示
这是CloudKit Dashboard的常见缓存问题,不需要等订阅在Subscriptions列表显示,按以下流程操作即可完成部署:
- 先确认订阅创建成功:在你调用
save(_:completionHandler:)的回调里打印返回结果,确认无error,且拿到了服务端返回的有效subscription ID,不要依赖客户端本地逻辑判断创建成功 - 创建完成后,对公共数据库中被订阅监听的记录类型执行一次增/改/删操作,触发一次订阅匹配逻辑,等待1-2分钟让服务端同步元数据
- 登录CloudKit Dashboard,选中你的目标容器,将顶部的环境切换器明确切到Development,不要停留在Production环境
- 不要进Data下的Subscriptions页面等列表加载,直接点击左侧栏「Schema」>「Deploy Schema Changes」,弹出的变更对比列表会实时拉取所有开发环境未部署的变更,包括你刚创建的公共CKSubscription
- 确认变更列表中包含你创建的订阅后,按提示确认部署到生产环境即可,部署完成后公共订阅全局生效,所有用户端不需要再在生产环境调用save方法创建该订阅
后续维护避坑
- 公共订阅的规则(监听的记录类型、触发条件、通知载荷配置)如果需要修改,必须在开发环境调整后重新走Schema部署流程推到生产,直接在生产环境修改会触发权限错误
- 公共订阅部署生效后,记得在代码里去掉生产环境下创建该公共订阅的逻辑,重复提交会触发参数错误
- 如果Schema部署列表里也看不到你创建的公共订阅,先检查你创建订阅时使用的开发者账号是否对该容器有开发权限,无权限的账号创建的订阅不会被计入容器Schema
内容的提问来源于stack exchange,提问作者Vicente Garcia
相关产品推荐
相关产品推荐

