我们可以通过监视工具包扩展调用父ios应用中的方法openParentApplication:reply:
。
但是有没有办法从parent ios app调用watchkit扩展中的方法?
例如:在我的应用中,当用户在ios应用中添加事件时,watchkit事件列表也应该刷新,因此我需要在用户在主应用中添加新事件时调用watchkit扩展中的refresh方法。
请帮忙。
感谢。
答案 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应用程序的消息”。但在真实的应用程序中,最好使用这些文本字符串的属性来避免拼写错误。