快速手表连接意外退出

时间:2017-08-02 07:13:02

标签: ios iphone swift connectivity watch-os-3

我制作了一个watchOS连接应用程序,它可以工作。现在我正在尝试为iPhone和Watch制作一个专门的连接类。对于iPhone连接类,我有这个(我还有其他传输数据的方法,但问题在这里):

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!;

是因为我没有初始化连接变量吗?如果那是问题,我应该如何初始化它?

在最初的应用程序中,我在ViewController的方法中使用了getPrepared()方法的代码didLoad()

1 个答案:

答案 0 :(得分:1)

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

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访问它,然后使用getPrepared()致电iPhoneConnectivity.sharedInstance.getPrepared()