7

有没有办法从 Watchkit 扩展调用 iPhone 上的类中定义的方法?

据我了解,目前Watch kit和iPhone之间进行本地通信的一种方式是使用NSUserDefaults,但是还有其他方式吗?

一个简单的例子会很棒。

4

4 回答 4

5

您可以将类添加到两个目标(主 iOS 应用程序和 WatchKit 扩展)并直接使用 WatchKit 扩展中的方法。

不包括目标

方便地添加几乎没有依赖关系的类(首选实用程序或类别)。如果文件已经添加到项目中,您可以删除它(删除引用)并再次添加它,包括多个目标。

例如,我在项目中的 NSString+color 类别在 iOS 应用程序和 Watch 应用程序中可以正常工作。

更新:您也可以在右侧面板(实用程序)中执行此操作。请参阅下面的链接:cs621620.vk.me/v621620973/13f86/9XYDH1HL5BI.jpg

于 2015-02-13T15:34:19.183 回答
4

WatchKit Extension 和 iOS 应用程序之间有两种主要的“通信”方式,具体取决于您要完成的任务。

1. openParentApplication:reply:
这将在后台打开您的 iOS 应用程序,并允许您从您的 iOS 代码执行逻辑并将响应发送回您的扩展程序。例如 -

    [InterfaceController openParentApplication:@{ @"command": @"foo" }
                                         reply:^(NSDictionary *replyInfo, NSError *error) {
                                         self.item = replyInfo[@"bar"];
    }];

查看框架参考 - https://developer.apple.com/library/prerelease/ios/documentation/WatchKit/Reference/WKInterfaceController_class/index.html#//apple_ref/occ/clm/WKInterfaceController/openParentApplication:reply

MMWormhole 是一个库,您可以使用它来管理这些通信

2. 共享容器
如果您只需要访问您的 iOS 应用程序可以访问的相同数据,您可以跨两个目标实现共享容器。

这可以从仅使用访问共享的 NSUserDefaults(如您所提到的)或一直到使用 Core Data 和访问跨 iOS 和 WatchKit 的共享持久性堆栈。

编程参考 - https://developer.apple.com/library/ios/technotes/tn2408/_index.html

3. Singleton
也许您只需要从您的 WatchKit Extension 访问共享逻辑,而不需要上述两个选项的复杂性。只要您不在两个目标之间保留任何数据,您就可以创建一个单例类,您可以从扩展中调用该类来执行您需要的方法。

于 2015-01-05T11:30:43.510 回答
3

根据 Apple 的WatchKit 编程指南,您可以通过使用openParentApplication和传递字典与 iPhone 上的 iOS 应用程序进行通信。父应用程序通过handleWatchKitExtensionsRequestAppDelegate. 从那里您可以根据传递的参数调用其他方法。

handleWatchKitExtensionRequest然后调用该reply方法将参数传回给 WatchKit Extension:

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(replyValues["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)
}

请注意,这似乎在 Xcode 6.2 Beta 3 中被破坏了。

于 2015-01-03T11:30:40.907 回答
2

对于 WatchOS2openParentApplication已弃用。它的替代品WCSessionWatch Connectivity Framework中

首先,使用以下代码WCSession在 watch( ExtensionDelegate) 和 iOS( ) 中初始化AppDelegate

if WCSession.isSupported() {
  let session = WCSession.defaultSession()
  session.delegate = self
  session.activateSession()
}

使用从手表向手机发送通知

session.sendMessage(msg, replyHandler: { (responses) -> Void in
  print(responses)
 }) { (err) -> Void in
 print(err)
}

AppDelegate在使用中处理消息

func session(_ session: WCSession,
             didReceiveMessage message: [String : AnyObject],
             replyHandler replyHandler: ([String : AnyObject]) -> Void)     
{
   //do something according to the message dictionary
   responseMessage = ["key" : "value"] //values for the replyHandler
   replyHandler(responseMessage)
}
于 2016-01-19T12:21:40.807 回答