Cordova 使用 iCloud 在多个 IOS 设备之间自动同步数据

Cordova automatically sync data between several IOS devices using iCloud

我使用 Cordova 为 IOS 设备构建了一个通用混合应用程序。 在此应用程序中,一些数据(如分数、级别进展、设置、偏好等)使用 JavaScript 对象 LocalStorage 保存在本地。通过这种方式,当用户退出应用程序并稍后打开它时,一切都像以前一样(几乎所有游戏:)

我想做的是自动将此 LocalObject(包含所有数据)与用户的其他 IOS 设备同步,而不强迫他连接到 Game Center 或任何其他帐户(除了当然是 iCloud)。

示例:用户开始在 iPhone 上玩,然后在家里,他想继续玩他的 iPad。

所以我阅读了 Cordova documentation 并且我知道我必须在 config.xml 文件中将 BackupWebStorage 值设置为 "cloud" 以将数据存储在云中然后从中自动获取它其他设备...

<platform name="ios">
    <preference name="BackupWebStorage" value="cloud"/>
</platform>

在那一步之后,我通过 TestFlight 发布了我的应用程序,并将它安装在我的 iPhone 和 iPad 上......但不幸的是,它不起作用...... LocalObject不会通过 iCloud 自动同步。

关于这个问题,我在网上做了一些研究,但没有找到任何明确的答案。我找到了在应用程序和服务器之间同步数据的示例音调(我知道该怎么做),但与我的问题无关...

能给我一些技巧吗?可能是演示 link?举个例子?

我很确定我想做的事是可能的,因为我的 IOS 设备上安装了一些应用程序,按照我解释的那样工作。例如,当我玩著名的 Alto's Adventure 时,如果我在游戏期间在我的 IOS 设备之间切换,我所有的进度都会立即自动在我的设备之间同步。但是,我没有连接到 Game Center 或任何其他帐户...

所以呢?这是如何运作的?谢谢!

我想你打错了。应该是 cloud 而不是 icloud.

<preference name="BackupWebStorage" value="cloud"/>

您还必须使用正确的权利文件对二进制文件进行代码签名。否则,您的应用将无法使用 iCloud 服务。 您可以参考 Adding Capabilities 文档了解如何操作。

我找到了一种在 Cordova 项目中连接到同一 iCloud 帐户的 iOS 设备之间同步数据的方法。让我们看看它是如何工作的:

1 - 科尔多瓦 config.xml

在您的 config.xml 文件中,您必须将首选项参数 BackupWebStorage 设置为正确的值。选择"cloud":

<platform name="ios">
     <preference name="BackupWebStorage" value="cloud"/>
</platform>

2 - Xcode 功能设置

在 Xcode 中打开 /platforms/ios/myProjectName.xcodeproj 文件。在 capabilities 选项卡中,您必须打开 iCloud 参数。然后您可以选择在 Apple 设备之间同步数据的方式。

  • Key-Value 存储
  • iCloud 文档
  • CloudKit

就我而言,我只需要将数据同步为 key-value 存储,例如 {"playerID":"123456"}。

3 - 添加 icloudkv 插件同步 key-value 数据

然后您必须向您的 Cordova 项目添加一个插件才能同步数据。我使用了 cordova-plugin-icloudkv ,它很适合我的需要。您可以使用 CLI 添加它(Mac OSX 上的终端):

$ cordova plugin add cordova-plugin-icloudkv

完成后,您可以开始向项目中添加 JavaScript 代码。在 device.ready() 函数被调用之后,您只需调用此函数一次:

iCloudKV.sync(syncSuccess, syncError);

function syncSuccess(_dictionary){
    // You can retrieve into the _dictionary object datas saved in the cloud.
    // Example with datas I have saved:
    var playerID = _dictionary['playerID'];
    var deviceUUID = _dictionary['deviceUUID'];
}

以后不用再调用这个函数,只需要在开始的时候初始化一次即可。 在调用 syncSuccess() 函数并具有 returned "success" 状态后,您现在可以像这样将数据保存、获取和删除到此对象中:

 iCloudKV.save(_key, _val, saveSuccess);
 iCloudKV.load(_key, loadSuccess, loadError);
 iCloudKV.remove(_key, removeSuccess);

瞧!

我认为这个插件有一个重要的点需要理解。一开始我还不清楚,所以让我们讨论一下:

当您从 iCloudKV 对象中保存或删除密钥时,您并不是在实时处理真正的 iCloudiCloudKV对象是一个本地对象(如果我错了请告诉我),真正的iOS同步数据过程会检查和分析。 iOS 同步进程自己管理 iCloudKV 对象,您不能直接要求 iCloud 保存或删除它。您只与 iCloudKV 对象交谈。

例如,当您使用此插件保存一个 key-value 设备时。此 key-value 保存到本地 iCloudKV 对象中。在设备上无法立即获取

当您在 device1 上退出应用程序时,iOS 同步数据过程将检查您的 iCloudKV 对象,然后如果需要,将在真实 iCloud 账号在线。如果您现在在设备 2 上启动您的应用程序(连接到相同的 iCloud 帐户),iOS 同步过程将同步您的数据,然后 iCloudKV对象就能return他们给你。

通过这种方式,您无法实时看到设备1 和设备2 之间的变化。首先,您必须等待 iOS 同步过程完成工作。在理解这个概念之前我做了很多测试:)

我希望这会对某些人有所帮助。谢谢!