TransferFile не запускает передачу для WatchConnectivity - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь отправить изображение собаки из приложения для часов в приложение для iOS, но по какой-то причине передача не начинается.Ход передачи остается на уровне 1, и всякий раз, когда я внедряю didFinishFileTransfer, он даже не выдает ошибку.Я не уверен, где это идет не так.Я использовал этот урок .В нем говорится, что сеанс наблюдения уже выполняется или активирован, поэтому я знаю, что это не просто проблема активации.И мой интерактивный обмен сообщениями тоже работает.Любая помощь будет принята с благодарностью!

WatchSessionManager.swift импорт WatchKit импорт WatchConnectivity import os.log

typealias MessageReceived = (session: WCSession, message: [String : Any], replyHandler: (([String : Any]) -> Void)?)

typealias ApplicationContextReceived = (session: WCSession, applicationContext: [String : Any])
typealias FileTransferred = (session: WCSession, file: WCSessionFileTransfer)
typealias FileReceived = (session: WCSession, file: WCSessionFile)

protocol WatchOSDelegate: AnyObject {
    func transferCompleted(tuple: FileTransferred)
}

protocol iOSDelegate: AnyObject {
    func messageReceived(tuple: MessageReceived)
    func fileReceived(tuple: FileReceived)
}

class WatchSessionManager: NSObject {
    static let sharedManager = WatchSessionManager()

    weak var watchOSDelegate: WatchOSDelegate?
    weak var iOSDelegate: iOSDelegate?

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

    var validSession: WCSession? {
        #if os(iOS)
        if let session = session, session.isPaired && session.isWatchAppInstalled {
            return session
        }
        return nil
        #elseif os(watchOS)
        return session
        #endif
    }

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

extension WatchSessionManager: WCSessionDelegate {

    func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
        print("activationDidCompleteWith activationState:\(activationState) error:\(String(describing: error))")
    }

    #if os(iOS)
    func sessionDidBecomeInactive(_ session: WCSession) {
        print("sessionDidBecomeInactive: \(session)")
    }

    func sessionDidDeactivate(_ session: WCSession) {
        print("sessionDidDeactivate: \(session)")
        self.session?.activate()
    }
    #endif
}

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

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

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

    func handleSession(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: (([String : Any]) -> Void)? = nil) {
        #if os(iOS)
        iOSDelegate?.messageReceived(tuple: (session, message, replyHandler))
        #endif
    }
}

extension WatchSessionManager {
    func transferFile(file: URL, metadata: [String : AnyObject]?) -> WCSessionFileTransfer? {
        print(validSession?.isReachable)
        os_log("transfer of file")
        return validSession?.transferFile(file, metadata: nil)
    }

    func session(session: WCSession, didFinishFileTransfer fileTransfer: WCSessionFileTransfer, error: Error?) {
        handleFileSession(session, didFinishFileTransfer: fileTransfer, error: error)
    }

    func handleFileSession(_ session: WCSession, didFinishFileTransfer fileTransfer: WCSessionFileTransfer, error: Error?) {
        #if os(watchOS)
        watchOSDelegate?.transferCompleted(tuple: (session, fileTransfer))
        #endif
    }

    func handleReceivedSession(_ session: WCSession, didReceieveFile file: WCSessionFile) {
        #if os(iOS)
        iOSDelegate?.fileReceived(tuple: (session, file))
        #endif
    }

    func session(session: WCSession, didReceiveFile file: WCSessionFile) {
        handleReceivedSession(session, didReceieveFile: file)
    }
}

Затем из моего приложения для часов я делаю:

    @IBAction func stop() {
        let filePath = URL.init(fileURLWithPath: Bundle.main.path(forResource: "dogs", ofType: "png")!)
        transfers = connectivityHandler.transferFile(file: filePath, metadata: nil)
    }

И в моем приложении для iOSУ меня есть:

extension ViewController: iOSDelegate {
    func messageReceived(tuple: MessageReceived) {
       // works fine here
    }

    func fileReceived(tuple: FileReceived) {
        let file = tuple.file
        DispatchQueue.main.async {
            let imageData = NSData.init(contentsOf: file.fileURL)
            self.imageLoader.image = UIImage(data: imageData! as Data)
        }
    }
}
...