Быстрый старт
В статье приведен пример быстрой интеграции 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"]
)