0

J'ai déclaré le nom de notification dans un fichier rapide qui a l'adhésion cible à la fois l'application principale et le widget aujourd'hui:notification observation dans Aujourd'hui Widget qui est affiché à partir de l'application principale

let SpecialKey = Notification.Name("howLongNotif") 

Puis dans mon contrôleur principal de vue de l'application, Je signale une notification lorsque l'emplacement est mis à jour (en arrière-plan pour les mises à jour de localisation est):

NotificationCenter.default.post(name: SpecialKey, object: nil, userInfo: nil) 

Dans mon widget aujourd'hui viewDidLoad, j'observais comme ceci:

NotificationCenter.default.addObserver(self, selector: #selector(TodayViewController.dataReceived), name: SpecialKey, object: nil) 

et ont:

func dataReceived(_notification: NSNotification) { 
    print("data received") 
} 

Mais la fonction dataReceived est jamais invoqué.

J'ai testé en déplaçant l'observateur et la fonction dataReceived à l'application principale et cela fonctionne bien.

Répondre

1

Votre application principale et aujourd'hui l'extension sont exécutées en tant que processus distincts sur le téléphone. NSNotificationCenter ne fonctionne que dans un seul processus.

Pour transmettre des informations entre votre extension et l'application principale, vous pouvez utiliser NSUserDefaults ou un fichier dans le conteneur partagé.

+0

problème avec NSUserDefaults est que pour obtenir des informations en direct, je vais devoir continuer à écrire et à lire à partir d'eux, ce qui ne semble pas être une bonne solution pour les infos en direct. – Kashif

+0

Il n'y a pas de bon mécanisme pour ce type d'information en direct. Il est fort probable que votre application principale ne fonctionne même pas lorsque votre extension actuelle est utilisée. Quel type d'information en direct voulez-vous communiquer? –

+0

mon application principale fonctionne en mode d'arrière-plan et en continu (chaque seconde) communique l'emplacement au widget d'aujourd'hui. – Kashif