如何从complicationController唤醒iOS父app与sendMessage

时间:2015-11-04 22:40:04

标签: ios iphone swift2 apple-watch-complication clockkit

我试图通过从watchkit扩展程序发送消息来唤醒iOS父应用程序。

这只适用于从watchApp / ViewController调用下面的sendMessage函数时。从ComplicationController调用它时,会发送消息,但iOS父应用程序现在会唤醒。

任何建议表示赞赏。 (请在Swift中提供任何代码参考)

这里简化的代码:

在AppDelegate和ExtensionDelegate中:

override init() {
    super.init()
    setupWatchConnectivity()
}

private func setupWatchConnectivity() {
    if WCSession.isSupported() {
        let session = WCSession.defaultSession()
        session.delegate = self
        session.activateSession()
    }
}

在ExtensionDelegate中:(此处没有问题,消息已成功发送)

func sendMessage(){
        let session = WCSession.defaultSession()
        let applicationData:[String:AnyObject] = ["text":"test", "badgeValue": 100 ]

        session.sendMessage(applicationData, replyHandler: {replyMessage in
            print("reply received from iphone")
            }, errorHandler: {(error ) -> Void in
                // catch any errors here
                print("no reply message from phone")
        })
    }
    print("watch sent message")

}

在AppDelegate中:(当iOS应用未运行/不在前台时未收到)

func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) {
    let text = message["text"] as! String
    let badgeValue = message["badgeValue"] as! Int

    dispatch_async(dispatch_get_main_queue()) { () -> Void in

        print("iphone received message from watch App")
        self.sendNotification(text, badgeValue: badgeValue)
        let applicationDict = ["wake": "nowAwake"]
        replyHandler(applicationDict as [String : String])

    }

}

这是从Complication Controller调用该函数的方法(它确实发送了消息但没有唤醒父应用程序):

  func requestedUpdateDidBegin(){

        dispatch_async(dispatch_get_main_queue()) { () -> Void in

            let extensionDelegate = ExtensionDelegate()
            extensionDelegate.loadData()

        }
    }

1 个答案:

答案 0 :(得分:1)

主要问题是您尝试包含(嵌套)asynchronous calls within your complication data source。但是,您请求的更新将到达其方法的末尾,并且实际上不会发生时间线更新(自you didn't reload or extend the timeline起,即使您有,也不会及时收到当前更新的新数据)

由于预定更新无法获得新数据,因此您必须执行第二次更新才能使用新数据一次收到了。执行两次背靠背更新不仅没有必要,而且浪费了更多的日常复杂预算。

Apple建议您fetch and cache the data in advance of the update,因此并发症数据源可以直接将请求的数据返回到并发症服务器。

  

数据源类的工作是尽快为ClockKit提供任何请求的数据。数据源方法的实现应该是最小的。不要使用数据源方法从网络获取数据,计算值或执行任何可能会延迟传输数据的操作。如果您需要获取或计算并发症的数据,请在iOS应用程序或WatchKit扩展的其他部分中进行,并将数据缓存在复杂数据源可以访问的位置。您的数据源方法应该做的唯一事情是获取缓存的数据并将其放入ClockKit所需的格式。

如何更新并发症?

这两种方法都具有仅需要一次更新的优势。