После перезапуска Apple Watch WCSession isRechable каждый раз возвращает false - PullRequest
1 голос
/ 22 октября 2019

Я хочу отображать данные из базы данных Firebase в реальном времени в приложении Watch. У меня есть один метод для извлечения данных из firebase в родительском приложении iOS. Из приложения наблюдения я отправляю сообщение в родительское приложение iOS, родительское приложение iOS будет извлекать данные из firebase и отвечать на приложение просмотра с этими данными.

В родительском приложении iOS активируется WCSession, как показано ниже,

AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    // Watch Connectivity setup
    if WCSession.isSupported() {
        let session = WCSession.default
        session.delegate = self
        session.activate()
    }

    return true
}

Аналогично активированный сеанс в ExtensionDelegate в расширении Watch,

ExtensionDelegate.swift

func applicationDidFinishLaunching() {
    // Perform any final initialization of your application.

    if WCSession.isSupported() {
        let session = WCSession.default
        session.delegate = self
        session.activate()
    }
}

Теперь в классе InterfaceController отправлено сообщение в родительское приложение iOSи получить данные в ответ.

InterfaceController.swift

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

func getData() {
    if WCSession.default.isReachable {
        session.sendMessage(["Request": "GetData"], replyHandler: { (dictReply) in
            print(dictReply)
        }) { (error) in
            print(error)
        }
    } else {
        let action = WKAlertAction(title: "Ok", style: .cancel) {

        }
        self.presentAlert(withTitle: "Error", message: "iPhone is not reachable, try reconnecting watch with iPhone and try again.", preferredStyle: .alert, actions: [action])
    }
}

Обработал полученное сообщение в родительском приложении iOS и отправил данные в ответ в виде словаря.

AppDelegate.swift

func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) {
    guard let request = message["Request"] as? String else {
        replyHandler([:])
        return
    }

    switch request {
    case "GetData":
        // Call method to get data from firebase realtime database and send response dictionary in replyHandler for demo purpose currently passed test data
        replyHandler(["test" : "Hello..!!!"])
    default:
        replyHandler([:])
    }
}

Теперь при первом запуске устройства оно работает нормально, но после перезапуска приложения Apple Watch открывается приложение с часами и выдается сообщение об ошибке «iPhone недоступен, попробуйте повторно подключить часы к iPhone и попробуйте снова». это означает, что WCSession.default.isReachable каждый раз возвращает false. Приложение застряло здесь и просто показывает черный экран на часах Apple.

Также Если я запускаю приложение из xcode, оно работает каждый раз.

Я использую iPhone 8 и Apple Watch серии 1

...