Les notifications push à distance nécessitent-elles d'ajouter UIBackgroundModes dans Info.plist?

104

J'ai intégré des notifications push à distance, mais je reçois cet avertissement:

didReceiveRemoteNotification:fetchCompletionHandler:], mais vous devez toujours ajouter " remote-notification" à la liste de vos UIBackgroundModes pris en charge dans votre Info.plist.

Ma version Xcode est 8.3.1. Je veux vraiment ajouter ceci à Info.plist. J'ai également suivi quelques tutoriels mais ils ne l'ont pas mentionné non plus. Que dois-je vraiment faire?

user1960169
la source

Réponses:

245

Oui, vous devez activer les modes d'arrière-plan / notifications à distance pour pouvoir utiliser les notifications à distance pour les mises à jour en arrière-plan.

Le moyen le plus simple de le faire est d'utiliser les paramètres du projet. Accédez à Cibles -> Votre application -> Capacités -> Modes d'arrière-plan et vérifiez les notifications à distance . Cela activera automatiquement les paramètres requis.

Liste déroulante des modes d'arrière-plan dans les paramètres du projet

Tamás Sengel
la source
3
J'ai déjà vérifié ce champ mais j'obtiens toujours la même erreur.
Anuj
Anuj voir ma réponse ci
Joshua Cleetus
1
Je ne suis pas d'accord avec cette réponse. Vous ne devez activer les modes d'arrière-plan -> Notifications à distance que si vous utilisez une notification à distance pour effectuer une mise à jour en arrière-plan. Veuillez vous référer à la documentation ici Configuration d'une notification de mise à jour en arrière-plan
jzeferino
1
@jzeferino Merci pour l'avis, j'ai ajouté quelques précisions à ma réponse. Notez que la question d'origine portait sur la application(_:didReceiveRemoteNotification:fetchCompletionHandler:)fonction, qui est utilisée pour gérer la récupération de données.
Tamás Sengel
C'est génial, mais répond à la question de savoir si vous avez besoin de la capacité pour les mises à jour en arrière-plan, ce que vous faites bien sûr. J'ai publié une réponse pour savoir si vous devez définir la capacité des modes d'arrière-plan simplement pour les notifications push (spoiler, vous ne le faites pas).
mobob
30

Vous pouvez également modifier le fichier info.plist nécessaire (Ouvrir en tant que -> Code source) et coller:

<dict>
<key>UIBackgroundModes</key>
    <array>
        <string>remote-notification</string>
    </array>
Aleksandr B.
la source
7
Il est maintenant ajouté automatiquement par Xcode lors de la vérification des notifications à distance dans les modes d'arrière-plan
Vinoth Vino
1
Pas pour moi: Version 11.4.1 (11E503a)
paiego
4

En fait, vous n'avez pas besoin d'ajouter UIBackgroundModes à .plist simplement pour utiliser les notifications à distance.

Je sais que je partage un peu les héritiers (l'autre réponse est généralement excellente, et peut-être que quelque chose est nouveau à partir d'iOS 11), mais la question se réfère aux notifications push nécessitant des mises à jour en arrière-plan, et ce n'est pas le cas.

La distinction ici, c'est qu'il existe deux méthodes différentes qui acceptent les notifications sur AppDelegate;

Celui-ci ne vous oblige pas à utiliser UIBackgroundModes:

optional func userNotificationCenter(_ center: UNUserNotificationCenter, 
                         willPresent notification: UNNotification, 
               withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)

Ce qui précède remplace la version obsolète à partir d'iOS 11:

optional func application(_ application: UIApplication, 
didReceiveRemoteNotification userInfo: [AnyHashable : Any])

Et celui-ci nécessite la capacité des modes d'arrière-plan:

optional func application(_ application: UIApplication, 
didReceiveRemoteNotification userInfo: [AnyHashable : Any], 
   fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)

L'élément clé ici, c'est que l'ancien (et le déprécié qu'il a remplacé) ne fonctionne que lorsque l'application est au premier plan. Ce dernier fonctionnera si l'application est au premier plan OU en arrière-plan. Voir la spécification de ce nugget spécifique:

Utilisez cette méthode pour traiter les notifications distantes entrantes pour votre application. Contrairement à la méthode application (_: didReceiveRemoteNotification :), qui est appelée uniquement lorsque votre application s'exécute au premier plan, le système appelle cette méthode lorsque votre application s'exécute au premier plan ou en arrière-plan.

Par conséquent, si vous avez besoin de notifications push, décidez si vous devez exécuter en arrière-plan - ce n'est que si vous avez besoin des deux que vous devez implémenter la méthode suggérée par l'avertissement.

Mobob
la source
3

Cela m'est arrivé même après avoir défini le mode d'arrière-plan des notifications à distance dans les capacités. Le problème était que j'avais trois objectifs, un pour la production, un pour le contrôle qualité et un pour la mise en scène. J'ai dû définir des notifications à distance dans les trois cibles et cela a corrigé l'avertissement.

Joshua Cleetus
la source