Я работаю над приложением для iOS с приложением Companion WatchOS. Код для наблюдения и телефона такой же. Я могу отправлять прямые сообщения с помощью sendmessage () и фоновых сообщений с TransperUserInfo () с телефона на просмотр. Но здесь это работает только один раз или на некоторое время или около того. Затем он останавливается.
Я вижу из отладчика, что сообщение отправляется через TransferUserInfo () , и оно появляется, но приложение iOS не обрабатывает его и не обрабатывает ошибку:
-[WCSession handleIncomingUserInfoWithPairingID:]_block_invoke delegate (null) does not implement session:didReceiveUserInfo:, discarding incoming content
Я просто не могу выяснить, почему.
кажется странным, что в сообщении говорится Delegate (null) . И ясно, что сеанс: DidReceiveUserInfo: реализован.
Есть идеи?import WatchConnectivity
import OSLog
import SecureDefaults
class WatchConnectivityManager: NSObject, WCSessionDelegate, ObservableObject {
@Published var receivedMessage: String = ""
private var messageHandlers: [WatchMessageHandler] = []
private var requestHandlers: [WatchRequestHandler] = []
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: (any Error)?) {
Logger.connectivity.info("Session activation complete: \(activationState.rawValue)")
}
#if os(iOS)
func sessionDidBecomeInactive(_ session: WCSession) {
Logger.connectivity.info("Session did become inactive")
}
func sessionDidDeactivate(_ session: WCSession) {
Logger.connectivity.info("Session did deactivate")
}
#endif
private func received(_ message: [String : Any], replyHandler: (([String : Any]) -> Void)? = nil) {
DispatchQueue.main.async { [self] in
receivedMessage = message["message"] as? String ?? "Not found"
}
Logger.connectivity.info("Message received: \(message)")
if message["content"] as? String == "credentials" {
UserDefaults.group.username = message["username"] as? String ?? ""
let sdefaults = SecureDefaults.sgroup
if !sdefaults.isKeyCreated {
sdefaults.password = UUID().uuidString
}
let password = message["password"] as? String ?? ""
sdefaults.set(password, forKey: "llu.password")
sdefaults.synchronize()
settings.libreLinkUpToken = ""
UserDefaults.group.connected = .newlyConnected
}
if message["content"] as? String == "insulinDelivery" {
let insulinDeliveryHistoryItem = InsulinDelivery(id: UUID(), timestamp: message["timeStamp"] as? Double ?? Date().timeIntervalSince1970 - 12 * 3600, insulinUnits: message["units"] as? Double ?? 0.0)
var insulinDeliveryHistory: [InsulinDelivery] = UserDefaults.group.insulinDeliveryHistory ?? []
insulinDeliveryHistory.append(insulinDeliveryHistoryItem)
UserDefaults.group.insulinDeliveryHistory = insulinDeliveryHistory
}
if message["content"] as? String == "clearInsulinHistory" {
UserDefaults.group.insulinDeliveryHistory = []
}
if let replyHandler = replyHandler {
let responseHandler: (WatchMessage) -> Void = { responseMessage in
var dictionary = responseMessage.dictionary
dictionary["_type"] = String(describing: type(of: responseMessage))
replyHandler(dictionary)
}
if let _ = requestHandlers.firstIndex(where: { $0.handle(dictionary: message, responseHandler: responseHandler) }) {
return
}
}
}
func sendMessageToPairedDevice(_ message: [String : Any], replyHandler: (([String : Any]) -> Void)? = nil) {
guard WCSession.isSupported() else {
Logger.connectivity.error("Device does not support WatchConnectivity")
return
}
guard session.activationState == .activated else {
Logger.connectivity.error("WCSession not activated")
return
}
if session.isReachable {
// let message: [String: Any] = ["message": message]
Logger.connectivity.info("Sending message: \(message)")
session.sendMessage(message, replyHandler: replyHandler, errorHandler: { error in // sendMessage on watch only works if app is active in foreground
Logger.connectivity.error("\(error)")
Logger.connectivity.warning("Error, trying transferUserInfo")
// try? WCSession.default.updateApplicationContext(message)
WCSession.default.transferUserInfo(message)
})
} else {
Logger.connectivity.warning("Session not reachable / counterpart app not available for live messaging")
Logger.connectivity.warning("...trying transferUserInfo with message: \(message)")
// try? WCSession.default.updateApplicationContext(message)
WCSession.default.transferUserInfo(message) // transferUserInfo does not work in Simulator!!
}
}
func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {
received(message)
}
func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : Any] ) {
received(applicationContext)
}
func session(_ session: WCSession, didReceiveUserInfo userInfo: [String : Any] = [:]) {
received(userInfo)
}
var session: WCSession
static let shared = WatchConnectivityManager()
init(session: WCSession = .default) {
self.session = session
super.init()
session.delegate = self
session.activate()
}
}
protocol WatchMessage {
init?(dictionary: [String : Any])
var dictionary: [String : Any] { get }
}
private protocol WatchMessageHandler {
func handle(dictionary: [String : Any]) -> Bool
}
private protocol WatchRequestHandler {
func handle(dictionary: [String : Any], responseHandler: @escaping (WatchMessage) -> Void) -> Bool
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... h-to-phone
TransferUserInfo работает с телефона, но не с часа на телефон ⇐ IOS
Программируем под IOS
-
Anonymous
1751319374
Anonymous
Я работаю над приложением для iOS с приложением Companion WatchOS. Код для наблюдения и телефона такой же. Я могу отправлять прямые сообщения с помощью sendmessage () и фоновых сообщений с TransperUserInfo () с телефона на просмотр. Но здесь это работает только один раз или на некоторое время или около того. Затем он останавливается.
Я вижу из отладчика, что сообщение отправляется через TransferUserInfo () , и оно появляется, но приложение iOS не обрабатывает его и не обрабатывает ошибку:
-[WCSession handleIncomingUserInfoWithPairingID:]_block_invoke delegate (null) does not implement session:didReceiveUserInfo:, discarding incoming content
Я просто не могу выяснить, почему.
кажется странным, что в сообщении говорится Delegate (null) . И ясно, что сеанс: DidReceiveUserInfo: реализован.
Есть идеи?import WatchConnectivity
import OSLog
import SecureDefaults
class WatchConnectivityManager: NSObject, WCSessionDelegate, ObservableObject {
@Published var receivedMessage: String = ""
private var messageHandlers: [WatchMessageHandler] = []
private var requestHandlers: [WatchRequestHandler] = []
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: (any Error)?) {
Logger.connectivity.info("Session activation complete: \(activationState.rawValue)")
}
#if os(iOS)
func sessionDidBecomeInactive(_ session: WCSession) {
Logger.connectivity.info("Session did become inactive")
}
func sessionDidDeactivate(_ session: WCSession) {
Logger.connectivity.info("Session did deactivate")
}
#endif
private func received(_ message: [String : Any], replyHandler: (([String : Any]) -> Void)? = nil) {
DispatchQueue.main.async { [self] in
receivedMessage = message["message"] as? String ?? "Not found"
}
Logger.connectivity.info("Message received: \(message)")
if message["content"] as? String == "credentials" {
UserDefaults.group.username = message["username"] as? String ?? ""
let sdefaults = SecureDefaults.sgroup
if !sdefaults.isKeyCreated {
sdefaults.password = UUID().uuidString
}
let password = message["password"] as? String ?? ""
sdefaults.set(password, forKey: "llu.password")
sdefaults.synchronize()
settings.libreLinkUpToken = ""
UserDefaults.group.connected = .newlyConnected
}
if message["content"] as? String == "insulinDelivery" {
let insulinDeliveryHistoryItem = InsulinDelivery(id: UUID(), timestamp: message["timeStamp"] as? Double ?? Date().timeIntervalSince1970 - 12 * 3600, insulinUnits: message["units"] as? Double ?? 0.0)
var insulinDeliveryHistory: [InsulinDelivery] = UserDefaults.group.insulinDeliveryHistory ?? []
insulinDeliveryHistory.append(insulinDeliveryHistoryItem)
UserDefaults.group.insulinDeliveryHistory = insulinDeliveryHistory
}
if message["content"] as? String == "clearInsulinHistory" {
UserDefaults.group.insulinDeliveryHistory = []
}
if let replyHandler = replyHandler {
let responseHandler: (WatchMessage) -> Void = { responseMessage in
var dictionary = responseMessage.dictionary
dictionary["_type"] = String(describing: type(of: responseMessage))
replyHandler(dictionary)
}
if let _ = requestHandlers.firstIndex(where: { $0.handle(dictionary: message, responseHandler: responseHandler) }) {
return
}
}
}
func sendMessageToPairedDevice(_ message: [String : Any], replyHandler: (([String : Any]) -> Void)? = nil) {
guard WCSession.isSupported() else {
Logger.connectivity.error("Device does not support WatchConnectivity")
return
}
guard session.activationState == .activated else {
Logger.connectivity.error("WCSession not activated")
return
}
if session.isReachable {
// let message: [String: Any] = ["message": message]
Logger.connectivity.info("Sending message: \(message)")
session.sendMessage(message, replyHandler: replyHandler, errorHandler: { error in // sendMessage on watch only works if app is active in foreground
Logger.connectivity.error("\(error)")
Logger.connectivity.warning("Error, trying transferUserInfo")
// try? WCSession.default.updateApplicationContext(message)
WCSession.default.transferUserInfo(message)
})
} else {
Logger.connectivity.warning("Session not reachable / counterpart app not available for live messaging")
Logger.connectivity.warning("...trying transferUserInfo with message: \(message)")
// try? WCSession.default.updateApplicationContext(message)
WCSession.default.transferUserInfo(message) // transferUserInfo does not work in Simulator!!
}
}
func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {
received(message)
}
func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : Any] ) {
received(applicationContext)
}
func session(_ session: WCSession, didReceiveUserInfo userInfo: [String : Any] = [:]) {
received(userInfo)
}
var session: WCSession
static let shared = WatchConnectivityManager()
init(session: WCSession = .default) {
self.session = session
super.init()
session.delegate = self
session.activate()
}
}
protocol WatchMessage {
init?(dictionary: [String : Any])
var dictionary: [String : Any] { get }
}
private protocol WatchMessageHandler {
func handle(dictionary: [String : Any]) -> Bool
}
private protocol WatchRequestHandler {
func handle(dictionary: [String : Any], responseHandler: @escaping (WatchMessage) -> Void) -> Bool
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79683842/transferuserinfo-works-from-phone-to-watch-but-not-from-watch-to-phone[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия