1

J'essaie de déterminer si je peux atteindre mon objectif via les notifications locales ou si je dois passer aux notifications à distance. Je pratique iOS 10/Swift 3 en construisant un programme d'alarme qui joue le dernier épisode d'une émission de radio mise à jour RSS à une heure précise de la journée. Lorsque l'application est au premier plan, il est facile de l'exécuter via la fonction willPresent de UNUserNotificationCenterDelegate. J'utilise simplement willPresent pour récupérer le dernier épisode et le lire via un lecteur AVAudio.Alternative à la willPresent de UserNotificationCenterDelegate lorsque l'application est en arrière-plan

Bien sûr, si l'application ne fonctionne qu'au premier plan, cette fonctionnalité est très limitée. Je voudrais que l'application fonctionne de la même manière en arrière-plan ou fermée.

Je peux voir dans la documentation que willPresent ne s'exécute pas lorsque l'application n'est pas au premier plan. Existe-t-il un autre moyen pour que les notifications locales exécutent le code avant d'envoyer la notification lorsque l'application est en arrière-plan? Ou dois-je passer aux notifications à distance? Je vois this answer to a related question mais je me demande s'il y a une approche plus élégante.

Répondre

1

Pour iOS 10notifications locales votre chance.

Pour iOS 10notifications à distance - indépendamment de l'interaction utilisateur vous pouvez recevoir callbacks en utilisant application(_:didReceiveRemoteNotification:fetchCompletionHandler:). (Il est un peu déroutant qu'ils déconseillés plupart notification des méthodes connexes, mais pas celui-ci)


Callback lorsque l'application est au premier plan et vous êtes sur le point de montrer la notification:

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { 
    let content = notification.request.content 
    // Process notification content 

    completionHandler([.alert, .sound]) // Display notification as regular alert and play sound 
} 

Callback lorsque l'application est soit en arrière-plan ou au premier plan et utilisateur tape sur une action:

enter image description here

par exemple. vous donne un rappel que l'utilisateur a appuyé sur Enregistrer.

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping() -> Void) { 
    let actionIdentifier = response.actionIdentifier 

    switch actionIdentifier { 
    case UNNotificationDismissActionIdentifier: // Notification was dismissed by user 
     // Do something 
     completionHandler() 
    case UNNotificationDefaultActionIdentifier: // App was opened from notification 
     // Do something 
     completionHandler() 
    default: 
     completionHandler() 
    } 
} 

Callback lorsque l'application est soit en arrière-plan, de premier plan ou (éventuellement) état suspendu et un notifications Push (notification à distance ou silencieux) arrive:

Avant iOS10 lorsque vous taraudés sur la notification, le application(_:didReceiveRemoteNotification:fetchCompletionHandler:) serait appelé.

Mais puisque iOS 10 application(_:didReceiveRemoteNotification:fetchCompletionHandler:) n'est pas appelé en tapant. Il est seulement appelé arrivée d'une notification à distance.(Il get appelé à la fois au premier plan et en arrière-plan)


Pour avant iOS 10, vous pouvez simplement utiliser l'ancienne fonction didReceiveLocalNotification et capturer l'arrivée de toute notification.