1
votes

Les notifications Firebase ne sont pas envoyées si elles sont envoyées hors de la console Firebase

Je suis confronté à un problème vraiment étrange, les notifications envoyées depuis la console Firebase sont livrées correctement, cela signifie que le projet est configuré et que les certificats sont corrects, mais lorsque j'envoie une notification depuis l'application, cela ne fonctionne pas. J'utilise la méthode suivante pour envoyer des notifications.

{
    "multicast_id": 36126XXXXXXXX,
    "success": 1,
    "failure": 0,
    "canonical_ids": 0,
    "results": [
        {
            "message_id": "0:1581960379105057~~~~~~~~~~"
        }
    ]
}

J'ai également essayé d'envoyer via curl avec la méthode suivante

{
    "notification":{
        "title": "XXXXX",
        "body": "XXXXX"
    },
  "to": "XXXXXXX"
}

Aucune des méthodes ci-dessus ne semble fonctionner, qu'est-ce que je fais mal? J'ai essayé à la fois la clé de serveur héritée et la clé de serveur mais pas de chance. Quelqu'un a-t-il déjà rencontré un tel problème?


6 commentaires

Je pense que votre problème est setValue , vous devriez utiliser addValue . SetValue remplacera toutes les valeurs!


J'ai aussi essayé addValue


Vos jetons "à" sont-ils corrects? Avez-vous utilisé le jeton FirebaseMessage? pas de jeton APN? Essayez cela avec Postman, qu'est-ce que vous obtenez en tant que réponse ou code d'état?


func messaging (_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) J'ai utilisé le token généré ici


Mais vous n'envoyez pas le PushNoti sur le même appareil !? La notification ne sera pas informée si l'application était 1. Ouvrez, 2. Simulateur (le simulateur peut être changé peut-être), 3. Si vous vous envoyez un Push. Essayez cela avec Postman. Est le meilleur moyen


J'envoie une notification push du simulateur à l'appareil réel, j'ai essayé php postman et la demande http via l'application, rien ne fonctionne


3 Réponses :


0
votes
struct NotificationStruct: Codable {
    var notification: NotificationBodyStruct?
    var to: String?
    var time_to_live = 60000
}

struct NotificationBodyStruct: Codable {
    var title: String?
    var text: String?
    var sound: String?
}    



func sendNotificationtoken: String, name: String, completion: @escaping(Bool) -> Void) {
    do {
        let noti = NotificationStruct(notification: NotificationBodyStruct(title: name, text: text, sound: "default"), to: "\(token)", time_to_live: 6000)
        let body = try JSONEncoder().encode(noti)

        makeConnection(body: body) { (success) in
            DispatchQueue.main.async {
                completion(true)
            }
        }
    } catch {
        print("sendNotification \(error.localizedDescription)")
        DispatchQueue.main.async {
            completion(false)
        }
    }
}    



private func makeConnection(body: Data, completion: @escaping(Bool) -> Void) {
    guard let url = URL(string: "http://gcm-http.googleapis.com/gcm/send") else {
            completion(false)
            return
    }

    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.allHTTPHeaderFields = ["Content-Type": "application/json", "Authorization": "key=A**YOUR_KEY**A"]
    request.httpBody = body

    let session = URLSession.shared
    let dataTask = session.dataTask(with: request, completionHandler: { (data, response, error) -> Void in
        guard error == nil else {
            print("Error NotificationHelper ", error?.localizedDescription ?? "")
            completion(false)
            return
        }

        guard let httpResponse = response as? HTTPURLResponse else {
            print("httpResponse error NotificationHelper ")
            completion(false)
            return
        }


        guard httpResponse.statusCode  < 500 else {
            print("Error NotificationHelper < 500 \(httpResponse)", response ?? "" )
            completion(false)
            return
        }

        guard (httpResponse.statusCode >= 200 && httpResponse.statusCode <= 299) else {
            print("error NotificationHelper  >= 200 && httpResponse.statusCode <= 299 \(httpResponse)", response ?? "" )
            completion(false)
            return
        }

        guard let _ = data  else {
            print("Problem with Data NotificationHelper ")
            completion(false)
            return
        }

        completion(true)
    })
    dataTask.resume()
}

1 commentaires

Je renvoie vrai mais même pas de message livré!



0
votes

Je pense aussi que votre paramString a les mauvaises propriétés. Essayez ça:

        let paramString: [String : Any] = [
            "to" : token,
            "notification" : ["title" : title, "text" : body],
            "time_to_live" : 60000,
            "sound" : "default"
        ]


0 commentaires

0
votes

Donc, après avoir passé beaucoup de temps, j'ai compris et tout fonctionne normalement. Donc, si quelqu'un d'autre est confronté à ce problème, il peut le résoudre en ouvrant votre fichier AppDelegate.swift , recherchez une fonction didRegisterForRemoteNotificationsWithDeviceToken et remplacez-la par

 func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        print("APNs token retrieved: \(deviceToken)")
        // With swizzling disabled you must set the APNs token here.
         Messaging.messaging().apnsToken = deviceToken
    }

Après avoir fait cela, tout semble bien fonctionner.


0 commentaires