【问题标题】:Deleting iCloud data doesn't clear out NSUbiquitousKeyValueStore?删除 iCloud 数据不会清除 NSUbiquitousKeyValueStore?
【发布时间】:2013-02-04 11:26:22
【问题描述】:

我有一个配置为使用 iCloud 的应用。我正在向 NSUbiquitousKeyValueStore 添加一个键/值,我可以在我的所有设备上按预期检索它。但是,如果我从“设置”下删除我的应用程序的 iCloud 数据,我希望我添加到 NSUbiquitousKeyValueStore 的所有 iCloud 数据也会被删除,但事实并非如此。无论我希望 iCloud 同步多长时间,我都能检索到所有数据。

我去了 developer.icloud.com 并看到我的其他 iCloud 数据(我也在 iCloud 上使用 Core Data)被正确删除,但它们不是 NSUbiquitousKeyValueStore 保存其数据的文件夹。 /p>

有谁知道这是否应该被删除?如果用户无法删除它,这似乎有点像“云内存泄漏”。

【问题讨论】:

    标签: ios icloud nsubiquitouskeyvaluestore


    【解决方案1】:

    这就是我的做法:

    NSUbiquitousKeyValueStore *kvStore = [NSUbiquitousKeyValueStore defaultStore];
    NSDictionary *kvd = [kvStore dictionaryRepresentation];
    NSArray *arr = [kvd allKeys];
    for (int i=0; i < arr.count; i++){
        NSString *key = [arr objectAtIndex:i];
        [kvStore removeObjectForKey:key];
    }
    

    【讨论】:

    • 感谢您的回复。我不知道如何手动删除这些值——那部分是显而易见的。我想看看他们是否是用户删除这些数据的一种方式。我正在关闭无处不在的商店中的一个值,以判断我是否已经设置了一些东西,如果用户删除了他们的 iCloud 数据,我想重新运行该操作。但是,如果用户确实有办法删除他们的数据,那么这种方法可能不起作用。
    • 哦,好的。您可以使用 NSMetadataQuery 来确定核心数据文件是否仍然存在
    • 是的,我需要知道是否设置了特定设备,而不仅仅是事务日志是否存在。我想我将使用我创建的 ubiquity 容器和文件来实现我自己的 NSUbiquityKeyValueStore。这样,当用户删除他们的 iCloud 数据时,这些值肯定会被删除。
    • 我知道它没有回答 lehn0058 的问题,但它确实帮助我清除了不再匹配我的数据模型的键值。现在一切都很好,谢谢。
    【解决方案2】:

    删除 iCloud“文档和数据”只会删除所有文档和 CORE 数据。它不会删除 NSUbiquitousKeyValueStore 中的任何内容。我的期望是它会删除有关该应用程序的所有内容。

    在添加 iCloud 支持之前,我使用 NSUserDefaults 为应用程序存储小块数据。例如,最终用户可以输入他们的姓名和地址,我会将其存储在 NSUserDefaults 中。它不是复杂的数据,我不需要使用核心数据或平面文件来存储它。将其存储在那里非常容易并且可以正常工作。如果我从手机中删除该应用程序,该信息就会消失,这正是我所期望的。当我添加 iCloud 支持时,我将其放入 NSUbiquitousKeyValueStore。但是,即使我删除应用程序,然后删除“文档和数据”,最终用户名和地址仍然存在。

    我以为我做错了什么。经过一天大部分时间的研究,我发现 iCloud 键值存储应该用于“离散”数据,并且“iCloud 键值数据存储不是用户会看到的”。

    因此,虽然它完全能够存储最终用户实际看到的非复杂用户数据,但这并不是预期用途。我做的“错误”是将它用于非预期用途,尽管它适用于该用途。

    我不确定为什么 Apple 不会从 iCloud 中删除所有内容。或者至少让用户能够这样做。

    【讨论】:

      【解决方案3】:

      删除应用后保留 NSUbiquitousKeyValueStore 是正确的。 在删除时,设备不知道您的其他设备是否仍需要该共享数据。

      您可以使用它来存储您希望在设备之间共享的应用内购买状态、用户详细信息等,并在应用被意外删除(或卸载,然后重新安装)时恢复

      另一方面,NSUserDefaults 是属于该设备上应用程序本身的数据,因此删除应用程序应该删除数据。

      【讨论】:

      • 那么 NSUbiquitousKeyValueStore 什么时候会被删除?当然,对于可能不再使用的应用程序,这不会永远堆积起来。用户是否不可能在某个时候强制删除它?
      【解决方案4】:

      这是一项功能,而不是错误。如果您为所有用户提供一次性的东西(例如,每个人一开始都有 50 个免费积分),您需要某种方式来确保他们不会删除所有内容,然后重新获得 50 个免费积分。

      【讨论】:

        【解决方案5】:

        这将清除它。 #if DEBUG 是为了防止您意外发送此代码。

        Swift 5.2

        #if DEBUG
        let allKeys = NSUbiquitousKeyValueStore.default.dictionaryRepresentation.keys
        for key in allKeys {
            NSUbiquitousKeyValueStore.default.removeObject(forKey: key)
        }
        #endif
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-10-29
          • 2013-11-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多