iCloud 无处不在的容器没有在应用程序删除时被清理?

Posted

技术标签:

【中文标题】iCloud 无处不在的容器没有在应用程序删除时被清理?【英文标题】:iCloud ubiquity containers not being cleaned up on app delete? 【发布时间】:2013-01-05 16:53:13 【问题描述】:

我正在将带有 Core Data 的 iCloud 添加到应用商店中已经存在的应用中,因此我需要测试升级方案。但是,当我从设备中删除我的应用程序并从 Xcode 重新安装它时,我注意到设备上我的 ubiquity 容器文件夹中的所有内容都被保留了!这非常烦人,因为 iCloud 在尝试从我指定的事务日志目录上传文件时最终会感到困惑并且经常超时。我最终需要指定一个新的事务日志位置才能让它再次工作,这显然在我的测试中将来不起作用。

以下是我收到的错误:

PFUbiquitySafeSaveFile waitForFileToUpload:: CoreData: 无处不在:(0) 永久位置: :/private/var/mobile/库/Mobile Documents/XXXXXXXXXX~appnamegoeshere/DatabaseTransactionLogs/mobile.8A0C3F8A-4077-57D7-8250-6BE15D1BCD20/iCloudData/8u0BfiCwOkHHa~o8hF4bunW~zmdS_C8om5efuugxRaA=/receipt.0.cdt 安全地点:: /private/var/mobile/库/Mobile Documents/XXXXXXXXXX~appnamegoeshere/DatabaseTransactionLogs/mobile.8A0C3F8A-4077-57D7-8250-6BE15D1BCD20/iCloudData/8u0BfiCwOkHHa~o8hF4bunW~zmdS_C8om5efuugxRaA=/mobile.8A0C3F8A-4077-5517-820.DBCD-BE 当前位置: : /private/var/mobile/库/Mobile Documents/XXXXXXXXXX~appnamegoeshere/DatabaseTransactionLogs/mobile.8A0C3F8A-4077-57D7-8250-6BE15D1BCD20/iCloudData/8u0BfiCwOkHHa~o8hF4bunW~zmdS_C8om5efuugxRaA=/mobile.8A0C3F8A-4077-57D7-8250-CDt1>

kv: (null)

文件安全保存失败,错误:Error Domain=NSCocoaErrorDomain Code=512 "文件上传超时。"用户信息=0x1e5b6b10 NSLocalizedDescription=文件上传超时。

有人知道如何在应用安装之间清除无处不在的容器吗?即使从应用程序设置中删除 ubiquity 容器并重新发布它也不能解决此问题。理论上,客户只需删除应用程序然后删除其 iCloud 文件即可解决此问题。这个问题真的很令人沮丧,以确定问题的原因是什么 - 任何建议都值得赞赏!

【问题讨论】:

【参考方案1】:

经过多次头疼后,我才明白了这一点。有人向我提到,如果您访问 developer.icloud.com 并使用您的 iCloud 帐户登录,您可以查看设备的所有 iCloud 数据。对此进行了一些测试,当我告诉它从我的设备中删除时,我能够看到 iCloud 服务器上的数据立即被删除。但是,即使我删除了我的应用,我在设备上的 ubiquity 容器中创建的所有文件夹和文件都保留了下来。

我的解决方法是检查何时设置我的应用程序以首次使用 iCloud,并查看我的目录是否已经在 ubiquity 容器中。如果是,那么我使用以下代码手动删除目录和其中的所有文件:

 [fileManager removeItemAtPath:[[fileManager URLForUbiquityContainerIdentifier:nil] path] error:&error];

【讨论】:

您如何确定您是否是第一次设置 iCloud?保存一个 NSUserDefaults?第一次设置时如何清理该文件夹? 我检查了我的 ubiquity 容器(例如数据库文件)中的文件夹是否存在。 你是如何删除文件夹的?我尝试使用[[NSFileManager defaultManager] removeItemAtPath:path error:&error]; 删除,但出现错误 我用这个:[fileManager removeItemAtPath:[[fileManager URLForUbiquityContainerIdentifier:nil] path] error:&error];【参考方案2】:

这就是 iCloud 的工作方式。删除一台设备上的应用程序不会自动删除 iCloud 数据。如果该应用程序仍然安装在使用相同帐户的其他设备上,他们仍然可以使用数据。

如果您想在测试期间清除 iCloud 数据,请转到设置 --> iCloud,深入到您的应用,然后删除数据。

【讨论】:

是的 - 这正是我清除数据的方式。它仍然在我的设备上留下那个无处不在的文件夹,但这就是导致问题的原因。我什至修改了我的应用程序以检查该文件夹是否仍然存在以确保我没有发疯,并且在我从设置中删除 iCloud 数据后它始终存在。 只存在 ubiquity 文件夹 -- 为空 -- 应该 没问题。如果这对您不利,最好更新您的问题,详细了解究竟出了什么问题。 它不仅仅是无处不在的容器。它里面的目录也仍然存在。我认为这就是导致 iCloud 感到困惑的原因,因为它们存在于本地普遍存在的容器中,但不存在于 iCloud 服务器上。当我请求添加持久存储协调器时,这最终导致超时。在删除 iCloud 设置后,我将进行更多测试,以了解设备上仍残留的确切细节。 我用返回的错误更新了问题。此外,我确认所有文件夹(例如事务日志文件夹)仍保留在普遍存在的容器位置内,即使在 iCloud 数据已被删除后。

以上是关于iCloud 无处不在的容器没有在应用程序删除时被清理?的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 8 中将应用程序的无处不在的容器暴露给 iCloud Drive

删除 iCloud 容器内容

如何在我的无处不在的容器中获取所有可用的持久存储?

iCloud 文档选择器:应用文件夹在导入时被禁用

清除/清除 CloudKit 容器的所有用户 iCloud 记录

iCloud 容器默认 vs 自定义