Xcode 修改Bundle ID为全小写时如何迁移原有Core Data数据
方案1:仅迁移个人测试设备的本地数据
方法A:无需写代码,直接用Xcode工具替换沙盒
- 保持Xcode中Bundle ID为原有带大写的旧值,将旧版本应用运行到你的测试设备上。
- 打开Xcode顶部菜单
Window > Devices and Simulators,在左侧选中你的测试设备,在右侧Installed Apps列表中找到你的旧应用。 - 点击列表下方的齿轮图标,选择
Download Container,将旧应用的完整沙盒容器保存到本地。 - 右键点击保存的
.xcappdata文件,选择显示包内容,找到AppData/Library/Application Support/目录下的三个Core Data相关文件(你的存储名.sqlite、你的存储名.sqlite-wal、你的存储名.sqlite-shm),可提前备份这三个文件避免数据丢失。 - 修改Xcode中的Bundle ID为全小写的新值,运行新应用到设备上,此时新应用为空白状态。
- 回到
Devices and Simulators界面,在Installed Apps中找到新Bundle ID的应用,点击齿轮图标选择Replace Container,选中你之前下载的旧应用的.xcappdata文件,确认替换后重启新应用即可读取到所有旧数据。
方法B:写临时导出导入代码
如果Xcode容器下载失败,可以用代码实现临时数据转移:
- 给旧版本应用加临时调试按钮,点击后获取Core Data存储路径的三个文件,通过
UIActivityViewController分享导出到本地或者AirDrop到其他设备。 - 修改Bundle ID为新值运行新应用,加临时导入按钮,将导出的三个文件直接覆盖到新应用的Core Data存储目录下,重启应用即可。
- 验证数据正常后删除临时的导入导出代码即可。
方案2:如果已经对外发布过旧Bundle ID版本,需要覆盖所有用户的数据迁移
- 先提交最后一个旧Bundle ID版本的更新:这个版本里加入将所有本地数据(包括Core Data存储文件、UserDefaults、缓存等所有你需要保留的数据)备份到App Group共享目录的逻辑。
注意:你需要先在苹果开发者账号中创建App Group,同时给旧Bundle ID和新的全小写Bundle ID都开启App Group权限,两个ID要关联同一个App Group标识。
- 等待足够多的用户升级到这个带备份逻辑的旧版本后,再发布新的全小写Bundle ID版本:新版本启动时优先从App Group共享目录中读取之前备份的旧数据,将数据恢复到新应用的本地沙盒路径下,恢复完成后可以删除共享目录里的备份避免重复恢复。
- 发布新版本时,你需要将旧应用从App Store下架,同时告知用户需要安装新的应用,这种方案下旧应用和新应用会同时存在于用户设备上,用户可以手动删除旧应用。
注意事项
- 迁移Core Data数据时必须完整迁移
.sqlite、.sqlite-wal、.sqlite-shm三个文件,仅迁移主.sqlite文件可能丢失最近未写入主文件的 WAL 日志数据。 - 如果你还使用了
UserDefaults、本地文件存储、Keychain等其他持久化能力,迁移时需要将对应的数据同步转移:Keychain数据可以通过开启相同的Keychain Group实现新旧应用共享,UserDefaults可以通过App Group共享或者导出后重新写入。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

