Вкратце, нужны точные данные о носителе после перехода с 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, я не знал, как каждый раз получать новый носитель. Может ли кто-нибудь помочь.

Вы не можете безопасно отправить сообщение с одного устройства на другое с помощью Firebase Cloud Messaging, ни с помощью API версии 1, ни с помощью устаревшего API. Отправка должна осуществляться только из доверенной среды, такой как консоль Firebase , вашего компьютера разработки , сервера, которым вы управляете , или что-то вроде Cloud Functions.

Frank van Puffelen 08.07.2024 19:17
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 управляет этим сам. в противном случае мое решение можно использовать.

Другие вопросы по теме

Неустранимая ошибка: вызов неопределенного метода Google\Cloud\Firestore\QuerySnapshot::count()
Kotlin Как обновить пропускную способность при закрытии приложения?
Конфигурация flutterfire возвращает «zsh: команда не найдена: flutterfire» на Mac
«Для привязки переменной в условии требуется инициализатор» — ошибка при создании Firebase iOS SDK
Обновление документа Firestore несколько раз с помощью функции триггера события перезаписывает или прекращает обновление после нескольких триггеров
Как настроить и протестировать push-уведомления Firebase Cloud Messaging (FCM) с помощью API HTTP v1 с помощью Postman?
Получение идентификатора клиента приложения, использующего вход в Google
Ни один из моих проектов реагирования, развернутых на Firebase, не работает
При перезаписи отображается пустая страница. Приложение Flutter, размещенное на хостинге Firebase
Регистрация во Flutter с использованием Firebase не работает