如何从父ios应用程序调用watchkit扩展中的方法

时间:2015-01-09 14:19:27

标签: ios objective-c swift watchkit apple-watch

我们可以通过监视工具包扩展调用父ios应用中的方法openParentApplication:reply:

但是有没有办法从parent ios app调用watchkit扩展中的方法?

例如:在我的应用中,当用户在ios应用中添加事件时,watchkit事件列表也应该刷新,因此我需要在用户在主应用中添加新事件时调用watchkit扩展中的refresh方法。

请帮忙。

感谢。

2 个答案:

答案 0 :(得分:4)

您不能直接从watchkit扩展中调用方法,但您可以发送darwin通知(或使用MMWormhole库(here),并在收到后执行正确的方法。

答案 1 :(得分:1)

您可以使用内置的 WatchConnectivity 框架将消息从iOS应用程序发送到配对的Apple Watch。

1)首先,在iOS应用和WatchKit扩展中激活手表连接会话两者。在iOS方面,它可以在app委托的application didFinishLaunchingWithOptions中完成。在Watch侧,您可以在WatchKit扩展委托的applicationDidFinishLaunching方法中运行此代码。

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

2)现在从您的iOS应用程序发送消息。

let session = WCSession.defaultSession()

session.sendMessage(["message from iOS app":""], replyHandler: { reply in
  // Handle reply from watch (optional)      
}, errorHandler: nil)

3)通过在session didReceiveMessage委托类中实施WCSessionDelegate方法,在WatchKit扩展程序中接收消息。

func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) {
  if let message = message["message from iOS app"] { 
    NSNotificationCenter.defaultCenter().postNotificationName("myapp.reload", object: self, userInfo: ["data": message])
  }
}

收到来自iOS的消息后,我们会使用postNotificationName方法发送通知。

4)在您需要更新的InterfaceController中订阅此通知(或者您希望接收此更新通知的任何其他地方)。

override func awakeWithContext(context: AnyObject?) {
  super.awakeWithContext(context)

  NSNotificationCenter.defaultCenter().addObserver(self, selector: "didReceiveReloadNotification:", name: "myapp.reload", object: nil)
}

deinit {
  NSNotificationCenter.defaultCenter().removeObserver(self,
  name: "myapp.reload", object: nil)
} 

5)最后,实现通知处理程序方法。您可以在此处更新UI。

func didReceiveReloadNotification(notification: NSNotification) {
  let userInfo = notification.userInfo as? [String: String]
  if let userInfo = userInfo, data = userInfo["data"] {
    // Update UI
  }
}

注意:为了便于阅读,我使用内联文本字符串作为通知名称“myapp.reload”,并使用消息键“来自iOS应用程序的消息”。但在真实的应用程序中,最好使用这些文本字符串的属性来避免拼写错误。