2017-07-14 1 views
2

Mon terminal ne reçoit pas de notifications push en arrière-plan. Je suis à bout de nerfs, j'ai essayé tous les tutoriels que je peux trouver et chercher dans Stack Overflow.iOS ne recevant pas la notification push en arrière-plan à l'aide d'apn nodejs

  • périphériques et APN sont mis à debug/développement
  • Je peux enregistrer dispositif de jeton
  • J'ai réussi une clé de .p8 active avec les services de notification push
  • APN dit le message push a été envoyé
  • avec succès
  • didReceiveRemoteNotification ne se déclenche pas
  • essayées avec application en arrière-plan et de premier plan
  • utilisant AWS: entrant - le port 22, sur liés - tous les ports

C'est la réponse:

{ "envoyé": [{ "device": "cc7ec9a821cf232f9510193ca3ffe7d13dd756351794df3f3e44f9112c037c2a"}], "a échoué": []}

Voici mon code:

AppDelegate.swift

import UIKit 
import UserNotifications 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate { 

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
     if #available(iOS 10, *) { 
      let center = UNUserNotificationCenter.current() 
      center.delegate = self 
      center.requestAuthorization(options: [.sound, .alert, .badge]) { (granted, error) in 
       if error == nil { 
        UIApplication.shared.registerForRemoteNotifications() 
       } 
      } 
     } 
    } 

    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {    
     var deviceTokenString: String = "" 
     for i in 0..<deviceToken.count { 
      deviceTokenString += String(format: "%02.2hhx", deviceToken[i] as CVarArg) 
     } 
     UserDefaults.standard.set(deviceTokenString, forKey: "push_token") 
    } 


    @available(iOS 10.0, *) 
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (_ options: UNNotificationPresentationOptions) -> Void) { 
     print("Handle push from foreground") 
     print("\(notification.request.content.userInfo)") 
     completionHandler([.alert, .badge, .sound]) 
    } 

    @available(iOS 10.0, *) 
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping() -> Void) { 
     print("Handle push from background or closed") 
     // if you set a member variable in didReceiveRemoteNotification, you will know if this is from closed or background 
     print("\(response.notification.request.content.userInfo)") 
     completionHandler() 
    } 
} 

XCode:

enter image description here enter image description here

Node.js

.p8 clé est de Developer Console: Touches> Tous

var apn = require('apn'); 

var apnProvider = new apn.Provider({ 
    token: { 
     key: "/path/to/AuthKey_1234ABCD.p8", 
     keyId: "1234ABCD", 
     teamId: "1234ABCD" 
    }, 
    production: false 
}); 

var note = new apn.Notification(); 
note.topic = "com.company.app"; 
note.payload = { 
    aps: { 
     "content-available" : 1 
    }, 
    custom_field: {} 
}; 

apnProvider.send(note, push_token).then(result => { 
      console.log('result: ', result); 
      console.log("sent:", result.sent.length); 
      console.log("failed:", result.failed.length); 
}); 
+0

J'ai envoyé des messages push iOS en utilisant '' cert.pem' et key.pem'. Je ne sais pas si cet exemple serait utile. Je peux le poster, mais je veux juste confirmer si c'est possible dans votre cas –

+0

@KukicVladimir quelle bibliothèque node.js utilisez-vous pour envoyer les notifications push? – Andrew

+0

J'utilise 'apn', comme vous le faites –

Répondre

0

Je ne suis pas sûr que ce soit le cas comme votre serveur utilise ce module nœud APN et je ne l'ai jamais utilisé, mais j'utilise Firebase et chaque fois que j'ai essayé d'utiliser content_available : 1, cela n'a pas fonctionné. Qu'est-ce que le travail était content_available : true.

Espérons que cela fonctionne pour vous.

0

Vous avez écrit cela sur votre AppDelegate

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { 
     print("Silent push notification received: \(userInfo)")  
    } 

Mais vous avez aussi écrit:

center.delegate = notificationDelegate 

qui signifie que vous êtes AppDelegate n'est pas délégué du NotificationCenter.

soit changer que pour

center.delegate = self 

Ou tout simplement supprimer cette fonction à la classe qu'il adopte à savoir votre UYLNotificationDelegate

Vous semblez avoir tout droit. Bien que je ne sache pas lire node.js, vous avez peut-être mal configuré votre charge utile.Parfois aussi, si le serveur ne gère pas correctement plusieurs jetons, vous risquez de ne pas recevoir de notification silencieuse ou un autre problème lié à notre backend est de rediriger le serveur de notifications vers la machine locale pendant que nous testons les notifications. De toute évidence, ils ne venaient pas!

Une charge utile de l'échantillon de Apple devrait ressembler à ceci:

{ 
    "aps" : { 
     "content-available" : 1 
    }, 
    "acme1" : "bar", 
    "acme2" : 42 
} 

Êtes-vous sûr de votre charge utile généré a un format similaire ?!

  • Je laissait entendre à tort que vous devriez changer center.delegate = notificationDelegate-center.delegate = self mais si j'étais désespéré je donnerais que d'essayer: D.

  • Assurez-vous background App Refresh est activé (mais toujours sans que vous devriez recevoir activé au premier plan

  • Si cela ne fonctionne pas, essayez de l'envoyer avec une alerte/badge et voir si cela fonctionne. Probablement il ne fonctionnera pas:/

  • Supprimer l'application et l'installer à nouveau Parfois, les autorisations ne fonctionnent pas correctement si vous réinstallez juste
  • données dérivées propres, construction propre, redémarrez Xcode
  • 01.235.164...

Après votre EDIT:

Vous ne devriez pas avoir supprimé le didReceive à distance notification < - ceci est pour récupérer une notification push qui a content-available : 1.

  • Le willPresent est rappel pour ce qu'il faut faire si l'application est en FOREGROUND. Uniquement applicable si la charge utile a une alerte ou un badge ou un son dans la charge utile. Le didReceiveNotificationResponse n'est PAS ce que vous pensez que c'est. C'est pour gérer la gestion de l'action que l'utilisateur a choisie à partir de la notification, par ex. votre notification a deux actions (Snooze, suppression) à cliquer comme ci-dessous: enter image description here

-vous gérer la réponse à la notification à l'aide ce rappel. Le application(_:didReceiveRemoteNotification:fetchCompletionHandler:) est utilisé pour récupérer la notification à l'arrivée. Donc, techniquement parlant, si vous avez juste une notification silencieuse, vous obtiendrez seulement le troisième rappel et non les deux premiers.

Si vous aviez une application au premier plan et que la charge avait: content-available :1 qui avait également des actions et que l'utilisateur tapait sur l'action, vous obtiendriez d'abord le 3ème rappel, puis le 1er rappel puis le 2ème rappel.

+0

J'apprécie vraiment votre réponse, j'ai nettoyé mon AppDelegate pour faire est plus facile de voir ce qui se passe – Andrew

+0

@Andrew voir mon edit – Honey

0

J'apprécie la contribution de tout le monde, j'ai compris le problème.'Aps' n'appartient pas au champ de données utiles, mais devrait plutôt se trouver dans le constructeur de Notification.

Node.js:

var note = new apn.Notification({ 
    aps: { 
     "content-available" : 1 
    } 
}); 

note.payload = { 
    custom_field_1: {}, 
    custom_field_2: '' 
};