在后台运行的swift WatchConnectivity- ApplicationContext未始终运行

s71maibg  于 2023-03-28  发布在  Swift
关注(0)|答案(2)|浏览(190)

我想知道一个更好的方式发送(与iPhone)消息观看(在后台).目前我用途:

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

用于向Watch发送消息和

func didReceivedApplicationContext(applicationContext:[String : Any])

在Watch中接收消息。问题是,正如文档中所说的那样,“系统将在适当的时间传输内容”,而我无法控制这些“oportune时间”。
此时,我在iPhone类中检查Watch的状态。如果Watch在后台,我用updateApplicationcontext发送数据(这不是很好),否则,如果Watch在前台,我用sendMessage发送数据
验证码:

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

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

gmxoilav

gmxoilav1#

你必须在后台传输和立即发送数据之间做出选择。使用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])
        }
    }
q43xntqr

q43xntqr2#

这是不可能在后台接收iWatch上的数据。您只能在前台接收数据。updateApplicationContext()方法是专为在后台发送数据(从iPhone到iWatch)而设计的。当手表应用程序将被激活(打开)时,上下文数据将可供使用-无需担心。
15:43 - https://developer.apple.com/videos/play/wwdc2021/10003/
所以,你在答案中所做的是正确的解决方案。

相关问题