I get the WCSession has not been activated error when I try to sent something. And I don't know what I'm doing wrong. I have tested serval pre-made solutions what "must" work. But it doesn't work at my simulator and physical devices.
Some code:
My app delegate:
import UIKit
import CoreData
import WatchConnectivity
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, WCSessionDelegate {
    var window: UIWindow?
    func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : String]) -> Void) {
        replyHandler(["message": "Hello Watch!"])
    }
    func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
    }
    func sessionDidBecomeInactive(_ session: WCSession) {
    }
    func sessionDidDeactivate(_ session: WCSession) {
    }
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        if WCSession.isSupported() {
            let session = WCSession.default()
            session.delegate = self
            session.activate()
        }
        return true
    }
........
}
My interfaceController:
import WatchKit
import Foundation
import WatchConnectivity
class InterfaceController: WKInterfaceController {
    override func awake(withContext context: Any?) {
        super.awake(withContext: context)
        // Configure interface objects here.
    }
    override func willActivate() {
        // This method is called when watch view controller is about to be visible to user
        super.willActivate()
        if WCSession.default().isReachable {
            let messageDict = ["message": "hello iPhone!"]
            WCSession.default().sendMessage(messageDict, replyHandler: { (replyDict) -> Void in
                //print(replyDict)
            }, errorHandler: { (error) -> Void in
               // print(error)
            })
        }
    }
    func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
    }
    func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {
    }
    override func didDeactivate() {
        // This method is called when watch view controller is no longer visible
        super.didDeactivate()
    }
}
The extensionDelegate:
   import WatchKit
    import WatchConnectivity
        class ExtensionDelegate: NSObject, WKExtensionDelegate, WCSessionDelegate {
        func applicationDidFinishLaunching() {
            // Perform any final initialization of your application.
            if WCSession.isSupported() {
                let session = WCSession.default()
                session.delegate = self
                session.activate()
            }
        }
        func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
        }
        func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {
            }
    ....
Is there any wrong code or implementations? Because nothing works for me.
I figured out the problem I had, and I think yours is similar.  I was trying to send a message immediately after calling activate(), which worked in the past, but since the introduction of the session(activationDidCompleteWith:) function I needed to send my messages from there.
So I think your solution is one of these:
WCSessionDelegate, move all
WCSession activation calls there, and send the message from
session(activationDidCompleteWith:)
session(activationDidCompleteWith:) in the ExtensionDelegate (in my
app I handle all communication in the ExtensionDelegate)session(activationDidCompleteWith:) in the
ExtensionDelegate and add an observer to handle it in
InterfaceController
Aside from this, I think you may also have a problem because the declaration of session(didReceiveMessage:) is wrong in your AppDelegate (or at least I had a problem when I tried your code.)
The new declaration is:
func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void)
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With