【问题标题】:Cordova automatically sync data between several IOS devices using iCloudCordova 使用 iCloud 在多个 IOS 设备之间自动同步数据
【发布时间】:2017-02-21 16:48:21
【问题描述】:

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

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

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: ios cordova backup storage icloud


    【解决方案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 文件。在 capabilities 选项卡中,您必须打开 iCloud 参数。然后,您可以选择要在 Apple 设备之间同步数据的方式。

    • 键值存储
    • iCloud 文档
    • CloudKit

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

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

    例如,当您使用此插件保存您的设备1 的键值时。这个键值被保存到本地 iCloudKV 对象中。在设备上之后您无法立即获得它2。

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 感谢您的提示,我将阅读文档并尝试一下!你知道我是否必须通过 Test Flight 提交我的应用程序才能进行测试?或者我可以简单地在我的 iPhone 和 iPad 上使用 Xcode 安装我的应用程序并进行自动同步测试吗?
      • 答案是什么? :)
      • @redolent :您不需要 TestFlight 来使其工作(幸运的是)。安装插件并设置 Xcode 功能设置后,键/值存储将在连接到同一 iCloud 帐户的所有 iOS 设备之间可用。
      【解决方案3】:

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

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

      【讨论】:

      • 你说得对,但实际上我在编写示例时犯了一个错误......在我的“真实测试”中,我使用“cloud”而不是“icloud”......我会在我的现在的例子!谢谢;)
      猜你喜欢
      • 1970-01-01
      • 2015-11-08
      • 1970-01-01
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      相关资源
      最近更新 更多