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?
3 Réponses :
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() }
Je renvoie vrai mais même pas de message livré!
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" ]
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.
Je pense que votre problème est
setValue
, vous devriez utiliseraddValue
. 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é iciMais 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