Перейти к основному содержимому

Настройка mSDK для iOS через APNs

Подключение проекта к APNs

Перейдите на сайт Apple Developer в раздел "Account""Certificates, Identifiers & Profiles""Identifiers". Создайте новый идентификатор. Выберите опцию App IDs, затем App. Введите в поле Description название, укажите Bundle ID приложения в соответствующем поле, выберите опцию Explicit, затем в списке ниже выберите пункт Push Notifications и зарегистрируйте ID:

Откройте на устройстве приложение "Связка ключей". Перейдите в раздел "Связки ключей по умолчанию""Вход", в меню выберите "Ассистент сертификации""Запросить сертификат у бюро сертификации":

В открывшемся окне заполните необходимые поля и выберите пункт "Сохранен на диске". Сохраните сертификат на устройстве:

Вернитесь в раздел "Certificates, Identifiers & Profiles""Certificates" на сайте. Создайте новый сертификат. В списке Services выберите Apple Push Notification service SSL (Sandbox & Production). В следующем пункте найдите ваше приложение в выпадающем списке AppID. Загрузите созданный раннее сертификат в соответствующее поле. Получившийся сертификат Apple сохраните на устройстве:

Дважды нажмите на него, чтобы он появился в приложении "Связка ключей". Откройте его и выберите в параметрах использования сертификата опцию "Всегда доверять":

Дальнейшие действия зависят от того, какой тип аутентификации вы будете использовать: аутентификация с помощью токена или с помощью сертификата.

На сайте Apple Developer перейдите в раздел "Certificates, Identifiers & Profiles""Keys". Создайте новый ключ. Укажите название ключа и его тип — APNs, нажмите "Continue", затем "Register". Запишите Key ID, он будет необходим для конфигурации ресурса на платформе:

Скачайте ключ к себе на устройство. Его необходимо открыть с помощью любого текстового редактора. Внутри содержится ключ подписи. Его нужно будет указать в соответствующем поле при настройке ресурса.

предупреждение

Ключ можно скачать лишь один раз. Если вы не можете его скачать сейчас, нажмите "Done" и вернитесь, когда такая возможность появится.

На платформе Altcraft создайте ресурс для push-канала, выберите платформу iOS и включите переключатель Apple Push Notification service:

Активируйте переключатель "Использовать APNs токен" в настройках ниже. Заполните следующие поля:

  • apns-topic — Bundle ID приложения.
  • kid — значение keyID ключа.
  • iss — Team ID, обычно указан в аккаунте разработчика на сайте Apple Developer.
  • Ключ подписи — содержимое файла-ключа, скачанного раннее.

Сохраните настроенный ресурс с помощью кнопок в верхней части страницы. Платформа готова к отправке уведомлений с помощью APNs.

Подготовка приложения

1. Разместите файл Altcraft.xcodeproj на одном уровне с папкой приложения в проекте:

2. Выполните настройки таргета приложения:

  • Раздел General:

    Добавьте фреймворк Altcraft в разделе "Frameworks, Libraries and Embedded Content".

  • В разделе Signing & Capabilities добавьте следующие Capability:

    • PushNotifications;
    • AppGroups — в этом параметре укажите название для группы, которое будет использоваться в дальнейшем. Добавление AppGroups необходимо для передачи информации в Notification Service Extension;
    • Background Modes — выберите пункты Background fetch, Remoute notification, Background processing.

  • Раздел Info:

    Добавьте ключ "Permitted background task scheduler identifiers" и значение "lib.Altcraft.bgTask.systemControl" для него. Это необходимо для регистрации задачи bgTask, которая будет выполнять повтор неудачных запросов к серверу в Background режиме;

Подготовка AppDelegate

  1. Импортируйте зависимость Altcraft SDK в Swift-файл содержащий AppDelegate класс:

import Altcraft

  1. Добавьте необходимые функции в класс AppDelegate. Он должен содержать следующие функции и переменные:
