通过sendMessage唤醒父IOS应用程序不工作

通过sendMessage唤醒父IOS应用程序不工作,ios,swift2,apple-watch,sendmessage,watchconnectivity,Ios,Swift2,Apple Watch,Sendmessage,Watchconnectivity,我的目标是通过以下步骤更新时钟套件: 复杂性触发ExtensionLegate向AppDelegate发送消息,以唤醒父IOS应用程序 iOS应用程序将下载/XML解析数据 AppDelegate将通过TransferCurrentCompliationUserInfo将数据传输到ExtensionDelegate ExtensionDelegate传递给控制器 当iOS应用程序在前台运行/处于活动状态时,所有这些都可以工作。应用程序未启动时,它不工作 有什么需要设置的吗?(已经在info.pl

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

  • 复杂性触发ExtensionLegate向AppDelegate发送消息,以唤醒父IOS应用程序

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

  • AppDelegate将通过TransferCurrentCompliationUserInfo将数据传输到ExtensionDelegate

  • ExtensionDelegate传递给控制器

  • 当iOS应用程序在前台运行/处于活动状态时,所有这些都可以工作。应用程序未启动时,它不工作

    有什么需要设置的吗?(已经在info.plist中安装了后台下载)请使用Swift

    补充补充资料:

    在上述场景中(CompliationController通过ExtensionLegate发出常规/计划更新请求),通过WCSession sendMessage唤醒IOS应用程序不起作用

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

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

    使用上述“自动”请求场景使用的代码,我还实现了一个按钮(为了测试目的手动触发)。如果按下手表上的按钮,它有时会工作(ViewController通过ExtensionDelegate中的相同功能将消息发送给AppDelegate,此消息会唤醒并回复)。虽然我找不到一个模式

    由于它使用了与发送消息的所有场景完全相同的ExtenstionDelegate功能,因此我无法理解为什么只有在收到手动触发的响应/父应用程序唤醒成功时才会发生

    这里是来自ExtensionLegate的代码(由CompliationController、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")
                })
            }
    
    代表:

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

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

    class ExtensionDelegate: NSObject, WKExtensionDelegate {
    
        override init() {
            super.init()
            if WCSession.isSupported() {
                let session = WCSession.defaultSession()
                session.delegate = self
                session.activateSession()
            }
        }
        ...
    }
    

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

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

    class ExtensionDelegate: NSObject, WKExtensionDelegate {
    
        override init() {
            super.init()
            if WCSession.isSupported() {
                let session = WCSession.defaultSession()
                session.delegate = self
                session.activateSession()
            }
        }
        ...
    }
    

    ApplicationIDFinishLaunching
    仅在用户启动WatchApp时调用,但在复杂情况请求新数据时不调用。

    感谢您的回答。我已经在init函数中启动了WCSession(在AppDelegate和ExtensionDelegate中都有)。不幸的是,当呼叫源于复杂情况时,这不会唤醒IOS父应用程序(将为问题添加更多细节)。谢谢您的回复!!请您将代码的相关部分添加到您的答案中,好吗?否则,很难找到问题。谢谢您的回答。我已经在init函数中启动了WCSession(在AppDelegate和ExtensionDelegate中都有)。不幸的是,当呼叫源于复杂问题时,这不会唤醒IOS家长应用程序(将为问题添加更多细节)。感谢您的回答!!您可以将代码的相关部分添加到您的答案中吗?否则很难找到问题。