swift 手表连接意外退出

swift watch connectivity quits unexpectedly

我制作了一个 watchOS 连接应用程序,它可以运行。现在,我正在尝试为 iPhone 处的连接和监视创建一个专用的 classes。对于 iPhone 连接 class 我有这个(我也有其他传输数据的方法,但问题出在这里):

import UIKit
import WatchConnectivity

class iPhoneConnectivity: UIViewController, WCSessionDelegate {

    func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {

    }

    func sessionDidBecomeInactive(_ session: WCSession) {

    }

    func sessionDidDeactivate(_ session: WCSession) {

    }

    var session : WCSession!;

    func getPrepared() {
        if (WCSession.isSupported()) { 
            // check if the watch connectivity is suported on device
            self.session = WCSession.default;
            self.session.delegate = self;
            self.session.activate();
        } else {
            print("Session is not supported")
        }
    }
}

问题是当我尝试在 ViewController

中调用此方法时
connect.getPrepared();

应用程序意外退出。

我有一个全局变量

var connect: iPhoneConnectivity!;

是不是我没有初始化connect变量?如果这是问题所在,我应该如何初始化它?

在有效的原始应用程序中,我在 ViewController 的方法 didLoad()

中有这段 getPrepared() 方法的代码

问题是 connect 是一个隐式解包的可选项,你在它上面调用一个函数而不实际初始化它。隐式展开的可选值仍然是可选值,因此如果你不给它们赋值,它们默认为 nil。因此,当您尝试访问它们而不先给它们非零值时,您将遇到运行时异常。

connect 定义为单例而不是全局变量。

class iPhoneConnectivity: WCSessionDelegate {

    static let sharedInstance = iPhoneConnectivity()

    func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {}

    func sessionDidBecomeInactive(_ session: WCSession) {}

    func sessionDidDeactivate(_ session: WCSession) {}

    var session : WCSession!;

    func getPrepared() {
        if (WCSession.isSupported()) { 
            // check if the watch connectivity is suported on device
            self.session = WCSession.default;
            self.session.delegate = self;
            self.session.activate();
        } else {
            print("Session is not supported")
        }
    }
}

您可以使用 iPhoneConnectivity.sharedInstance 访问它并使用 iPhoneConnectivity.sharedInstance.getPrepared() 调用 getPrepared()