Hello,
Je souhaite partager des données entre l’application Apple Watch et l’application (par exemple, mettre un article en signet) mais j’ai quelques problèmes.
Voici la vue simplifiée qui devrait recevoir les données
I want to share data between the Apple Watch application and the application (for example, bookmark an article) but I have some problems.
Here is the simplified view which should receive the data
struct ListPostsView: View {
@ObservedObject var connectivityManager = WatchConnectivityManager.shared
@ObservedObject var dataManager: DataManager
@State var displayMessage = false
var body: some View {
if displayMessage == true && connectivityManager.notificationMessage != nil {
Text ("Ok data AppleWatch")
}
list(){
//...
}
.onReceive(connectivityManager.$notificationMessage){message in
if message != nil{
displayMessage = true
dataManager.updateElementInPost(idPost: message!.idPost, elementToChange: .favorite, value: message.value)
}
}
}
}
La variable d’état displayMessage devient true et le message s’affiche. En revanche, cela ne fonctionne pas pour updateElementInPost . Cette fonction fonctionne très bien dans l’application mais à cet endroit elle ne fonctionne pas, comme si à l’intérieur de .onReceive, nous ne pouvions pas déclencher une fonction.
Avec une alerte les données s’affichent correctement, donc je récupère bien les données, je veux juste envoyer les données dans updateElementInPost pour que l’base de données soit mise à jour
voici mon code pour récupérer les données de l’apple watch :
struct NotificationMessage: Identifiable {
let id = UUID()
let idPost: Int
let elementToChange: String // on peut pas porposer notre propre type sinon erreur
let value : Bool
let website: String
}
final class WatchConnectivityManager: NSObject, ObservableObject {
static let shared = WatchConnectivityManager()
@Published var notificationMessage: NotificationMessage? = nil
private override init() {
super.init()
#if !os(watchOS)
guard WatchConnectivity.WCSession.isSupported() else {
return
}
#endif
WCSession.default.delegate = self
WCSession.default.activate()
#if os(watchOS)
guard WCSession.default.isCompanionAppInstalled else {
return
}
#else
guard WCSession.default.isWatchAppInstalled else {
return
}
#endif
}
private let kMessageKey = "idPost"
private let kMessageKey2 = "elementToChange"
private let kMessageKey3 = "value"
private let kMessageKey4 = "website"
func send(_ message : Int, _ message2 : String, _ message3 : Bool, _ message4 : String) {
guard WCSession.default.activationState == .activated else {
return
}
#if os(iOS)
guard WCSession.default.isWatchAppInstalled else {
return
}
#else
guard WCSession.default.isCompanionAppInstalled else {
return
}
#endif
WCSession.default.sendMessage([kMessageKey : message, kMessageKey2 : message2, kMessageKey3 : message3, kMessageKey4 : message4], replyHandler: nil) { error in
print("Cannot send message: \(String(describing: error))")
}
}
}
extension WatchConnectivityManager: WCSessionDelegate {
func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {
if let notificationIdPost = message[kMessageKey] as? Int,
let notificationElementToChange = message[kMessageKey2] as? String,
let notificationValue = message[kMessageKey3] as? Bool,
let notificationWebsite = message[kMessageKey4] as? String {
DispatchQueue.main.async { [weak self] in
self?.notificationMessage = NotificationMessage(idPost: notificationIdPost, elementToChange: notificationElementToChange, value: notificationValue, website: notificationWebsite)
}
}
}
func session(_ session: WCSession,
activationDidCompleteWith activationState: WCSessionActivationState,
error: Error?) {}
#if os(iOS)
func sessionDidBecomeInactive(_ session: WCSession) {}
func sessionDidDeactivate(_ session: WCSession) {
session.activate()
}
#endif
}
merci