class AppDelegate: NSObject, UIApplicationDelegate {

/// groupName: This is the identifier that is used in App Groups
private let groupsName = "group.you_name"

/// apiUrl: The URL to the Altcraft API endpoint.
private let apiUrl = "apiUrl"

/// resToken: The unique identifier of the Altcraft resource.
private let resToken = "resToken"

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

/// - important! The call to setGroupsName() must be made before initializing all other sdk objects in the didFinishLaunchingWithOptions method.
StoredVariablesManager.shared.setGroupsName(value:groupsName)

let config = AltcraftConfiguration.Builder()
.setProvider(Constants.ProviderName.apns)
.setApiUrl(apiUrl)
.setResToken(resToken)
.build()

AltcraftSDK.shared.initialization(configuration: config)
AltcraftSDK.shared.periodicBackgroundTasks.registerBgTaskForSystemFunctionControl()
AltcraftSDK.shared.notificationServiceFunction.registerForPushNotificationsWichSubscription(for: application)
return true
}
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
AltcraftSDK.shared.pushModule.pushModuleControl(deviceToken: deviceToken)
}
}

Для подключения AppDelegate в SwiftUI используйте адаптер:

@UIApplicationDelegateAdaptor(AppDelegate.self) var delegate

Ключевые свойства AppDelegate

1. Обязательно укажите собственное название AppGroupsName:

private var appGroupsName = "group.you_name", где "group.you_name" — имя созданной вами группы. Оно должно соответствовать имени, указанному в Signing & Capabilities:

2. Выполните сохранение appGroupsName перед инициализацией любых других объектов Altcraft:

StoredVariablesManager.shared.setGroupsName(value: appGroupsName)

3. Создайте переменную конфигурации:

    let config = AltcraftConfiguration.Builder()
.setProvider(Constants.ProviderName.apns)
.setApiUrl(apiUrl)
.setResToken(resToken)
.build()
  • Constants.ProviderName.apns — константа, содержащая имя сервиса для отправки сообщений ios-apns

  • apiUrl — URL-адрес конечной точки Altcraft API

  • resToken — ресурс-токен Altcraft.

4. Выполните функцию инициализации класса AltcraftSDK:

AltcraftSDK.shared.initialization(configuration: config), где configuration — переменная конфигурации.

5. Зарегистрируйте задачу класса BGTask — задачу, выполняемую в background:

AltcraftSDK.shared.periodicBackgroundTasks.registerBgTaskForSystemFunctionControl()

6. Выполните запрос на разрешение показа уведомлений у пользователя. В случае положительного ответа будет выполнена автоматическая подписка на push-уведомления Altcraft:

AltcraftSDK.shared.notificationServiceFunction.registerForPushNotificationsWichSubscription(for: application)

Если вы хотите вызвать запрос разрешения на показ без подписки на push-уведомления Altcraft, воспользуйтесь функцией registerForPushNotifications(for: application):

AltcraftSDK.shared.notificationServiceFunction.registerForPushNotifications(for: application)

7. Для отдельного вызова функции, которая добавляет подписку на push-уведомления Altcraft, воспользуйтесь следующим кодом:

AltcraftSDK.shared.pushModule.subscribeToAltcraftPush()

Данная функция выполнит подписку если:

  • разрешение на показ push-уведомлений предоставлено
  • SDK инициализирован
  • токен устройства доступен и получен

Подготовка Notification Service Extension

1. Создайте новый таргет Notification Service Extension:

  • Нажмите File — New — Target — Notification Service Extension
  • Выберите название (Product Name) для таргета
  • Активируйте его

2. Настройте таргет приложения Notification Service Extension:

  • В разделе General:

    • Укажите Minimum Deployments;

    • Добавьте фреймворк Altcraft в разделе "Frameworks, Libraries and Embedded Content".

  • В разделе Signing & Capabilities:

    • В Capabilities добавьте AppGroups. Название для него укажите такое же, как и в таргете приложения.

3. Замените весь автоматически созданный код класса на следующий:

import Altcraft
import UserNotifications

class NotificationService: UNNotificationServiceExtension {

/// - important! Set app groups name.
var appGroupsName = "group.you_name"

var service = AltcraftNotificationService()

override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {

if isAltcraftPush(request) {
StoredVariablesManager.shared.setGroupsName(value: appGroupsName)
_ = AltcraftSDK.shared.coreDataManager
self.service.didReceive(request, withContentHandler: contentHandler)
} else {
contentHandler(request.content)
}
}

override func serviceExtensionTimeWillExpire() {
service.serviceExtensionTimeWillExpire()
}
}

Обязательно укажите свое название AppGroupsName:

private var appGroupsName = "group.you_name", где вместо "group.you_name" необходимо указать название AppGroups из Signing & Capabilities.