gpt4 book ai didi

ios - 在后台运行的 swift WatchConnectivity - ApplicationContext 并非一直运行

转载 作者:行者123 更新时间:2023-11-28 15:23:19 27 4
gpt4 key购买 nike

我想知道一种更好的方式来发送(使用 iPhone)消息到 Watch(在后台)。目前我使用:

session.update(applicationContext: package, completion: nil)

用于向 Watch 和

发送消息
 func didReceivedApplicationContext(applicationContext:[String : Any])

在 Watch 中接收消息。问题是正如文档中所说“系统将在适当的时间传输内容”,而我无法控制那些“适当的时间”。

此时,我在 iPhone 类中查看 Watch 的状态。如果 Watch 在后台,我用 updateApplicationcontext 发送数据(这不是很好),否则,如果 Watch 在前台,我用 sendMessage 发送数据

代码:

 if session.isWatchReachable()
{
session.send(message: package, completion: nil)
}
else
{
session.update(applicationContext: package, completion: nil)
}

那么在后台传输数据有更好的方法吗?

最佳答案

好吧,您必须在后台传输和立即发送数据之间做出选择。使用 WatchConnectivity 框架无法安排数据传输在准确的时间发生。

您必须选择是使用即使您的应用程序在后台也可以发送数据的方法,还是立即从前台发送数据。

如果您需要保证在您的应用程序从后台唤醒时数据将被传输,并且您的用例 updateApplicationContext 在测试期间被证明是不够的,您可以使用变通方法。

解决方法是使用 updateApplicationContext 在后台传输数据,并在 Watch 应用程序的 ExtensionDelegate 类中使用 applicationDidBecomeActive() 方法要检查数据传输是否在后台发生,如果没有发生,请使用 sendMessage 函数立即从其他应用程序请求数据,并将请求的数据作为响应发回。

要实现这一点,您的函数在您的 Watch 应用程序中应如下所示:

func applicationDidBecomeActive(){
if !haveReceivedData { //Bool value that should be updated to true once data is received from the phone
session.sendMessage(["Requesting data":True], replyHandler: {
//parse the data, update the UI
}, errorHandler: { error in
print("Error requesting data",error)
})
}
}

然后在您的 iPhone 应用程序上执行以下操作:

func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) {
if let isRequestingData = message["Requesting data"] as? Bool, isRequestingData == true {
replyHandler(["Requested data":data])
}
}

关于ios - 在后台运行的 swift WatchConnectivity - ApplicationContext 并非一直运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45612876/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com