2015-10-16 80 views
2

在watchOS1中,我们有一个方法“openParentApplication”。即使电话应用程序未在前台或后台运行并立即获取答复,该方法也可与电话应用程序进行通信。我需要类似的watchOS2。即使我的iPhone应用程序未运行,我也希望我的手表应用程序能够立即与手机应用程序通信。诸如updateApplicationContext:error:,sendMessage:replyHandler:errorHandler:transferUserInfo:等方法在这种情况下没有帮助。watchOS2应用程序和iPhone应用程序通信

请有人建议我一个更好的方法来实现这一目标吗?

+0

我一直在寻找相同的解决方案一段时间,但我找不到任何可以满足我需要的东西。有类似的话题在这里:http://stackoverflow.com/questions/33136536/watchos2-wcsession-sendmessage-doesnt-wake-iphone-on-background – Eluss

回答

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应用程序:

相同的会话建立,但是这一次还设置委托:

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!"]) 
} 

这工作只要有监视和iPhone之间的连接。如果应用程序未运行,系统将在后台启动它。所以,基本上它就像openParentApplication(_:reply:)

+0

非常感谢! :) 有效.. :) – Ankita