Firebase Cloud Messaging
Шаг 1. Настройки проекта Firebase Cloud Messaging
- Выполните создание проекта Firebase;
- Зарегистрируйте новое приложение в проекте:

- Выполните загрузку
GoogleSrvice-Info.plist
;

- Перейдите в настройки проекта -> Cloud Messaging -> Apple app configuration;
- Добавьте необходимые данные APNs Authentication Key (необходимо предварительно создать ключ на Apple Developer):

Укажите следующие данные:
- загрузите загруженный файл-.p8
- укажите
key ID
- укажите
team ID

Шаг 2. Настройка ресурса Altcraft
- укажите
messagingSenderId
; - укажите
projectId
; - загрузите Firebase-файл с приватным ключом (.json). Файл создается в р азделе Project setting -> Service account.

Шаг 3. Интеграция Firebase Cloud Messaging в проект приложения
-
Переместите загруженные файл
GoogleSrvice-Info.plist
в папку приложения (app); -
Добавьте пакет Firebase c помощью Swift Package Manager — репозиторий Firebase. Версия пакета Firebase должна быть совместима с версией XCODE.
-
General:
- Проверьте, что библиотека FirebaseMessaging добавлена в Frameworks, Libraries, and Embedded Content таргета приложения.
-
Signing & Capabilities:
- PushNotifications;
Опция 1: FirebaseAppDelegateProxyEnabled — YES (По умолчанию для Firebase Messaging)
-
Добавьте протокол
MessagingDelegate
кAppDelegate
:class AppDelegate: UIResponder, UIApplicationDelegate, MessagingDelegate {}
Это позволит получать callback с актуальным FCM-токеном через метод messaging(_:didReceiveRegistrationToken:)
.
-
Инициализируйте Firebase в
didFinishLaunchingWithOptions
:FirebaseApp.configure()
Messaging.messaging().delegate = self
application.registerForRemoteNotifications() -
Реализуйте метод делегата для получения токена:
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
guard let token = fcmToken else { return }
print(" FCM Token: \(token)")
}
Полный пример инициализации Firebase и получения FCM-токена
import SwiftUI
import FirebaseCore
import FirebaseMessaging
import Altcraft
@main
struct IOSQuickStartApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
class AppDelegate: UIResponder, UIApplicationDelegate, MessagingDelegate, UNUserNotificationCenterDelegate {
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
///Инициализация Firebase
FirebaseApp.configure()
///Установка делегата
Messaging.messaging().delegate = self
application.registerForRemoteNotifications()
return true
}
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
if let token = fcmToken {
//fcm токен
}
}
}
Опция 2: FirebaseAppDelegateProxyEnabled - NO
-
В настройках таргета приложения:
- Info:
- Добавьте ключ
FirebaseAppDelegateProxyEnabled (Boolean)
с значениемNO
в Info приложения.
- Добавьте ключ
- Info:

-
Протокол
MessagingDelegate
в таком случае не требуется. При отключённомFirebaseAppDelegateProxyEnabled
Firebase не выполняет автоматический swizzlingAppDelegate
, поэтому SDK сам управляет установкой и обработкой APNs- и FCM-токенов. ДелегатMessagingDelegate
в этом случае не нужен. -
Инициализация Firebase в
didFinishLaunchingWithOptions
:
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
FirebaseApp.configure()
return true
}
- Получение и сохранение APNs-токена в
didRegisterForRemoteNotificationsWithDeviceToken
:
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
FirebaseApp.configure()
return true
}
func application(
_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken apnsToken: Data
) {
// Сохраните токен для последующего использования при запросе FCM-токена
setAPNsTokenInUserDefault(apnsToken)
}
}
Шаг 4. Ручная установка APNs-токена в Firebase Messaging перед запросом FCM-токена
Пример внутри провайдера SDK
import FirebaseMessaging
import Altcraft
class FCMProvider: FCMInterface {
/// Retrieves the current FCM token.
func getToken(completion: @escaping (String?) -> Void) {
/// APNs-токен, извлечённый из UserDefaults
let apnsToken = getAPNsTokenDataFromUserDefaults()
/// Устанавливаем APNs-токен вручную перед запросом FCM-токена
Messaging.messaging().apnsToken = apnsToken
/// Запрашиваем FCM-токен
Messaging.messaging().token { token, error in
if error != nil {
completion(nil)
} else {
completion(token)
}
}
}
/// Deletes the current FCM token.
func deleteToken(completion: @escaping (Bool) -> Void) {
Messaging.messaging().deleteToken { error in
if error != nil {
completion(false)
} else {
completion(true)
}
}
}
}