English Version: Troubleshooting Excessive Data Consumption and App Crashing on iOS Devices
这是我遇见的第三个Apple设备上的疑难杂症。
大概是今年的6月底,我的iPhone(运行iOS11.4)一夜之间跑掉了将近10个G流量。经检查Shadowrocket日志发现,iPhone在以约200kb/s的速度持续从gateway.icloud.com
下载不明数据。(根据其他受害者反映,如果没有安装Surge一类的软件,这些不明流量会在流量统计中显示为“文稿与同步”)我原来的iCloud使用的是日区账号,换成国区账号之后仅仅好了不到两天之后,问题再次出现。由于我当时正被考试周搞得焦头烂额,我在Shadowrocket里将gateway.icloud.com
Reject掉之后就没有再管他,也不影响日常使用。
之后查找相关资料发现,也有网友遇到类似问题:https://www.v2ex.com/t/459452(22楼)。但是他提出的登出macOS设备上的iCloud的方案,我试了之后并没有成功。
但是事情并没有结束,自从升级了iOS12 Beta之后,我的iPhone和iPad都出现了时不时发生应用大面积闪退的问题,频率基本维持在一周2-3次。当问题发生时,点开大多数应用都会卡在Splash Screen大约10秒后闪退。会闪退的应用包括但不限于知乎,TIM,Notability及所有Google应用。微信和苹果自带应用基本不受影响。此时手机会发热,并且进入iCloud界面时大概率会卡死。出现问题时我的iPhone运行的iOS版本为11.4,后来升级至iOS 12 Public Beta后问题依然存在。
2020年12月更新:有朋友表示iOS14上出现了类似的问题,但可能表现出了不同症状。详细情况请参考评论区。
症状
汇总我自己的尝试及网友提供的信息,我将这个问题在iOS设备上的症状总结如下:
运行iOS11.4及更低的iOS版本时
- 流量统计中的“文稿与同步”项目消耗了大量流量
- 设备以约200kb/s的速度持续从
gateway.icloud.com
下载不明数据
运行iOS12及更高的iOS版本时
- 设备时常发生应用大面积闪退的现象,启动大多数第三方应用时会卡在Splash Screen大约10秒后闪退
- 设备发热,耗电量激增
- 访问iCloud内容及使用密码填充时卡顿
尝试
我尝试了重启,强行重启,重新安装出现问题的应用,升级iOS及登出并重新登录iCloud,均没有效果。如果不进行任何处理,一段时间以后也会自行恢复。
分析
由于这个问题十分隐蔽,导致每个人的描述都不太一样,因而很难在网上搜索到。我整理了所有出现类似问题的贴子合集:
https://www.v2ex.com/t/460089
https://www.v2ex.com/t/471491
https://cn0xroot.com/2018/07/17/2018-07-16/
https://www.v2ex.com/t/459452
https://discussionschinese.apple.com/thread/140132632
https://www.reddit.com/r/jailbreak/comments/8sf4u3/help_this_block_of_text_is_being_spammed_in_my/
https://forums.developer.apple.com/thread/105722
https://forums.macrumors.com/threads/excessive-data-consumption-for-documents-sync-and-constantly-high-cpu-load-on-iphone-and-ipad.2127349/
这个问题出现的时间很随机,我目前还没有找到其触发条件,难以手动复现。我初步定位问题与iCloud有关,并且与在iOS11.4下出现的iCloud持续下载数据问题有关联。
检查Console发现,在应用启动并闪退时,会出现Provision violated for watchdog scene-create
信息。经搜索得知,这个报错是由于应用启动时间过长而被系统强行杀死。
与此同时,当问题出现期间,会出现大量下列日志,每秒钟多达数百条。
Aug 3 13:25:01 xxx-iPad securityd[492] : Primary key conflict; replacing <inet,rowid=6503,cdat=2018-04-22 17:45:36="" +0000,mdat="2018-04-22" +0000,desc="null,icmt=null,crtr=null,type=42,scrp=null,labl=PCS" com.apple.textinput.keyboardservices.secure2="" -="" xufxdi+c,alis="null,invi=1,nega=null,cusi=null,prot=null,acct=XUFXdi+cQQeub/ZOYDvnZxRewe58kmh3AnxFv3lIp+Y=,sdmn=ProtectedCloudStorage,srvr=10010665840,ptcl=0,atyp=0952582F6984C0B264DB84750CE0B1A111B46D1E,port=0,path=,data=0b18:070000000AA4070A...|ed9c26ec39e16db2,agrp=com.apple.ProtectedCloudStorage,pdmn=ck,sync=1,tomb=0,sha1=89ED47A44B6E99F7665FB765B9E276119D064A6B,vwht=Manatee,tkid=null,v_Data=<?">,v_pk=FB076B06972C7760C5C195A06EFAE27690F482F3,accc=310C300A0C0470726F740C02636B,u_Tomb=null,musr=,UUID=24C3EAC7-E90B-16AC-66FD-BE910BB887FA,sysb=null,pcss=42,pcsk=5D4157762F9C4107AE6FF64E603BE767145EC1EE7C926877027C45BF7948A7E6,pcsi=6181FB3081F802012A02010104205D4157762F9C4107AE6FF64E603BE767145EC1EE7C926877027C45BF7948A7E6A0673065300A02010304053003020100302702010604220420451B5C4E7ED88534FEAF98353191D43A5EF99619CCD96178C5A2A65 with CK item
Aug 3 13:25:01 xxx-iPad securityd[492] : replaced <inet,rowid=6503,cdat=2018-04-22 17:45:36="" +0000,mdat="2018-04-22" +0000,desc="null,icmt=null,crtr=null,type=42,scrp=null,labl=PCS" com.apple.textinput.keyboardservices.secure2="" -="" xufxdi+c,alis="null,invi=1,nega=null,cusi=null,prot=null,acct=XUFXdi+cQQeub/ZOYDvnZxRewe58kmh3AnxFv3lIp+Y=,sdmn=ProtectedCloudStorage,srvr=10010665840,ptcl=0,atyp=0952582F6984C0B264DB84750CE0B1A111B46D1E,port=0,path=,data=0b18:070000000AA4070A...|ed9c26ec39e16db2,agrp=com.apple.ProtectedCloudStorage,pdmn=ck,sync=1,tomb=0,sha1=89ED47A44B6E99F7665FB765B9E276119D064A6B,vwht=Manatee,tkid=null,v_Data=<?">,v_pk=FB076B06972C7760C5C195A06EFAE27690F482F3,accc=310C300A0C0470726F740C02636B,u_Tomb=null,musr=,UUID=24C3EAC7-E90B-16AC-66FD-BE910BB887FA,sysb=null,pcss=42,pcsk=5D4157762F9C4107AE6FF64E603BE767145EC1EE7C926877027C45BF7948A7E6,pcsi=6181FB3081F802012A02010104205D4157762F9C4107AE6FF64E603BE767145EC1EE7C926877027C45BF7948A7E6A0673065300A02010304053003020100302702010604220420451B5C4E7ED88534FEAF98353191D43A5EF99619CCD96178C5A2A65 in
Aug 3 13:25:01 xxx-iPad securityd[492] : with <inet,rowid=6503,cdat=2018-04-22 17:45:36="" +0000,mdat="2018-04-22" +0000,desc="null,icmt=null,crtr=null,type=42,scrp=null,labl=PCS" com.apple.textinput.keyboardservices.secure2="" -="" xufxdi+c,alis="null,invi=1,nega=null,cusi=null,prot=null,acct=XUFXdi+cQQeub/ZOYDvnZxRewe58kmh3AnxFv3lIp+Y=,sdmn=ProtectedCloudStorage,srvr=10010665840,ptcl=0,atyp=0952582F6984C0B264DB84750CE0B1A111B46D1E,port=0,path=,data=0b18:070000000AA4070A...|6d7f049148c607e2,agrp=com.apple.ProtectedCloudStorage,pdmn=ck,sync=1,tomb=0,sha1=444FB1FC5869A46B917DEDED076DDF5780E7A289,vwht=Manatee,tkid=null,v_Data=<?">,v_pk=FB076B06972C7760C5C195A06EFAE27690F482F3,accc=null,u_Tomb=null,musr=,UUID=24C3EAC7-E90B-16AC-66FD-BE910BB887FA,sysb=null,pcss=42,pcsk=5D4157762F9C4107AE6FF64E603BE767145EC1EE7C926877027C45BF7948A7E6,pcsi=6181FB3081F802012A02010104205D4157762F9C4107AE6FF64E603BE767145EC1EE7C926877027C45BF7948A7E6A0673065300A02010304053003020100302702010604220420451B5C4E7ED88534FEAF98353191D43A5EF99619CCD96178C5A2A6526DC99DBD302E02010104293 in
Aug 3 13:25:01 xxx-iPad securityd[492] : ready to process an incoming queue entry: <ckksincomingqueueentry(manatee): add="" 24c4353b-89f8-6215-1c40-0f04246d057e="" (new)=""> 24C4353B-89F8-6215-1C40-0F04246D057E add
Aug 3 13:25:01 xxx-iPad securityd[492] : insert failed for item <inet,rowid=null,cdat=2018-05-20 09:21:52="" +0000,mdat="2018-05-20" +0000,desc="null,icmt=null,crtr=null,type=42,scrp=null,labl=PCS" com.apple.textinput.keyboardservices.secure2="" -="" 0gar="" 00a,alis="null,invi=1,nega=null,cusi=null,prot=null,acct=0gaR/00AlBUNsW2kwgjgehAk7jlRyRwT6SvS7QrZwe4=,sdmn=ProtectedCloudStorage,srvr=10010665840,ptcl=0,atyp=CBE61B61899A5063B7986CE76C0B7AC220BA1066,port=0,path=,data=0b15:070000000AA4070A...|a025af7bd6af7cbf,agrp=com.apple.ProtectedCloudStorage,pdmn=ck,sync=1,tomb=0,sha1=1E6777C0DFD8D9BB94C0BA21E9E55A19CBD8DB0E,vwht=Manatee,tkid=null,v_Data=<?">,v_pk=212E2F1B786100857148F8C26A4C4212FF1173BF,accc=null,u_Tomb=null,musr=,UUID=24C4353B-89F8-6215-1C40-0F04246D057E,sysb=null,pcss=42,pcsk=D20691FF4D0094150DB16DA4C208E07A1024EE3951C91C13E92BD2ED0AD9C1EE,pcsi=6181F93081F602012A0201010420D20691FF4D0094150DB16DA4C208E07A1024EE3951C91C13E92BD2ED0AD9C1EEA0673065300A020103040530030201003027020106042204207C88B3993E919363592E44E9630F2C7BD40BA2191BC85CDE928DEE908748DE2F302E02010104293 with
</inet,rowid=null,cdat=2018-05-20></ckksincomingqueueentry(manatee):></inet,rowid=6503,cdat=2018-04-22></inet,rowid=6503,cdat=2018-04-22></inet,rowid=6503,cdat=2018-04-22>
通过日志中的com.apple.ProtectedCloudStorage
字样,经过查找一些奇怪的技术文档(见参考资料),我初步锁定问题出现在Keychain。至于其中出现的Manatee
,经查找并没有查询到有价值的信息。
我通过搜索日志中的内容查到了Reddit上面的一个帖子:
这位楼主nhcoil和我遇到了几乎一样的问题。我发送私信询问后得到了如下的回复:
Never found the solution. Brought my phone in multiple times and nothing, even got a replacement device and the issue persisted. The problem was something in my iCloud. I don’t know what, didn’t have anything in there at all.
Holy solution was creating a new iCloud account and not carrying anything over and manually putting everything like contacts etc.
I’m sorry I can’t be much help, I spoke with Apple live chat about the issue and gave everything I could to isolate and help with the problem.
If you do find a solution other than a new iCloud account, then that’s amazing but for now I think that’s all that can be done.
Regards,
Micheal
研究上述日志和nhcoil提供的信息,猜测该问题的起因在于iCloud中的数据出现了某些问题,导致预料之外的同步出错,并且问题大概率出现在Keychain中。
接着,我又搜索到了这篇帖子:
iCloud Keychain database grows when 2-factor en… |Apple Developer Forums
文中提供了更多的信息:
This process will continue writing around 30000 lines to the database, and during this time, secd uses 100%+ of a CPU. Once that’s finished, I can manually edit the database using an Sqlite editor, which brings the database down to around 10-15MB, and Safari passwords will resume working. Eventually the database will grow again and Keychain stops working.
Signing all devices out of iCloud Keychain does not clear this problem. Computers running 10.11.6 and 10.12.6 work normally, so the problem seems to stem from some new feature in iOS 11 and macOS 10.13.
我前往MacBook上的本地Keychain数据库,果然发现了大量含有Manatee
的数据,多达上万行,并且,这些数据不会显示在Keychain Access中。
我相信在我的iCloud Keychain中同样存在这些数据,但是我没有任何途经去查看或删除它。
根据目前获得的线索继续搜索,我又找到了MacRumors上的一个帖子:
通过文中提供的信息,我们足以确定问题确实出在Keychain中。
并且,这两篇文中都提到,当双重认证关闭时,问题就不会再发生。这可以视为一个相对可行的解决方案。
综上,我猜想该问题的成因是macOS设备在开启双重认证后,一个名为Manatee的组件出现bug,导致巨量的脏数据产生并被上传到iCloud Keychain中,iOS设备在下载及处理这些巨量数据的过程中造成了大量数据流量消耗和卡顿,闪退等现象。
解决方案
方案1:重置CloudKit
该方案被部分网友确认有效
评论区的网友XXL指出这个链接中有了新的解决方案,其中22楼提供了几条用于重置CloudKit的命令。这些命令只有在开启双重认证时才有效,请在操作前确保双重认证是开启状态。虽然理论上数据不会丢失,但是保险起见请提前备份健康和Keychain数据。
首先在macOS设备上登录你的存在问题的iCloud账户,检查~/Library/Keychains/(UUID)/keychain-2.db
的大小,这时其大小可能在数百M甚至大于1G。
确认CloudKit的登录状态。
/usr/sbin/ckksctl status
如果其中每个View的CloudKit状态为logged in则继续。如果是logged out,请根据屏幕上的提示查找原因。请注意双重认证未开启也会造成显示logged out。
如果你的CloudKit状态为logged out,下文命令虽然可以执行成功,但是不会有任何效果。
从iCloud同步最新的数据。这个命令可能执行不成功,但是没有关系。
/usr/sbin/ckksctl fetch
重置本地数据库
/usr/sbin/ckksctl reset
重置iCloud数据库
/usr/sbin/ckksctl reset-cloudkit
完成后在macOS设备上登出并重新登录该iCloud账户。此时如果~/Library/Keychains/(UUID)/keychain-2.db
的大小变为10M左右,说明成功。之后的一段时间请持续观察闪退现象是否复现及keychain-2.db的大小是否有明显增加。
更新:评论区的朋友Soy指出:
按文章里提到的先 “ckksctl reset” 再 “ckksctl reset-cloudkit” 在我这里一定会出现第二条命令提示 “timed out” 的情况,错误信息里面有 “pending… ” 的字样,看里面等待的任务的名字似乎是因为后台在同步所以操作超时。观察文件大小的变化发现”reset” 过程中数据库迅速变小,但提示完成之后会开始迅速增长,ckksctl 的帮助信息里面说这个 “reset” 是 “All local data will be wiped, and data refetched from CloudKit”,也就是说它重置之后会立即开始从云端下载数据,前面的错误信息也表明正在同步的时候没有办法进行操作,似乎说明不该这么用。
看到文章里有用到工具查看数据库内容,就找了个工具对数据库执行了
DELETE FROM “ckmirror” WHERE “ckzone” = “Manatee”
、”DELETE FROM “inet” WHERE “vwht” = “Manatee”` 和 “VACUUM” 三条操作,然后再用 “ckksctl reset-cloudkit” 把云端的数据替换成本地清理过的版本。操作成功之后所有有问题的 iPhone 清空数据用 iMazing 跳过钥匙串还原其他内容,现在数据库体积增长还没超过 1MB,我自己不用钥匙串保存密码,不知道这样做会不会对部分功能造成影响,暂时没发现有问题。
Soy提出的问题和解决方法个人认为是有道理的,但是我自己并没有尝试过。欢迎大家尝试(at your own risk)并提供反馈。
如果问题依然存在
如果进行上述操作后问题依然存在,你可以继续尝试下面的步骤:
抹掉你登录过该iCloud帐号的所有iOS设备。抹掉之前请做好备份,建议使用iMazing仅备份应用及其数据。请不要使用iCloud或iTunes的完整备份,因为在恢复备份时可能将引起问题的脏数据一并还原到设备上。
在macOS设备上移除~/Library/Keychains/(UUID)
文件夹,然后立即重启macOS设备。如果你愿意,这一步可以用抹掉重装macOS来替代。
重启后登出并重新登录iCloud,确认Cloudkit状态
/usr/sbin/ckksctl status
如果每个View的状态为logged in,立即重置iCloud数据库
/usr/sbin/ckksctl reset-cloudkit
将抹掉过的iOS设备重新登录iCloud,同时注意观察console上是否有出现大量的形如前文提到的日志。如果有,请重复上述步骤;如果没有,则持续使用并观察闪退现象是否复现及keychain-2.db的大小是否有明显增加。
方案2:关闭双重认证
该方案确认有效,但是有特定适用范围。
从AppleID网页管理界面关闭iCloud账户的双重认证即可。请注意是双重认证(Two-factor Authentication)而不是两步验证(Two-step Verification)。
但是,在 iOS 10.3 或 macOS 10.12.4 及更高版本中创建的AppleID无法关闭双重认证。如果你在上述系统版本下开启了双重认证,在开启之后的两周内可以通过确认邮件中的链接关闭双重认证,超过两周则无法关闭。
其他解决方案
如果上述方案对你无效,你可以参考下面的方案来进行尝试:
以下方案确认有效,但是操作相对麻烦或会影响日常使用
- 创建一个全新的iCloud账户,并手动迁移旧账户中的数据(慎用!设备上的脏数据可能会污染你的新账户!)
- 从iOS设备上登出iCloud账户
以下尝试已经被我或遇到相同问题的网友证实无效
- 登出并重新登录iCloud账户
- 将macOS设备登出iCloud账户
- 清空iOS设备上的Safari密码
- 使用类似Surge的网络调试工具Reject掉形如
p**-*.icloud.com
的网址,以阻止iCloud进行同步。 - 关闭iOS设备上的iCloud Keychain
- 从macOS设备的Keychain Access中重置Keychain数据库
参考资料
- https://forums.developer.apple.com/thread/105722
- https://forums.macrumors.com/threads/excessive-data-consumption-for-documents-sync-and-constantly-high-cpu-load-on-iphone-and-ipad.2127349/
- https://arstechnica.com/civis/viewtopic.php?f=19&t=1433841
- https://www.reddit.com/r/jailbroke2/comments/8sgj2n/help_this_block_of_text_is_being_spammed_in_my/
- https://www.v2ex.com/t/459452
- https://forums.developer.apple.com/thread/104020
- https://stackoverflow.com/questions/26827809/app-rejection-crash-report-says-failed-to-scene-create-in-time-badf00d-what
- https://hitcon.org/2017/CMT/slide-files/d1_s2_r2.pdf
发表回复/Leave a Reply