我正在使用transferFile,并且我可以成功发送和接收文件,但为了完成传输过程,我需要打开iPhone应用程序。如何在后台在iOS上接收watchOS文件传输
在观察其他应用程序时,他们似乎能够在后台接收并处理收到的数据(并向用户发送推送通知)。
我想知道他们是如何做到这一点的。
我正在使用transferFile,并且我可以成功发送和接收文件,但为了完成传输过程,我需要打开iPhone应用程序。如何在后台在iOS上接收watchOS文件传输
在观察其他应用程序时,他们似乎能够在后台接收并处理收到的数据(并向用户发送推送通知)。
我想知道他们是如何做到这一点的。
您应该使用watch连接的sendMessage函数从手表应用程序向手机发送消息,以请求数据。这会唤醒iPhone应用程序。然后在手机上的didreceivemessage方法中,您应该使用文件传输功能将文件发送到手表。
为了阐明何时使用sendMessage发送消息,这会在后台唤醒iphone应用程序,以接收消息,以便它可以通过文件传输进行响应。希望这会有所帮助
您需要在发送文件传输之前先发送消息。实现这样的事情在你的手表侧
func sendActivationMessage() {
if session.activationState == .activated && session.isReachable {
session.sendMessage(["Watch Message" : "Activate"], replyHandler: {
(reply) in
if reply["Phone Message"] as! String == "Activated" {
//This is where you should implement your file transfer
}
}, errorHandler: { (error) in
print("***** Error Did Occur: \(error) *****")
})
} else {
print("***** Activation Error *****")
}
}
然后在手机端的didreceivemessage功能实现这样的事情
func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) {
if let messageFromWatch = message["Watch Message"] {
let messageData = messageFromWatch as! String
//Message From Watch to Activate Watch Connectivity Session
if messageData == "Activate" {
replyHandler(["Phone Message" : "Activated"])
}
}
我已经实现了这个功能,但是如果手表远离手机足够长的时间,手机的WCSession停用,文件传输仍然无法完成。然后,需要打开手机应用程序才能完成转移。我希望有一种解决方法,但它看起来像其他应用程序遭受同样的限制。 – wazawoo
您需要先发送消息。我在回答中添加了一个代码示例 –
sendMessage将在后台唤醒手机。 transferFile不会。 –
watchapp可以发送即时消息会醒来iOS应用,因此这些文件在iosapp仍处于活动状态时交付:https://developer.apple.com/documentation/watchconnectivity/wcsession/1615687-sendmessage – abjurato
谢谢您的提示。但是,我注意到一旦手机上的WCSession不再处于活动状态,将不会收到该消息。有没有办法解决? – wazawoo