Я пытаюсь отправить изображение собаки из приложения для часов в приложение для 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)
}
}
}