wazawoo
wazawoo

Reputation: 694

How to receive a watchOS file transfer on iOS in the background

I am using transferFile and I can successfully send and receive files, but in order to complete the transfer process, I need to open up the iPhone app.

In observing other apps, it appears that they are able to receive and act upon received data in the background (and send a push notification to the user, for example).

I am wondering how they did this.

Upvotes: 2

Views: 1992

Answers (1)

Zachary Bell
Zachary Bell

Reputation: 610

You should send a message from the watch app to the phone using the sendMessage function of watch connectivity requesting the data. This will wake up the iphone app. Then in your didreceivemessage method on the phone you should use the filetransfer function to send your files to the watch.

To clarify when a message is sent using sendMessage this wakes the iphone application up in the background to receive the message to where it can respond with a file transfer. Hope this helps

You need to send a message first before sending the file transfer. Implement something like this on your watch side

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 *****")
    }
}

Then in your didreceivemessage function on the phone side implement something like this

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"])
        }
}

Upvotes: 1

Related Questions