1

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

  1. 并发症触发 ExtensionDelegate 向 AppDelegate 发送消息以唤醒父 IOS 应用

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

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

  4. ExtensionDelegate 传递给复杂控制器

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

我需要设置什么设置吗?(已经在 info.plist 中设置了后台下载)请在 Swift 中。

添加了附加信息:

在上述情况下(ComplicationControllor 定期/通过 ExtensionDelegate 计划更新请求),通过 WCSession sendMessage 唤醒 IOS 应用程序不起作用。

当我在 Apple Watch 上启动应用程序(ViewDidLoad 中的接口控制器触发 ExtensionDelegate)以唤醒父应用程序时,我看到了同样的问题。

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

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

由于它使用完全相同的 ExtenstionDelegate 函数,就像在所有情况下发送消息一样,我无法理解为什么只有在手动触发响应时才收到/唤醒父应用程序成功。

这里是来自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)")
                }
            }

        }
    }
}
4

1 回答 1

0

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

class ExtensionDelegate: NSObject, WKExtensionDelegate {

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

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

于 2015-10-24T14:41:55.983 回答