我正在使用sendMessage在iOS app和watchKit之间实现简单的单线通信。
问题是 - 沟通是连续的。
用户按下appleWatch上的按钮,同样的操作发生在Phone e.t.c.
不幸的是,经过两三次动作后,iOS应用程序停止响应。
正如一些人在论坛上所建议的那样 - 我已经实现了backgroundTaskWithExpirationHandler
,但它不起作用(即使承诺的三分钟超时也不会给我)。
这是iOS应用AppDelegate中的代码
func session(session: WCSession, didReceiveMessage message: [String : AnyObject]) {
//recieve messages from watch
print(message["b"]! as? String)
let sweetN = message["b"]! as? String
//var sweetB = message["abs"]! as? [Int : Bool]
dispatch_async(dispatch_get_main_queue(), {
let taskID = self.beginBackgroundUpdateTask()
if sweetN == "peeks"{
if WCSession.isSupported(){
let message = [ "gettingData": "datareceived" ]
session.sendMessage(message, replyHandler: { replyDict in }, errorHandler: { error in })
}
}
self.endBackgroundUpdateTask(taskID)
})
}
func beginBackgroundUpdateTask() -> UIBackgroundTaskIdentifier {
return UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({})
}
func endBackgroundUpdateTask(taskID: UIBackgroundTaskIdentifier) {
UIApplication.sharedApplication().endBackgroundTask(taskID)
}
答案 0 :(得分:0)
这对我有用。 您必须在应用程序委托中设置WCSession,如:
func application(application:UIApplication,didFinishLaunchingWithOptions launchOptions:[NSObject:AnyObject]?) - >布尔{
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": "received!"])
}
并在apple watch中:文件扩展名delegate.swift也这样做:
override init() {
if WCSession.isSupported() {
let session = WCSession.defaultSession()
session.delegate = self
session.activateSession()
}
}