SwiftUi. Appeler une fonction de dataManager dans onReceive

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

finalement tout fonctionne , un petite erreur de ma part a un autre endroit.

Du coup le code fonctionne pour ceux qui evulent envoyer des données de l’Apple Wath vers l’iPhone