问题标签 [nsubiquitouskeyvaluestore]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
902 浏览

ios - 我可以使用 NSUbiquitousKeyValueStore 在 Mac 和 iOS 之间同步吗?

我将在不久的将来将我的 iOS 应用程序移植到 Mac OS (Mountain Lion) 以在 Mac App Store 中出售。

iOS 应用程序使用 iCloud 与 NSUbiquitousKeyValueStore 同步,这实现起来非常简单并且运行良好。我想知道是否可以访问 Mac OS 中 iOS 应用程序存储的数据。应用程序之间的用户默认设置是相同的,因此只要可以做到,这应该可以很好地工作。Mac 应用程序可以访问 iOS 应用程序存储的 iCloud NSUbiquitousKeyValueStore 数据吗?

0 投票
1 回答
1049 浏览

objective-c - 在设置值之前等待现有的 iCloud 值?

在我的应用程序中,我需要在运行该应用程序的不同设备之间共享一个设置。我希望安装应用程序的第一台设备设置设置的主值,然后所有其他设备都应该获取该设置而不是覆盖它。

  1. 如何确保在设置值之前先检查 iCloud 是否有值?所以我不会覆盖现有的。

  2. 我是否应该等待发送 NSUbiquitousKeyValueStoreInitialSyncChange 事件,然后我可以检查最终存在的值,否则第一次设置它?如果是,我可以依靠接收 NSUbiquitousKeyValueStoreInitialSyncChange 事件吗?如果不是,那么它可能会证明它根本没有使用这种方法设置 iCloud 值。

  3. 如果我尝试在第一次触发 NSUbiquitousKeyValueStoreInitialSyncChange 之前设置一个值,它会被丢弃,然后 NSUbiquitousKeyValueStoreInitialSyncChange 将使用存储中的现有数据触发吗?

  4. 我听说如果第一次同步时商店中没有值,则不会触发 NSUbiquitousKeyValueStoreInitialSyncChange?

我已阅读有关此内容的 Apple 文档并在 Stack Overflow 上看到了答案,但不明白如何做到这一点。

如何确保在第一次启动/安装应用程序时不会覆盖现有值?

0 投票
3 回答
6645 浏览

iphone - iCloud NSUbiquitousKeyValueStore 初始同步/访问延迟 - 如何处理?

我正在使用 NSUbiquitousKeyValueStore 来存储一些应用程序设置。我的逻辑是:当我在本地保存数据时,我将它保存到 NSUbiquitousKeyValueStore 也作为备份。当我需要设置时,我会在本地读取,并且如果在本地找不到数据(例如,在重新安装应用程序之后),我只会使用 iCloud 键值存储。如果用户有多台设备共享一个 icloud id,他可以在一台设备上写入设置并将它们下载到另一台设备(我警告他要重写)。

我有一个奇怪的问题。脚步:

  1. 安装了一个应用程序并将其数据保存到 NSUbiquitousKeyValueStore。确保数据在那里。
  2. 删除了应用程序(假设数据仍保留在 iCloud 中)。
  3. 等了几分钟以防万一,然后从 Xcode 内部安装并启动了该应用程序。
  4. 尝试使用 [[NSUbiquitousKeyValueStore defaultStore] dataForKey: @"mykeyname"] 读取设置键 - 有时可以,但有时找不到键!
  5. 等了15秒,再试一次。成功。使困惑。

因此,似乎 ios 需要一些时间来使我的应用程序的远程键值存储在本地可用于 dataForKey: 调用。如果我写了这样一个系统(实际上我写了 - 前一段时间,在另一种生活中),那么在询问和接收键值数据之前显然必须有一个延迟。所以我想要一些通知说:“我们在第一次启动时完成了下载/同步键值存储”或类似的东西。

据我了解,我可以在主线程中同步使用 NSUbiquitousKeyValueStore(这对我来说很方便)。但是 [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil] 返回一个有效的 url,然后我得到“找不到密钥”。所以我不能依赖它。有没有办法确保 NSUbiquitousKeyValueStore 工作并被下载?这很重要,尤其是在互联网速度较慢的情况下。

