【问题标题】:Apple Watch, WatchKit Extension and main applicationApple Watch、WatchKit 扩展和主应用程序
【发布时间】:2015-01-27 05:57:28
【问题描述】:

有逻辑的主应用程序,我们将应用程序扩展到 Apple Watch。

添加目标后,xCode 会再创建 2 个应用程序:带有代码的扩展程序和监视套件应用程序。

问题:扩展中的代码如何重用准备好的和已经制作的主 iOS 应用程序的逻辑?扩展应用如何与主应用通信并发送命令。

【问题讨论】:

  • 你的问题太宽泛了。请更具体地提出问题。根据文档,您将拥有一个在手机上运行的主应用程序、一个在手机上运行的应用程序扩展程序,以及一个 watchkit 包,这些资源包是传送到手表以在手表上显示的资源。您的代码实际上都没有在手表上运行。您只是向手表提供资源包和数据。
  • 您可以使用应用组或github.com/mutualmobile/MMWormhole

标签: ios main watchkit


【解决方案1】:

要与包含的 iPhone 应用通信,您可以使用

(BOOL)openParentApplication:(NSDictionary *)userInfo
                        reply:(void (^)(NSDictionary *replyInfo,
                                        NSError *error))reply

在你的WKInterfaceController

来自 Apple 文档

使用此方法与您的包含 iOS 应用程序进行通信。打电话 该方法使 iOS 在后台启动应用程序(根据需要) 并调用application:handleWatchKitExtensionRequest:reply: 方法 它的应用程序委托。该方法具有以下签名:

- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo
reply:(void(^)(NSDictionary *replyInfo))reply

应用委托接收您传递给 userInfo 的字典 参数并使用它来处理您提出的任何请求。如果它 提供回复,WatchKit 会执行你在 该方法的回复参数。

【讨论】:

  • 关于如何使用后台模式的代码示例,以确保主应用程序有时间发送回复,请参阅“从手表应用程序调用父应用程序”(stackoverflow.com/questions/30000274/…)跨度>
【解决方案2】:

Apple Watch Extension 的当前状态:

  • 您可以在 iOS 主应用程序和 WatchKit 扩展程序之间共享信息。使用 App Groups 和 NSUserDefaults 访问共享信息对象。

  • 不能从您的 iOS 应用执行代码,该代码由 Apple Watch 上的操作触发。

至少现在还没有。

编辑:从 Xcode 6.2 Beta 2 开始

现在可以通过 Apple Watch 与父 iOS 应用程序进行通信。

在 WatchKit Extension 中通过openParentAppentApplicion 调用父应用程序。可以将值字典传递给父应用程序,父应用程序可以返回值字典。

Watchkit 扩展:

// Call the parent application from Apple Watch

// values to pass
let parentValues = [
    "value1" : "Test 1",
    "value2" : "Test 2"
]

WKInterfaceController.openParentApplication(parentValues, reply: { (replyValues, error) -> Void in
    println(replyValues["retVal1"])
    println(replyVaiues["retVal2"])
})

iOS 应用:

// in AppDelegate.swift
func application(application: UIApplication!, handleWatchKitExtensionRequest userInfo: [NSObject : AnyObject]!, reply: (([NSObject : AnyObject]!) -> Void)!) {
    // retrieved parameters from Apple Watch
    println(userInfo["value1"])
    println(userInfo["value2"])

    // pass back values to Apple Watch
    var retValues = Dictionary<String,String>()

    retValues["retVal1"] = "return Test 1"
    retValues["retVal2"] = "return Test 2"

    reply(retValues)
}

【讨论】:

  • 谢谢zisoft,有没有办法在extension和host app之间的内存中实现event-listener和trigger功能?
  • 我假设您正在考虑这样的事情:按下 Apple Watch 上的按钮并在 iPhone 上开始操作。这将需要保持 iOS 应用程序运行并轮询任何类型的信息。到目前为止,我还没有找到办法做到这一点。也许有时,这是非常新的东西......
  • 我创建了 Pull 服务,它监视我们存储在 NSUserDefaults 中的值,如果它们发生变化,通知侦听器。问题:似乎只有在应用程序启动、重新启动时才会更改值。有什么想法吗?
  • 还可以通过更新共享应用程序组容器中的文件在应用程序及其扩展程序之间传递信息。然后,您可以在一个进程中写入文件,并使用NSFilePresenter 在另一个进程中获得通知。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-05
  • 2016-05-01
  • 1970-01-01
  • 2015-05-19
相关资源
最近更新 更多