3

我正在尝试通过从 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])

    }

}

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

  func requestedUpdateDidBegin(){

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

            let extensionDelegate = ExtensionDelegate()
            extensionDelegate.loadData()

        }
    }
4

1 回答 1

1

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

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

苹果建议你在更新前获取数据并缓存,这样复杂数据源就可以直接将请求的数据返回给复杂服务器。

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

如何更新并发症?

  • 使用手机的后台更新将数据传输到手头,以备下次计划更新时使用。 transferUserInfo并且updateApplicationContext适合这种类型的更新。

  • 用于transferCurrentComplicationUserInfo立即传输复杂数据并更新您的时间线

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

于 2016-05-01T01:00:19.327 回答