更新

将 [[NSUbiquitousKeyValueStore defaultStore] synchronize] (如苹果文档中所写)添加到 init 和 load 有点帮助。iCloud仍有许多问题。

昨天我已经成功将数据保存到手机1的键值存储并在手机2上恢复。今天我已经删除了手机2上的应用程序并尝试恢复数据。但即使 [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil] 返回了有效的 URL,我调用了 [[NSUbiquitousKeyValueStore defaultStore] synchronize] 当调用 dataForKey: MY_DATA_KEY 时我得到了 nil。

当我尝试从手机 1 上的 icloud 恢复数据(应用程序仍在安装)时,它成功了,但是当我在这部手机上重新安装时,应用程序恢复不再成功。

临时解决方案是:“关闭 iCloud->Documents&Data - 关闭并打开网络 - 打开 Documents&Data”,但你应该等待几分钟,然后它应该可以工作。

所以,问题:

  1. 你对iCloud有这样的问题吗?
  2. 有什么办法可以查出数据是不可用还是只是还没有下载?
  3. iCloud 是否有任何已知的“延迟”?我听说过大约 7 秒,但这显然不是真的。
  4. 似乎当应用程序未安装时,iCloud 数据的更新非常快(几秒钟),但是当您重新安装应用程序时,icloud 需要几分钟来实现键值存储。有没有办法强制这个过程?

PS 下面是我的 CloudHelper 供您参考 - 非常简单的 c++ 类,用于向/从 iCloud 键值存储写入/读取二进制数据。它不可编译,我已经对其进行了一些调整以使其更加清晰 - 删除了与引擎相关的代码。尽管如此,如果您删除 MySystem::... 调用,它仍然可以很好地工作。除了我之前提到的。


更新 2

现在是 2016 年,Android 成为 ios 的邪恶双胞胎,人类发现了引力波,希格斯获得了诺贝尔奖,微软收购并杀死了诺基亚。但 iCloud 仍然像以前一样愚蠢。

最后,我在几个 VPS 上制作了自己的网络服务堆栈。我拒绝使用第三方服务,因为它们大多是不稳定和不可预测的。然而我需要 iCloud。因为苹果的另一个死去的孩子不起作用。密钥链。当我的游戏开始时,它的服务就死了。所以我决定在云中存储随机 UUID 以区分用户(不再有设备 ID),即使在重新安装后也是如此。但是会出什么问题呢?一切!我花了两天时间让这个愚蠢的狗屎部署没有错误,现在它时不时丢失我的数据!

谢谢苹果,谢谢,谢谢,谢谢!啦啦啦!太好啦!(马戏团的音乐声,逐渐变成哭泣声)

0 投票
1 回答
247 浏览

objective-c - NSUbiquitousKeyValueStore 是否经过认证可以在没有连接的情况下工作?

文档对此似乎不太清楚,但是当设备未连接时,我可以依靠 NSUbiquitousKeyValueStore 在本地保存数据,还是应该使用 NSUserDefaults?

0 投票
4 回答
364 浏览

objective-c - 跨设备正确处理 NSUbiquityKeyValueStore 更新?

我的应用程序使用 NSUbiquityKeyValueStore(一组对象)在 iCloud 中存储单个键值对。当数组中的任何对象发生更改时,整个数组都会保存到 iCloud。只要每个设备都有机会在本地进行更改之前下载最新的更新,这将非常有效。否则,本地更改可能会在其他设备的最新更新被拉下之前被推送到 iCloud,并且这些更新会在所有设备上丢失。这是我的应用程序的缺点还是 iCloud 的缺点,我该如何防止这种情况发生?

0 投票
5 回答
2876 浏览

ios - 删除 iCloud 数据不会清除 NSUbiquitousKeyValueStore?

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

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

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

