iOS应用程序在与Watch - WatchKit通信1分钟后进入睡眠状态

时间:2016-05-09 12:43:25

标签: ios swift background watchkit watch-os-2

我正在使用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)
    }

1 个答案:

答案 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()
    }
}