Swift WatchConnectivity app context as Dictionary

316 views Asked by At

I am working on my first Apple Watch app (an extension to my iOS app). I am facing a small problem in sending data from one WKInterfaceController to another.

My First Controller (InterfaceController.swift) has didReceiveMessage where it receives data from my iOS app.

func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {
        let myQrValue = message["qrCode"] as! String
        let myQrImage = message["qrCodeImageData"] as! Data

        var myData: [AnyHashable: Any] = ["myQrValue": myQrValue, "myQrImage": myQrImage]

        if myQrValue.isEmpty == false {
            WKInterfaceController.reloadRootControllers(withNames: ["QrScreen"], contexts: [myData])
        }
    } 

Then in my Second Controller (QrInterfaceController.swift), I am having below to fetch the data sent from the first controller -

override func awake(withContext context: Any?) {
        super.awake(withContext: context)

        print("context \(context)")
        if let myData = context {
            print("myData \(myData)")
//            userQrNumber.setText(myData)
        }

        if let myQrImage = myQrImage {
            userQrImage.setImageData(myQrImage)
        }

        if let myQrLabel = myQrLabel {
            userQrNumber.setText(myQrLabel)
        }

        self.setTitle("")
    }

I am stuck (could be simple/silly question) as how to parse my data from the context in the second controller?

Also, the didReceiveMessage works only the second time when I launch my ViewController where the sendMessage code is placed. Is it normal?

1

There are 1 answers

2
Tom E On

First, you might want to redeclare myData as this:

var myData: [String: Any] = ...

which makes it a bit simpler. Then, in the awake function, you’d go ahead like this:

if let myData = context as? [String: Any] {
    if let myQrImage = myData["myQrValue"] as? Date {
        ...

Does this show you the right direction?