CloudKit Keychain Database's Crash Problem And Recovering Solution
现象描述
包括但不限于以下表现
1. 异常流量
- iOS 出现大量异常流量,如果是在 Cellular 环境下,表现为 Setting > Cellular 中,Cellular Data 栏目出现大量的 System Service 流量,表现在 Documents & Sync 栏目中,如图。
- 若安装了网络代理软件如 Surge,可发现异常流量主要是在与
icloud-content.com通信产生的 HTTPS 下行流量,如图。
2. 设备运行异常且大量发热
- 设备可能会出现极其严重的卡顿,以至于进行难以操作,同时大量发热。
3. 大量第三方应用无法打开
- 大量第三方应用可能会出现无法打开的情况,具体表现为:在 Splash Screen 卡顿,直至 10 秒后被系统强制退出的现象。
目前发现「腾讯系」与「阿里系」应用似乎影响较小,可能 QQ、WeChat、AliPay 等应用仍然可以打开
4. iCloud Keychain 数据库大小异常
- 在 Mac 的
~/Library/Keychains/[UUID]/keychain-2.db可见keychain-2.db大小异常,可能为数百兆字节甚至超过 1 吉字节(正常大小应为几十兆字节)。 - 使用 Sqlite 或相关 Sqlite 的 GUI 软件可见
keychain-2.db中表ckmirror的数据项可能多达近 30000,正常情况应为几千条,正常情况如图(图为本人恢复后的截图)。
更详细的现象描述与分析可参考:iOS 异常流量消耗及大范围应用闪退问题的分析
解决方案
本人测试有效的方案,但无法考证其通用性,也无法考证其中做法是否有冗余操作
虽然之前参考 iOS 异常流量消耗及大范围应用闪退问题的分析 备份了 Health 数据,本人在使用本方案恢复 CloudKit 后, Health 数据并未出现丢失,但仍然建议先对 Health 数据进行备份
Health 数据备份参考:想要分析或备份 iPhone 「健康」应用数据?教你 3 种方法将其导出
- 首先,确认在 Mac 端的
~/Library/Keychains/[UUID]/keychain-2.db查看keychain-2.db大小是否异常,可用命令ls -ahl | sort -k5 -hr查看该目录下各项目大小 - 若发现数据库大小有问题,先运行
/usr/sbin/ckksctl status保证自己的各项服务都处于logged in状态,否则以下操作可能无效(logged in状态如图)
- 确认自己为
logged in状态后,可使用命令/usr/sbin/ckksctl reset重置本地数据 - 再之后用命令
/usr/sbin/ckksctl reset-cloudkit重置 CloudKit 数据 - 登出所有受影响设备的 iCloud
- 登入一台 Mac 设备,重新登入 iCloud,并运行命令
/usr/sbin/ckksctl reset-cloudkit重置 CloudKit 数据 - 之后再陆续将其他设备的 iCloud 登入,此时
keychain-2.db可能会由最初的 10MB 或更小增大,但基本维持在几十兆字节左右。
- 注 1:本人最初先恢复了一台 Mac,之后再按此做法针对另一台 Mac 进行操作,结果数据库还是膨胀到了超过 600MB 的大小,于是之后采用了以上方法(本人猜测是本地的错误数据可能会被自动同步到 CloudKit)。
- 注 2:若某台 iOS 设备出现 AirPods 配对困难,那么可能需要 Erase 这台设备再登入 iCloud(可以 Restore from backup / Set as New),不然在使用一段时间后(约一周内)出现数据库大小再次反弹的情况。
- 最后附上恢复前后的文件大小对比图
Command Reference:
/usr/sbin/ckksctl status: Report status on CKKS views/usr/sbin/ckksctl reset: All local data will be wiped, and data refetched from CloudKit >/usr/sbin/ckksctl reset-cloudkit: All data in CloudKit will be removed and replaced with what’s local
Reference
以下为本人最初找到的有关此问题的分析与解决方案的讨论 在此表示感谢
- 目前最详细的问题分析汇总:iOS 异常流量消耗及大范围应用闪退问题的分析
- MacRumors 的相关讨论:Excessive data consumption for “Documents & Sync” and constantly high CPU load on iPhone and iPad
- CloudKit 命令参考:Reset Connections To ApplePay and Health With ckksctl
- Health 数据备份参考:想要分析或备份 iPhone 「健康」应用数据?教你 3 种方法将其导出