Быстрый старт
В статье приведен пример быстрой интеграции Altcraft mSDKv2 с Apple Push Notification System (APNS) и Firebase Cloud Messaging (FCM). После выполнения указанных шагов ваше приложение сможет получать push-уведомления Altcraft.
Для использования Huawei Mobile Services необходимо добавить соответствующие SDK в проект и реализовать их интерфейсы, используя тот же подход, что показан для APNS и FCM.
Шаг 0. Предварительные условия
- Получен доступ к APNS получен на сайте;
- Приложение настроено в проекте Firebase,
GoogleServiceInfo.plist
загружен.
Шаг 1. Добавление пакетов (Swift Package Manager)
Добавьте пакеты из репозиториев с помощью Swift Package Manager:
- Репозиторий Altcraft SDK;
- Репозиторий Firebase.
Шаг 2. Добавление GoogleServiceInfo
в приложение
Добавьте GoogleServiceInfo.plist
в папку вашего приложения:

Шаг 3. Подготовка приложения
Настройте следующие параметры таргета приложения:

- General:
- Проверьте, что библиотека Altcraft добавлена в Frameworks, Libraries, and Embedded Content таргета приложения:

- Проверьте, что библиотека FirebaseMessaging добавлена в Frameworks, Libraries, and Embedded Content таргета приложения:

-
Signing & Capabilities:
- PushNotifications;
- AppGroups — укажите идентификатор для группы (добавление идентификатора App Group необходимо обмена информацией с Notification Service Extension);
Background Modes
— выберите Background fetch, Remoute notification, Background processing.
-
Info:
- Добавьте ключи и значения:
1.key: "Permitted background task scheduler identifiers" | type: Array | value:"lib.Altcraft.bgTask.systemControl"
2.key: "FirebaseAppDelegateProxyEnabled" | type: Boolean | value: NO
Первый ключ необходим для регистрации
bgTask
-задачи, которая будет выполнять повтор неудачных запросов к серверу в background-режиме. Второй ключ — для отключения автоматической подмены (method swizzling) методовAppDelegate
, которую Firebase Messaging выполняет по умолчанию. - Добавьте ключи и значения:

Шаг 3. Реализация протоколов
JWT
Выполните реализацию протокола SDK, предназначенного для предоставления JWT-токена. Для этого создайте класс, реализующий JWTInterface
, и переопределите getJWT()
:
import Altcraft
class JWTProvider: JWTInterface {
func getToken() -> String? {
//ваш код возвращающий JWT
}
}
getJWT()
— синхронная функция. Поток выполнения SDK будет приостановлен до получения JWT. Рекомендуется, чтобы getJWT()
возвращал значение немедленно — из кэша (in-memory, SharedPreferences
или EncryptedSharedPreferences
) — это ускорит выполнение запросов. Желательно подготовить актуальный JWT как можно раньше (на старте приложения) и сохранить его в кэш, чтобы при обращении SDK токен был доступен без задержек. При отсутствии значения допустимо вернуть nil
.
FCM
Выполните реализацию протокола SDK, предназначенного для предоставления и удаления FCM-токена. Для этого создайте класс, реализующий FCMInterface
, и переопределите getToken()
, deleteToken()
.
import FirebaseMessaging
import Altcraft
class FCMProvider: FCMInterface {
/// Retrieves the current FCM token.
func getToken(completion: @escaping (String?) -> Void) {
///apns token retrieved from userDefault
let apnsToken = getAPNsTokenDataFromUserDefaults()
///set the apns token for fcm before requesting the fcm token
Messaging.messaging().apnsToken = apnsToken
///fcm token request function
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)
}
}
}
}
APNS
Выполните реализацию протокола SDK, предназначенного для предоставления APNS-токена. Для этого создайте класс, реализующий APNSInterface
, и переопределите getToken()
:
import Altcraft
class APNSProvider: APNSInterface {
/// Retrieves the current APNs token from local storage.
func getToken(completion: @escaping (String?) -> Void) {
let token = getAPNsTokenFromUserDefault() - передайте токен apns
completion(token)
}
}
Шаг 4. Настройка Altcraft SDK и Firebase SDK в AppDelegate
Altcraft SDK:
- выполните передачу идентификатора
AppGroups
в Altcraft SDK; - выполните регистрацию
backgroundTasks
Altcraft SDK; - установите JWT-, APNS-, FCM-провайдеров;
- выполните регистрацию в центре уведомлений.
FirebaseSDK:
- выполните установку конфигурации;
Пример правильной настройки Altcraft SDK и Firebase SDK в AppDelegate
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
//установка конфигурации FirebaseSDK
FirebaseApp.configure()
//AltcraftSDK
///установка идентификатора AppGroup
AltcraftSDK.shared.setAppGroup(groupName: "group.your_company.name")
///регистрации BGTAsk
AltcraftSDK.shared.backgroundTasks.registerBackgroundTask()
///установка JWTProvider
AltcraftSDK.shared.setJWTProvider(provider: JWTProvider())
///установка APNSProvider
AltcraftSDK.shared.pushTokenFunction.setAPNSTokenProvider(APNSProvider())
///установка FCMProvider
AltcraftSDK.shared.pushTokenFunction.setFCMTokenProvider(FCMProvider())
///регистрация в центре уведомлений
AltcraftSDK.shared.notificationManager.registerForPushNotifications(for: application)
return true
}
func application(
_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken apnsToken: Data
) {
//сохраните apns токен в userDefault
setAPNsTokenInUserDefault(apnsToken)
}
}
- выполните установку
delegate
; - передайте APNS-токен в Firebase в функции
AppDelegate.application(_:didFinishLaunchingWithOptions:)
. Это гарантирует правильную инициализацию Firebase и доступность FCM-токена в background-режиме, например, во время выполненияBGTask
. Так как APNS-токен не доступен вAppDelegate.application(_:didFinishLaunchingWithOptions:)
, используете сохраненное значение, например, вUserDefaults
.

