【问题标题】:swift WatchConnectivity running in background - ApplicationContext is not running all the timeswift WatchConnectivity 在后台运行 - ApplicationContext 并非一直在运行
【发布时间】:2017-08-10 11:46:10
【问题描述】:

我想知道一种更好的方式来发送(使用 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)
    }

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

【问题讨论】:

    标签: ios swift watchos-3 watchconnectivity


    【解决方案1】:

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

    【讨论】:

    • 如果我使用 updateApplicationContext 发送数据,如何使用 sendMessage 请求数据?
    • 顺便说一下,此时我在 iPhone 类中查看 Watch 的状态。如果 Watch 在后台,我使用 updateApplicationcontext 发送数据(这不是很好),否则,如果 Watch 在前台,我使用 sendMessage 发送数据。
    • 如果我在 ExtensionDelegate 类 applicationDidBecomeActive 中移动这段代码(如上所述)会有什么不同吗?
    • 对于您的第一条评论:您在applicationDidBecomeActive 中使用sendMessage 从手表发送一个新请求,并使用@ 发送您之前已经发送但尚未从手机收到的数据987654331@ 在sendMessage 函数的响应中。
    • 对于您的最后一条评论:如果您将整个函数移至applicationDidBecomeActive,则根本不需要使用updateApplicationContext,因为在这种情况下,您只会在@ 987654335@ 应用程序将处于活动状态。但是请记住,即使使用sendMessage,数据发送也可能需要几秒钟,因此用户可能不会立即看到更新的 UI。
    猜你喜欢
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 2018-01-12
    • 2023-03-25
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多