0 投票
1 回答
245 浏览

objective-c - NSUbiquitousKeyValueStore 类和 -boolForKey: 方法

是链接

boolForKey:返回与指定键关联的布尔值。

-(BOOL)boolForKey:(NSString *)aKey 参数 aKey 键值存储中的键。

返回值 如果布尔值与指定的键相关联,则返回该值。如果未找到密钥,则此方法返回 NO。

所以,在过去的 4 个小时里,我仍然无法找到一种方法来区分代码中的这两种情况:

A)用指定键设置布尔值 NO 后返回值为 NO

从:

B)返回值为NO,因为没有找到这样的指定键!

任何帮助,将不胜感激 :)

0 投票
1 回答
1560 浏览

iphone - iCloud 同步不适用于 iPhone 4S 和 5 上的应用程序

概括:

安装在支持 iCloud 同步的 iOS(iPhone 4S 或 iPhone 5 - 均已测试)上的应用程序实际上并不与 iCloud 同步。iOS 版本为 6.1.2。

我们正在开发一个应用程序并添加了 iCloud 支持。配置文件在启用 iCloud 的情况下重新创建并存储在设备上。权利在 xcode 中正确配置为使用 iCloud 和键值存储(标识符的值设置为默认值)。我们按照 Apple 的 iCloud 设计指南教程来实现与 iCloud 同步的功能(使用 NSUbiquitousKeyValueStore 类来存储和读取值)。

重现步骤:

在 iPhone 4S 或 5(安装了 iOS 6.1.2)上使用支持 iCloud 的应用程序(处于开发模式或从 App Store 安装的应用程序)。转到设置 > iCloud > 文档和数据并启用文档和数据并禁用使用蜂窝数据。尝试将应用程序与 iCloud 一起使用。数据不会在设备之间同步。我们也尝试如下:运行应用程序,将值存储到 iCloud,删除应用程序,重新安装应用程序,运行应用程序,无法从 iCloud 检索值。

关闭 iPhone 并重新打开。转到设置 > iCloud > 文档和数据并启用使用蜂窝数据。

现在运行应用程序并启用 iCloud 并将值存储在 iCloud 中。该值是从 iCloud 同步的……一切正常。

预期成绩:

如果禁用使用蜂窝数据并且在设置 > iCloud > 文档和数据中启用了文档和数据,则 iCloud 同步有效。

实际结果:

如果在“设置”>“iCloud”>“文档和数据”中禁用“使用蜂窝数据”,iCloud 同步将不起作用。

笔记:

此外,通知 NSUbiquitousKeyValueStoreDidChangeExternallyNotification 从未触发选择器集,除非在“设置”>“iCloud”>“文档和数据”中启用了“使用蜂窝数据”。

任何人都可以重现相同的行为吗?有人可以让 iCloud 同步与在设置 > iCloud > 文档和数据中禁用的使用蜂窝数据一起工作吗?

提前致谢!

0 投票
1 回答
173 浏览

ios - iCloud 键值生命周期

鉴于在卸载创建它们的应用程序时不会删除 iCloud 键值存储条目,那么何时删除数据?

0 投票
2 回答
427 浏览

ios - iCloud 键值存储的行为类似于 NSUserDefaults

我没有使用模拟器。代码中的一切似乎都运行良好。我可以读写 NSUbiquitousKeyValueStore,它会在应用程序运行之间保留数据。

返回真。但是,更新永远不会到达其他设备,如果我从一台设备上删除应用程序并重新安装它,NSUbiquitousKeyValueStore 就会被清除干净。本质上,它的行为类似于 NSUserDefaults 的别名。我已设置权利,并且在配置门户中启用了 iCloud。我的目标设置已选中启用 iCloud 和键值存储,并将“使用带有标识符的存储”设置为我的应用程序包标识符。我在“Ubiquity Containers”中有一个条目,这也是我的捆绑包名称。有什么我想念的吗?配置?初始化步骤?谢谢。