сначала убедитесь, что у вас есть платная учетная запись разработчика, активируйте уведомление из раздела возможностей проекта, настройте весь сертификат в Apple Member Center и добавьте этот сертификат в gcm (см. Как использовать новый сертификат Apple .p8 для APN в консоли Firebase ), вы также должны проверить с реальным устройством
Я предполагаю, что у вас уже есть эти 3 стручка
import FirebaseInstanceID
import FirebaseMessaging
import UserNotifications
сначала вам нужно добавить это в didfinishlaunchingwithoptions
FirebaseApp.configure()
Messaging.messaging().delegate = self
registerForPushNotifications()
затем добавьте эти две функции, чтобы получить разрешение пользователя
func getNotificationSettings() {
if #available(iOS 10.0, *) {
UNUserNotificationCenter.current().getNotificationSettings { (settings) in
guard settings.authorizationStatus == .authorized else { return }
DispatchQueue.main.async(execute: {
UIApplication.shared.registerForRemoteNotifications()
})
}
} else {
// Fallback on earlier versions
}
}
func registerForPushNotifications() {
if #available(iOS 10.0, *) {
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) {
(granted, error) in
guard granted else { return }
self.getNotificationSettings()
}
} else {
let settings = UIUserNotificationSettings(types: [.sound, .alert, .badge], categories: nil)
UIApplication.shared.registerUserNotificationSettings(settings)
UIApplication.shared.registerForRemoteNotifications()
}
}
чтобы получить жетон огненной базы, добавьте
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
print(fcmToken)
}
С этого момента вы должны увидеть приглашение и выдать уведомление из консоли Firebase
если вам нужно выполнить уведомление из кода, вот что я делаю (обязательно замените его на ключ API от firebase)
func sendPushNotification(notData: [String: Any]) {
let url = URL(string: "https://fcm.googleapis.com/fcm/send")!
var request = URLRequest(url: url)
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("key=YOUR-SERVER-API-KEY", forHTTPHeaderField: "Authorization")
request.httpMethod = "POST"
request.httpBody = try? JSONSerialization.data(withJSONObject: notData, options: [])
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else {
print(error ?? "")
return
}
if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {
print("statusCode should be 200, but is \(httpStatus.statusCode)")
print(response ?? "")
}
let responseString = String(data: data, encoding: .utf8)
print(responseString ?? "")
}
task.resume()
}
тогда вызывайте эту функцию, когда вам нужно
let notifMessage: [String: Any] = [
"to" : "fcm token you need to send the notification",
"notification" :
["title" : "title you want to display", "body": "content you need to display", "badge" : 1, "sound" : "default"]
]
sendPushNotification(notData: notifMessage)