Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift WCSession尚未激活_Swift - Fatal编程技术网

Swift WCSession尚未激活

Swift WCSession尚未激活,swift,Swift,当我尝试发送某些内容时,我发现WCSession尚未激活错误。我不知道我做错了什么。我已经测试了“必须”工作的几种预先制作的解决方案。但它在我的模拟器和物理设备上不起作用 一些代码: 我的应用程序代理: import UIKit import CoreData import WatchConnectivity @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate, WCSessionDelegate

当我尝试发送某些内容时,我发现WCSession尚未激活错误。我不知道我做错了什么。我已经测试了“必须”工作的几种预先制作的解决方案。但它在我的模拟器和物理设备上不起作用

一些代码:

我的应用程序代理:

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
    }

........


}
我的界面控制器:

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()
    }
}
ExtensionLegate:

   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]) {

            }
    ....

是否有错误的代码或实现?因为对我来说什么都不管用。

我发现了我的问题,我认为你的问题与之类似。我试图在调用
activate()
后立即发送消息,这在过去很有效,但自从引入
会话(activationIDCompleteWith:)
函数后,我需要从那里发送消息

因此,我认为您的解决方案是:

  • 将您的InterfaceController设置为
    wcsessionelegate
    ,全部移动
    WCSession
    激活呼叫,并从
    会话(ActivationIDCompleteWith:)
  • 从发送消息
    会话(activationIDCompleteWith:)
    中的 应用程序I处理扩展Legate中的所有通信
  • 在中发布来自
    会话(ActivationIDCompleteWith:)
    的通知
    extensionelegate
    并添加一个观察者来处理它
    InterfaceController
  • 除此之外,我认为您可能还有一个问题,因为您的AppDelegate中
    会话(didReceiveMessage:)
    的声明是错误的(或者至少我在尝试您的代码时遇到了问题)

    新的宣言是:

    func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void)
    

    还有一件事要检查您的代码是否正常,WCsession是否仍然无法激活,请重新启动手表。这就是我的答案