Шаг 5. Создание Notification Service Extension
Создайте расширение приложения Notification Service Extension:
- Выполните File — New — Target — Notification Service Extension;
- Выберите название (Product Name) для таргета расширения;
- Активируйте его.

Выполните в Notification Service Extension:
- General:
- Укажите Minimum Deployments — это параметр сборки в Xcode, который определяет минимальную версию операционной системы, на которой будет работать Notification Service Extension;
- Добавьте библиотеку Altcraft в разделе Frameworks, Libraries and Embedded Content.

- Signing & Capabilities:
-
AppGroups — укажите идентификатор
AppGroup
.
-
Затем настройте SDK в UNNotificationServiceExtension
:
- Импортируйте библиотеку
Altcraft
; - Создайте экземпляр
AltcraftPushReceiver()
; - В функции
didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void)
:- Передайте идентификатор
appGroup
в функциюAltcraftSDK.shared.setAppGroup(groupName: appGroupsName)
. Данный идентификатор должен соответствовать идентификатору переданному в SDK в таргете приложения; - Установите провайдер JWT (если используется JWT-аутентификация запросов):
AltcraftSDK.shared.setJWTProvider(provider: jwtProvider)
; - Выполните проверку источника уведомления с помощью функции
isAltcraftPush(request)
классаAltcraftPushReceiver(): service.isAltcraftPush(request)
; - После проверки источника уведомления, передайте
UNNotificationRequest
иcontentHandler
в функциюdidReceive
классаAltcraftPushReceiver(): self.service.didReceive(request, withContentHandler: contentHandler)
, если источник уведомления — Altcraft.
- Передайте идентификатор
Приведенный ниже пример реализации UNNotificationServiceExtension
можно использовать как готовый класс. Замените весь автоматически сгенерированный код на эту реализацию, если вам не требуется дополнительная логика. Если вы уже используете UNNotificationServiceExtension
, интегрируйте функции Altcraft в свою реализацию.
Пример реализации UNNotificationServiceExtension
import Altcraft
import UserNotifications
class NotificationService: UNNotificationServiceExtension {
var service = AltcraftPushReceiver()
/// - important! Set app groups name.
var appGroupsName = "your.app.group"
let jwtProvider = JWTProvider()
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
AltcraftSDK.shared.setAppGroup(groupName: appGroupsName)
AltcraftSDK.shared.setJWTProvider(provider: jwtProvider)
if service.isAltcraftPush(request) {
self.service.didReceive(request, withContentHandler: contentHandler)
} else {
contentHandler(request.content)
}
}
override func serviceExtensionTimeWillExpire() {service.serviceExtensionTimeWillExpire()}
}
Шаг 6. Инициализация SDK
Создайте переменную конфигурации и выполните инициализацию с помощью функции initialization()
, где ios-firebase
выбран приоритетным провайдером:
let config = AltcraftConfiguration.Builder()
.setApiUrl("your_api_url")
.setProviderPriorityList([Constants.ProviderName.firebase])
.build()
AltcraftSDK.shared.initialization(configuration: config)
В данном примере в качестве приоритетного провайдера установлен ios-firebase
. Вы также можете установить APNS в качестве приоритетного провайдера:
let config = AltcraftConfiguration.Builder()
.setApiUrl("your_api_url")
.setProviderPriorityList([Constants.ProviderName.apns])
.build()
AltcraftSDK.shared.initialization(configuration: config)
Вы можете не устанавливать параметр setProviderPriorityList
, тогда будет использоваться приоритет по умолчанию — ios-apns -> ios-firebase -> ios-huawei
:
let config = AltcraftConfiguration.Builder()
.setApiUrl("your_api_url")
.build()
AltcraftSDK.shared.initialization(configuration: config)
Шаг 7. Выполнение подписки на push-уведомления
Выполните подписку на push-у ведомления с помощью функции pushSubscribe()
, передав необходимые параметры:
AltcraftSDK.shared.pushSubscriptionFunctions.pushSubscribe(
profileFields: ["_fname": "user_first_name", "_lname": "user_last_name"]
)