删除iCloud数据并没有清除NSUbiquitousKeyValueStore?

问题描述 投票:0回答:6

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

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

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

ios icloud nsubiquitouskeyvaluestore
6个回答
9
投票

我就是这样做的:

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];
}

3
投票

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

斯威夫特 5.2

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

2
投票

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

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

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

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

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


2
投票

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

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

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


1
投票

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


0
投票

我通过在应用程序设置中为用户提供一个按钮来解决这个问题,这样他们就可以擦除所有数据(包括

NSUbiquitousKeyValueStore
中的数据),如下所示:

    func resetAll() {
        let keyStore = NSUbiquitousKeyValueStore()
        let keys: [String] = keyStore.dictionaryRepresentation.keys.compactMap { $0 }
        
        keys.forEach { key in
            keyStore.removeObject(forKey: key)
        }
        
        keyStore.synchronize()
    }

但是,在这种情况下,请注意不要在

NSUbiquitousKeyValueStore
中存储任何关键数据,以便用户不会意外删除他们将来或在其他设备上可能需要的任何数据。

© www.soinside.com 2019 - 2024. All rights reserved.