如何从 Watchkit 传递 NSURL -> 本地 Cordova 应用程序并使用 Javascript 打开浏览器

How to Pass an NSURL from Watchkit - > Native Cordova app & open browser with Javascript

我有一个可用的 cordova 应用程序并构建了一个 Watchkit 应用程序。意识到我不能将本机应用程序调用到前台或对其内部工作做任何事情,我想使用 Handoff 简单地通过 Safari 将用户发送到一个网页,该网页基本上可以从应用程序中提取代码并处理 URL查询字符串参数。所以我写了一个基本上是这样做的例程:

   var URLwithQuery = "http://www.example.com?query="+QueryVar

   var urlPath: String = URLwithQuery
   var url: NSURL = NSURL(string: urlPath)!

   updateUserActivity("com.example.www.hellobrowser", 
           userInfo: ["name":"WhereAmI"], webpageURL: url)

现在,我无法测试,因为我没有手表,而且模拟器不支持 Handoff。但我怀疑这是否可行:我在本机应用程序的根 info.plist 中手动插入了一个 NSUserActivityTypes 数组和 "hellobrowser" activity,但这是严重未记录的领域,虽然一切都编译和运行s,我不知道它是否真的会触发切换,直到我可以在实际手表上 运行 它。墨菲定律说它会失败。

另一种方法是以某种方式将 NSURL 传回 Cordova 并使用

window.open('http://www.example.com?Query='+QueryVar, '_system');

为此,我使用了 this Cordova -Watchkit plugin,它允许在 Watchkit 扩展和 cordova 应用程序中的 javascript 之间传递 JSON 对象。因此,在本机应用程序方面,我将实现此消息传递示例的一个版本以传递字符串化的 NSURL(除了此示例是 iPhone -> iPhone 而不是 Watchkit -> iPhone):

applewatch.init(function (appGroupId) {
    alert(appGroupId);

    applewatch.addListener("myqueue", function(message) {
        alert("Message received: " + message);
    });

    applewatch.sendMessage("test", "myqueue");
});

但是,我对传递 JSON 对象一窍不通,并且没有示例说明 Watchkit 应用程序或扩展程序中的 Swift 代码可能看起来像传递 NSURL 回到那个听众。

我怀疑有更简单的方法来做到这一点!!如果我可以从 Watchkit 应用程序中将 NSURL 作为字符串获取到我的本机应用程序的 javascript 中,那我就很幸运了。

在您的 WatchKit 扩展 WKInterfaceController 中,您需要引用 MMWormhole 库(已编译并包含在插件中)并执行如下操作:

var wormhole: MMWormhole!

wormhole = MMWormhole(applicationGroupIdentifier: "group.com.hellobrowser",
    optionalDirectory: nil)

wormhole.listenForMessageWithIdentifier("myqueue", listener: yourHandler)

然后通过 Apple Watch 插件从您的 Cordova 应用程序发送消息,以便 WatchKit 扩展侦听器接收消息:

applewatch.init(function () {
    applewatch.sendMessage("test", "myqueue");
}, null, "group.com.hellobrowser");

或者,如果您想设置可从 Cordova 应用程序和 WatchKit Extension 读取/写入的值,您可能需要查看使用 NSUserDefaults,它仅在插件中实现,因为这个问题已 post 编辑。

我希望这会有所帮助,完整的示例应用程序或详细的博客 post 将在我开始使用并且我知道 Apple 批准这些方法时可用。