如何使用来自复杂控制器的发送消息唤醒iOS父应用程序



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

这仅在从watchApp/ViewController调用以下sendMessage函数时才有效。当从复杂控制器调用它时,会发送消息,但 iOS 父应用现在会唤醒。

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

这里是简化的代码:

在 AppDelegate 和 ExtensionDelegate 中:

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

在扩展委托中:(这里没有问题,消息已成功发送(

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

在应用程序代表中:(当 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])
    }
}

这是从复杂功能控制器调用函数的方式(它确实发送消息但不唤醒父应用程序(:

  func requestedUpdateDidBegin(){
        dispatch_async(dispatch_get_main_queue()) { () -> Void in
            let extensionDelegate = ExtensionDelegate()
            extensionDelegate.loadData()
        }
    }

主要问题是您尝试在复杂数据源中包含(嵌套(异步调用。 但是,您请求的更新将到达其方法的末尾,并且实际上不会进行时间线更新(因为您没有重新加载或延长时间线,即使您有,也不会及时收到当前更新的新数据(。

由于计划更新没有新数据可用,因此您必须执行第二次更新才能在收到新数据使用新数据。 执行两次背靠背更新不仅没有必要,而且会浪费更多的日常复杂预算。

Apple 建议您在更新之前获取并缓存数据,以便复杂数据源可以直接将请求的数据返回给复杂数据服务器。

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

如何更新复杂功能?

  • 使用手机中的后台更新来传输数据,以便为复杂功能的下一次计划更新做准备。 transferUserInfoupdateApplicationContext适用于这种类型的更新。

  • 使用transferCurrentComplicationUserInfo立即传输并发症数据并更新时间线。

这两种方法的优点是只需要进行一次更新。

相关内容

最新更新