在watchOS1中,我们有一个方法“openParentApplication”。该方法即使在未在前台或后台运行时也与电话应用程序通信并立即获取回复。我需要类似watchOS2的东西。即使我的iPhone应用程序没有运行,我希望我的手表应用程序能够立即与手机应用程序通信。像CRAXDRT.DatabaseTable
,updateApplicationContext:error:
和sendMessage:replyHandler:errorHandler:
这样的方法在这种情况下无用。
请有人建议我采用更好的方法来实现这一目标吗?
答案 0 :(得分:3)
实际上sendMessage:replyHandler:errorHandler:
正在按照您的要求行事。只要您的手表连接到手机,它就会立即得到对该消息的响应。当应用程序位于前台,后台或根本不运行时,此功能正常工作。
以下是您设置的方式:
在WatchExtension中:
设置会话。通常在您的ExtensionDelegate中:
func applicationDidFinishLaunching() {
if WCSession.isSupported() {
let session = WCSession.defaultSession()
session.delegate = self
session.activateSession()
}
}
然后在需要应用内容时发送消息:
if WCSession.defaultSession().reachable {
let messageDict = ["message": "hello iPhone!"]
WCSession.defaultSession().sendMessage(messageDict, replyHandler: { (replyDict) -> Void in
print(replyDict)
}, errorHandler: { (error) -> Void in
print(error)
}
}
在iPhone App中:
相同的会话设置,但这次也设置了委托:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
...
if WCSession.isSupported() {
let session = WCSession.defaultSession()
session.delegate = self
session.activateSession()
}
}
然后实现委托方法将回复发送到手表:
func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) {
replyHandler(["message": "Hello Watch!"])
}
只要Watch和iPhone之间存在连接,此功能就可以使用。如果应用程序未运行,系统将在后台启动它。所以,基本上它就像openParentApplication(_:reply:)