Cordova使用iCloud

时间:2016-10-12 18:45:05

标签: ios cordova backup storage icloud

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

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

示例:用户开始在iPhone上播放,然后在家中,他想继续在iPad上播放。

所以我读了Cordova documentation,我知道我必须在config.xml文件中将BackupWebStorage值设置为“cloud”,以便将数据存储在云中,然后从其他设备自动获取... < / p>

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

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

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

你能告诉我一些技术吗?可能是演示链接?一个例子?

我很确定我想要做什么是可能的,因为我在我的IOS设备上安装了一些应用程序,正如我解释的那样。例如,当我玩着名的Alto's Adventure时,如果我在游戏过程中在IOS设备之间切换,我的所有进展都会立即在我的设备之间自动同步。但是,我没有连接到游戏中心或任何其他帐户...

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

3 个答案:

答案 0 :(得分:1)

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

1 - Cordova config.xml

在config.xml文件中,您可以将首选项参数BackupWebStorage设置为正确的值。选择“云”:

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

2 - Xcode功能设置

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

  • 键值存储
  • iCloud Documents
  • CloudKit

就我而言,我只需将数据同步为键值存储,例如{“playerID”:“123456”}。

Xcode Capabilities tab - iCloud key-value Storage

3 - 添加icloudkv插件以同步键值数据

然后,您必须为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()函数并返回“成功”状态后,您现在可以将数据保存,获取和删除到此对象中,如下所示:

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

瞧!

我认为使用此插件有一个重要的意义。我一开始对此不清楚,所以让我们来讨论一下:

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

例如,当您使用此插件保存设备1的键值时。此键值将保存到本地 iCloudKV 对象中。你无法在设备2上得到它。

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

通过这种方式,您无法实时查看device1和device2之间的更改。首先,你必须等待iOS同步过程完成这项工作。在理解这个概念之前,我做了很多测试:)

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

答案 1 :(得分:0)

我认为你有一个错字。应为cloud而不是icloud

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

答案 2 :(得分:0)

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