通过sendMessage无法正常唤醒父IOS应用

时间:2015-10-24 11:57:23

标签: ios swift2 apple-watch sendmessage watchconnectivity

我的目标是通过以下步骤更新时钟套件并发症:

  1. 复杂化触发ExtensionDelegate将sendMessage发送到AppDelegate以唤醒父IOS应用程序

  2. iOS应用程序将下载/ XML解析数据

  3. AppDelegate将通过transferCurrentComplicationUserInfo传输数据到ExtensionDelegate

  4. ExtensionDelegate传递给Complication Controller

  5. 当iOS应用程序在前台运行/活动时,这一切都有效。当应用程序未启动时,它不起作用。

    我需要设置任何设置吗? (已在info.plist中设置后台下载)请在Swift中。

    添加了其他信息:

    在上面的场景中(通过ExtensionDelegate进行ComplicationControllor常规/预定更新请求),通过WCSession sendMessage唤醒IOS应用程序不起作用。

    当我在apple watch上启动应用程序(InterfaceController在ViewDidLoad ExtensionDelegate中触发)以唤醒父应用程序时,我看到同样的问题。

    在这两种情况下都会发送消息,但如果不在前台,则不会对IOS应用程序做出反应。

    使用上述“自动”请求方案使用的完全相同的代码,我还实现了一个按钮(手动触发以进行测试)。如果在手表上按下按钮,它有时会起作用(ViewDetroller通过ExtensionDelegate中的相同功能向AppDelegate发送消息,此消息唤醒并回复)。我虽然无法找到模式。

    由于它使用完全相同的ExtenstionDelegate函数,就像在所有场景中都要发送消息一样,我无法理解为什么只有在手动触发响应时才接收/唤醒父app成功。

    来自 ExtensionDelegate 的代码(由ComplicationController调用,InterfaceController-ViewDidLoad以及提到的按钮:

    func sendMessage(){
                let session = WCSession.defaultSession()
                let applicationData = ["wake":"wakeUp"]
                session.sendMessage(applicationData, replyHandler: {replyMessage in
                    }, errorHandler: {(error ) -> Void in
                        print("no reply message from phone")
                })
            }
    

    和AppDelegate:

    func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) {
        let receivedMessage = message["wake"] as! String
        if receivedMessage == "wakeUp" {
            let applicationDict = ["wake": "nowAwake"]
            replyHandler(applicationDict as [String : String])
        }
        self.loadData()
    }
    
    func loadData(){
    
        ... code to load data
    
        dispatch_async(dispatch_get_main_queue()) { () -> Void in
            let dictionaryComplication = [...]
    
            if WCSession.isSupported() {
    
                let session = WCSession.defaultSession()
                if session.watchAppInstalled {
                    do {
                        session.transferCurrentComplicationUserInfo(dictionaryComplication)
                        try session.updateApplicationContext(dictionaryContext)
    
    
                    } catch {
                        print("ERROR: \(error)")
                    }
                }
    
            }
        }
    }
    

1 个答案:

答案 0 :(得分:0)

确保在ExtensionDelegate的init方法中激活WCSession,而不是在applicationDidFinishLaunching中激活:

class ExtensionDelegate: NSObject, WKExtensionDelegate {

    override init() {
        super.init()
        if WCSession.isSupported() {
            let session = WCSession.defaultSession()
            session.delegate = self
            session.activateSession()
        }
    }
    ...
}

applicationDidFinishLaunching仅在用户启动WatchApp时调用,而不是在复杂请求新数据时调用。