errorHandler: НЕТ с WCErrorCodeDeliveryFailed - не уверен, где я иду не так - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь отправить строку UUID телефона на часы, как только соединение установлено (от пользователя не требуется никаких действий).Я использовал этот учебник (https://medium.com/@vanessaforney/ios-development-watch-connectivity-32415d415854), но я продолжаю получать "WCSession _onqueue_notifyOfMessageError: messageID: withErrorHandler:] 21FB4ABE-D177-4689-AF50-62759283112C errorHandler: NO with WCErrorCodeDeliveryFeral.Я не уверен, что я делаю неправильно. Заранее извиняюсь, я бы привел пример MCVE / SSCCE, но я не был уверен, как это будет работать. Любая помощь будет очень признательна!

Это WatchSessionManager на стороне приложения ios:

class WatchSessionManager: NSObject, WCSessionDelegate {
    static let sharedManager = WatchSessionManager()
    var device_id = ""

    private override init() {
        super.init()
        session?.delegate = self
        session?.activate()
    }

    func setDeviceID(id: String) {
        device_id = id
    }

    private let session: WCSession? = WCSession.isSupported() ? WCSession.default : nil

    private var validSession: WCSession? {
        if let session = session, session.isPaired && session.isWatchAppInstalled{
            os_log("paired and reachable")
            return session
        }
        return nil
    }


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

    func sessionDidBecomeInactive(_ session: WCSession) {
    }

    func sessionDidDeactivate(_ session: WCSession) {
    }

    func startSession() {
        session?.delegate = self
        session?.activate()

        updateApplicationContext()
    }

    func updateApplicationContext() {
        let context = ["device_id" : device_id]
        do {
            Swift.print("trying to update application context")
            try WatchSessionManager.sharedManager.updateApplicationContext(applicationContext: context)
        } catch {
            Swift.print("error updating application context")
        }
    }
}

// Application Context
extension WatchSessionManager {
    func updateApplicationContext(applicationContext: [String : Any]) throws{
        if let session = validReachableSession {
            do {
                os_log("actually updating context")
                try session.updateApplicationContext(applicationContext)
            } catch let error {
                throw error
            }
        }
    }
}

extension WatchSessionManager {
    // Sender
    private var validReachableSession: WCSession? {
        if let session = validSession, session.isReachable {
            return session
        }
        return nil
    }

    // Receiver
    func session(session: WCSession, didReceiveMessage message: [String : Any],
                 replyHandler: ([String : Any]) -> Void, errorHandler: ((Error) -> Void)? = nil) {
        os_log("receiver")
        if message["device_id"] != nil {
            updateApplicationContext()
        }
    }
}

Затем в мой AppDelegate.swift я включил:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    WatchSessionManager.sharedManager.startSession()
    WatchSessionManager.sharedManager.updateApplicationContext()
    return true
}

А это мой PhoneSessionManager на стороне часов:

import WatchConnectivity
import os.log

class PhoneSessionManager: NSObject, WCSessionDelegate {
    func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
        requestApplicationContext()
    }

    static let sharedManager = PhoneSessionManager()

    private let session: WCSession? = WCSession.isSupported() ? WCSession.default : nil

    func startSession() {
        session?.delegate = self
        session?.activate()
    }

    func requestApplicationContext() {
        sendMessage(message: ["device_id": true as AnyObject], replyHandler: nil, errorHandler: nil)
    }

    func sessionReachabilityDidChange(_ session: WCSession) {
        requestApplicationContext()
    }

}

extension PhoneSessionManager {
    func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : Any]) {
        DispatchQueue.main.async(execute: {
            UserSummary.userSummary.updateFromContext(applicationContext: applicationContext)
        })
    }
}

extension PhoneSessionManager {
    private var validReachableSession: WCSession? {
        if let session = session, session.isReachable {
            return session
        }
        return nil
    }

    func sendMessage(message: [String : Any],replyHandler: (([String : Any]) -> Void)? = nil, errorHandler: ((Error) -> Void)? = nil) {
        validReachableSession?.sendMessage(message, replyHandler: replyHandler, errorHandler: errorHandler)
    }
}

Тогда в моем ExtensionDelegate.swift у меня есть:

import WatchKit

class ExtensionDelegate: NSObject, WKExtensionDelegate {
    override init() {
        super.init()
        PhoneSessionManager.sharedManager.startSession()
    }

    func applicationDidFinishLaunching() {
        PhoneSessionManager.sharedManager.requestApplicationContext()
        // Perform any final initialization of your application.
    }
}

1 Ответ

0 голосов
/ 20 ноября 2018

У меня была эта ошибка при попытке отправить массив целых чисел с помощью функции отправки сообщения.Я предлагаю вам попробовать sendMessage (message: ["device_id": "test"], replyHandler: nil, errorHandler: nil) вместо отправки true как AnyObject.Если это работает, попробуйте отправить значение true в качестве логического значения вместо AnyObject.

...