Planification de la notification locale à partir d'une extension Aujourd'hui

Je fais une application qui contient une extension aujourd'hui. L'extension today affiche une list de timers, et si l'user sélectionne l'une des timers, je voudrais créer et planifier une notification locale pour ce minuteur.

Mon problème est que la programmation des notifications est faite avec cette ligne de code:

UIApplication.sharedApplication().scheduleLocalNotification(notification) 

qui repose très malheureusement sur UIApplication.sharedApplication() qui n'est pas accessible depuis une extension.

Donc ma question est: Comment puis-je planifier une notification locale à partir d'une extension Aujourd'hui?

Curieusement, je peux faire un cadre avec le code partagé entre mon application et mon extension et dans ce cadre je peux appeler:

 func schedule() { // ... let settings = UIUserNotificationSettings(forTypes: .Sound | .Alert, categories: nil) UIApplication.sharedApplication().registerUserNotificationSettings(settings) // ... UIApplication.sharedApplication().scheduleLocalNotification(notification) // ... } 

Si j'importe alors ce framework depuis mon extension et que j'appelle schedule() j'obtiens cette sortie:

 Failed to inherit CoreMedia permissions from 13636: (null) Attempting to schedule a local notification <UIConcreteLocalNotification: 0x7feaf3657a00>{fire date = Saturday, November 1, 2014 at 1:01:48 PM Western European Standard Time, time zone = (null), repeat interval = 0, repeat count = UILocalNotificationInfiniteRepeatCount, next fire date = Saturday, November 1, 2014 at 1:01:48 PM Western European Standard Time, user info = (null)} with an alert but haven't received permission from the user to display alerts Attempting to schedule a local notification <UIConcreteLocalNotification: 0x7feaf3657a00>{fire date = Saturday, November 1, 2014 at 1:01:48 PM Western European Standard Time, time zone = (null), repeat interval = 0, repeat count = UILocalNotificationInfiniteRepeatCount, next fire date = Saturday, November 1, 2014 at 1:01:48 PM Western European Standard Time, user info = (null)} with a sound but haven't received permission from the user to play sounds 

Ainsi, un module s'exécutant dans une extension a access à UIApplication.sharedApplication() car ce code tente de planifier une notification, mais le système n'est pas préparé pour une extension demandant des permissions pour afficher les alertes et échoue (c'est ce qu'il semble de toute façon ).

Comment puis-je resoudre ceci?

En outre, je sais que je peux simplement lancer mon application en utilisant une URL et planifier la notification de l'application comme d'habitude, mais ce n'est pas l' user firendly. Le but de l'extension aujourd'hui est que l'user n'ait pas besoin d'ouvrir l'application pour planifier la notification. L'interaction doit être rapide, simple et transparente et arracher l'user de l'application dans laquelle il se trouve juste pour exécuter quelques lignes de code et en finir avec ce n'est pas comme ça que je veux faire les choses.

Je pense que cela peut devenir possible si vous faites ceci:

  1. Chaque fois que vous souhaitez planifier une notification locale, faites en sorte que votre extension actuelle crée la notification et écrive ses informations dans un file d'un conteneur partagé.

  2. (Vous avez besoin d'un server) Contactez votre server depuis votre extension actuelle, requestz à votre server d'envoyer une notification push instantanée (contenu disponible: 1), qui réveillera votre application principale.

  3. Lorsque votre application est réveillée par la notification à distance, lit le file créé à partir de l'étape 1 à partir du conteneur partagé, planifie la notification locale puis revient en mode veille.

Ceci est extrêmement improbable de travailler. Les extensions d'application ne sont pas autorisées à accéder à sharedApplication . Le fait qu'il soit possible d'empêcher le compilateur de remarquer que vous le faites ne change pas cela. Si vous essayez ceci dans un débogueur, j'imagine que sharedApplication returnne en réalité zéro et que c'est la raison pour laquelle le code échoue.

Si vous pouvez find un moyen de le faire fonctionner, ne countz pas dessus. Apple considérerait certainement cela comme un bug et le corrigerait dans une prochaine version, cassant votre extension sans avertissement.

Si quelqu'un vient par cette question, c'est maintenant réalisable dans iOS 10 et son nouveau framework UserNotifications. Pour planifier une notification locale à partir de votre extension d'application, vous pouvez simplement appeler cette ligne de code à partir de votre extension:

 UNUserNotificationCenter.current().add(<#UNNotificationRequest#>)