Вкратце, нужны точные данные о носителе после перехода с API Cloud Messaging Legacy на HTTP V1 Firebase

Вот мой новый метод отправки push-уведомлений для HTTP V1: Раньше я пользовался версией Legacy.

    func sendPushNotification(to token: String, title: String, body: String) {
        //let urlString = "https://fcm.googleapis.com/fcm/send"
        let urlString = "fcm.googleapis.com/v1/projects/myproject-77a88/messages:send"
        let url = NSURL(string: urlString)!
        let paramString: [String : Any] = ["to" : token, "notification" : ["title" : title, "body" : body, "badge": "1", "sound": "default"]
        ]
        let request = NSMutableURLRequest(url: url as URL)
        request.httpMethod = "POST"
        request.httpBody = try? JSONSerialization.data(withJSONObject:paramString, options: [.prettyPrinted])
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.setValue("key=\(KSERVERKEY)", forHTTPHeaderField: "Authorization")
        let task =  URLSession.shared.dataTask(with: request as URLRequest) { (data, response, error) in
            do {
                if let jsonData = data {
                    if let jsonDataDict  = try JSONSerialization.jsonObject(with: jsonData, options: JSONSerialization.ReadingOptions.allowFragments) as? [String: AnyObject] {
                        NSLog("Received data:\n\(jsonDataDict)")
                    }
                }
            } catch let err as NSError {
                print(err.debugDescription)
            }
        }
        task.resume()
    }

Я меняю UrlString с:

"https://fcm.googleapis.com/fcm/send"

к

"fcm.googleapis.com/v1/projects/myproject-77a88/messages:send"

и токен из версии Legacy в новую версию из

https://console.cloud.google.com/iam-admin/serviceaccounts/

Это страница, где Firebase объясняет эти вещи: https://firebase.google.com/docs/cloud-messaging/migrate-v1?hl=fr

Если хорошо понимать, носитель будет меняться каждый раз, когда необходимо отправить push-уведомление. Носитель является временным. Но даже если бы я прочитал объяснение в документации Firebase, я не знал, как каждый раз получать новый носитель. Может ли кто-нибудь помочь.


50
1

Ответ:

Решено

Наконец, вот код для получения носителя и отправки push-уведомлений:

class PushNotificationSender {
    let API_Key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    func getFirebaseBearerToken(completion: @escaping (String?) -> Void) {
            guard let url = URL(string: "https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key=\(API_Key)") else {
                completion(nil)
                return
            }
            var request = URLRequest(url: url)
            request.httpMethod = "POST"
            let task = URLSession.shared.dataTask(with: request) { data, response, error in
                guard let data = data, error == nil else {
                    completion(nil)
                    return
                }
                do {
                    if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any],
                       let idToken = json["idToken"] as? String {
                        completion(idToken)
                    } else {
                        completion(nil)
                    }
                } catch {
                    completion(nil)
                }
            }
            task.resume()
        }
    func sendPushNotification(to token: String, title: String, body: String) {
            getFirebaseBearerToken { bearerToken in
                guard let bearerToken = bearerToken else {
                    print("Failed to retrieve Bearer token.")
                    return
                }
                
                let urlString = "https://fcm.googleapis.com/v1/projects/myprojectID-99a99/messages:send"

                guard let url = URL(string: urlString) else {
                    print("@@Invalid URL")
                    return
                }

                let payload: [String: Any] = [
                    "message": [
                        "token": token,
                        "notification": [
                            "title": title,
                            "body": body
                        ]
                    ]
                ]

                let jsonData = try? JSONSerialization.data(withJSONObject: payload)

                var request = URLRequest(url: url)
                request.httpMethod = "POST"
                request.httpBody = jsonData
                request.setValue("Bearer \(bearerToken)", forHTTPHeaderField: "Authorization")
                request.setValue("application/json", forHTTPHeaderField: "Content-Type")

                let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
                    if let error = error {
                        print("Error: \(error.localizedDescription)")
                        return
                    }

                    if let data = data {
                        do {
                            let responseJSON = try JSONSerialization.jsonObject(with: data, options: [])
                            print("Response: \(responseJSON)")
                        } catch {
                            print("Error parsing response JSON: \(error.localizedDescription)")
                        }
                    }
                }
                task.resume()
            }
        }
}

Итак, код для отправки:

let pushSender = PushNotificationSender()
pushSender.sendPushNotification(to: "DEVICE_TOKEN", title: "Hello", body: "Sample Notification")

Если Firebase SDK установлен в зависимостях пакета, нет необходимости получать носитель. Firebase управляет этим сам. в противном случае мое решение можно использовать.