Я пытаюсь отправить строку 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.
}
}