Примечание: Устаревшая документация для этого элемента отсутствует, поэтому вы видите текущую документацию.
Теперь вы можете реализовать push-уведомления для вашего iOS-приложения, используя наш iOS App SDK. Вам понадобится помощь вашего разработчика, так как это будет разовая интеграция, прежде чем вы сможете отправлять им push-уведомления через панель управления PushEngage.
Прежде чем начать
- Вам понадобится установленный Xcode на вашей системе.
- Действительный аккаунт разработчика и App ID настроены на Apple Developer Portal.
Мы выполним следующие шаги, чтобы включить push-уведомления для вашего iOS-приложения.
- Настройка вашего приложения
- Интеграция PushEngage iOS SDK
- Инициализация PushEngage iOS SDK
- Создание расширения Notification Service
- Инициализация SDK PushEngage для Notification Service Extension
- Создание Notification Content Extension
- Инициализация SDK PushEngage для Notification Content Extension
- Добавить группы приложений
- Глубокие ссылки
- Обработка уведомлений на переднем плане
- Устранение неполадок
Настройка вашего приложения
Включить удаленные уведомления
1. Откройте ваш проект Xcode и выберите корневой проект в навигаторе проекта. Выберите вашу основную цель приложения.
2. Перейдите в раздел Signing & Capabilities. Убедитесь, что добавлена возможность Background Modes. Если нет, добавьте ее, нажав кнопку «+ Capability».
3. Аналогично, убедитесь, что добавлена возможность Push Notifications. Если нет, добавьте ее с помощью кнопки «+ Capability».
Если возможность Push Notifications не отображается в Xcode. Вам нужно выполнить следующие шаги:
1. Войдите в свою учетную запись разработчика Apple.
2. Перейдите в раздел Certificates, Identifiers & Profiles.
3. Выберите идентификатор вашего приложения. Отредактируйте конфигурацию вашего App ID и убедитесь, что Push Notifications включены.
4. Вернитесь в Xcode и попробуйте добавить возможность «Push Notifications» снова.
Включить фоновые режимы
1. В вашем проекте Xcode перейдите в раздел Signing & Capabilities.
2. В разделе Background Modes включите Remote notifications и Background Fetch.
Этот шаг гарантирует, что ваше приложение сможет эффективно обрабатывать удаленные уведомления и фоновые выборки.
Здесь находится руководство по созданию вашего сертификата APNs.
Интеграция PushEngage iOS SDK
PushEngage iOS SDK доступен как Swift package и как CocoaPods pod. Мы просим вас ознакомиться с обоими методами, но использовать только один из них при завершении настройки.
Интеграция PushEngage iOS SDK с SPM
Чтобы интегрировать PushEngage iOS SDK с помощью Swift Package Manager, выполните следующие шаги:
- Откройте Xcode и перейдите к вашему проекту. Выберите вкладку Package dependencies. Нажмите кнопку +.

- Вставьте URL
https://github.com/awesomemotive/pushengage-ios-sdkв строку поиска. Нажмите «Add Package».

- Выберите вашу основную цель приложения в разделе «Add to Target» и нажмите «Add Package».

Интеграция PushEngage iOS SDK с CocoaPods
Чтобы интегрировать PushEngage iOS SDK с помощью CocoaPods, вам необходимо выполнить следующие шаги:
Если CocoaPods не установлен, закройте текущий проект Xcode и выполните следующую команду в корневом каталоге вашего проекта
sudo gem install cocoapods
Выполните следующую команду, чтобы инициализировать Podfile в вашем проекте
pod init
Откройте недавно созданный Podfile с помощью текстового редактора или, следуя команде в вашем терминале в корневом каталоге проекта.
open Podfile
Добавьте зависимость PushEngage под целевым объектом вашего проекта. Убедитесь, что ваш Podfile выглядит похоже на пример ниже
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
target 'YourProjectName' do
# Add PushEngage SDK dependency
pod 'PushEngage'
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['APPLICATION_EXTENSION_API_ONLY'] = 'NO'
end
end
end
end
Сохраните Podfile и выполните следующие команды в терминале.
pod repo update
pod install
Откройте недавно созданный файл <project-name>.xcworkspace в Xcode.
Инициализация PushEngage iOS SDK
После интеграции SDK нам нужно будет инициализировать iOS SDK в вашем AppDelegate.
Используя язык Swift, вот как вы можете это сделать
import PushEngage
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
override init() {
super.init()
PushEngage.swizzleInjection(isEnabled: true)
}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Set your PushEngage App ID (replace "APP_ID_FROM_PUSH_ENGAGE_DASHBOARD" with your actual App ID)
PushEngage.setAppId(key: "APP_ID_FROM_PUSH_ENGAGE_DASHBOARD")
// Start PushEngage initial info
PushEngage.setInitialInfo(for: application, with: launchOptions)
// Enable logs for debugging (optional)
PushEngage.enableLogs = true
return true
}
}
Используя язык Objective-C, вот как вы можете это сделать
#import "AppDelegate.h"
@import PushEngage;
@implementation AppDelegate
- (instancetype)init {
self = [super init];
if (self) {
[PushEngage swizzleInjectionWithIsEnabled:YES];
}
return self;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Set your PushEngage App ID (replace "APP_ID_FROM_PUSH_ENGAGE_DASHBOARD" with your actual App ID)
[PushEngage setAppIdWithKey:@"APP_ID_FROM_PUSH_ENGAGE_DASHBOARD"];
// Set initial info
[PushEngage setInitialInfoFor:application with:launchOptions];
// Enable logs for debugging (optional)
[PushEngage setEnableLogs:YES];
return YES;
}
@end
Иногда, при использовании SwiftUI, AppDelegate может быть недоступен по умолчанию. В таких случаях вы можете инициализировать PushEngage SDK в вашем основном файле приложения. Вот пример в SwiftUI
import SwiftUI
import PushEngage
@main
struct PEDemoApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
class AppDelegate: NSObject, UIApplicationDelegate {
override init() {
super.init()
PushEngage.swizzleInjection(isEnabled: true)
}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
PushEngage.setAppId(key: "APP_ID_FROM_PUSH_ENGAGE_DASHBOARD")
PushEngage.setIntialInfo(for: application,
with: launchOptions)
PushEngage.enableLogs = true
return true
}
}
Примечание: При разработке вашего приложения вам может быть полезно включить журналы из PushEngage SDK для целей отладки. Однако крайне важно отключить журналы в производственной сборке, чтобы избежать раскрытия конфиденциальной информации.
Создание расширения Notification Service
Расширение Notification Service расширяет возможности вашего iOS-приложения по получению уведомлений. Оно используется для изменения содержимого уведомления или для получения/обработки любых данных при получении уведомления. Вы можете выполнить следующие шаги для создания расширения Notification Service:
1. Откройте Xcode и перейдите к вашему проекту. Выберите File » New » Target в меню.
2. В окне выбора шаблона выберите Notification Service Extension и нажмите Next.
3. Укажите имя для вашего расширения, например, PushEngageNotificationServiceExtension, и нажмите Finish.
4. По завершении создания Notification Service Extension вам может быть предложено активировать его. Не активируйте его немедленно.
Активация расширения переключит фокус отладки Xcode с вашего приложения на расширение. Если вы активировали его случайно, не волнуйтесь; вы можете переключиться обратно на отладку вашего приложения в Xcode.
Инициализация SDK PushEngage для Notification Service Extension
Чтобы обеспечить надлежащее функционирование PushEngage SDK в вашем расширении Notification Service для iOS, вам необходимо выполнить следующие шаги:
1. Откройте Podfile, связанный с вашим проектом.
2. Затем вам нужно добавить зависимость. Вставьте следующий фрагмент кода в ваш Podfile:
target 'Your_Main_Application_Target' do
pod 'PushEngage'
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['APPLICATION_EXTENSION_API_ONLY'] = 'NO'
end
end
end
target 'Your_Notification_Service_Extension_Target' do
pod 'PushEngage'
end
end
3. Выполните следующие команды в вашем терминале в корневом каталоге вашего проекта:
pod repo update
pod install
4. В целевом объекте вашего Notification Service Extension импортируйте фреймворк PushEngage и добавьте необходимый код инициализации. Вот как вы можете это сделать.
Используя Swift
import UserNotifications
import PushEngage
@available(iOSApplicationExtension 10.0, *)
class PushEngageNotificationServiceExtension: UNNotificationServiceExtension {
var contentHandler: ((UNNotificationContent) -> Void)?
var bestAttemptContent: UNMutableNotificationContent?
var request : UNNotificationRequest?
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
self.request = request
self.contentHandler = contentHandler
self.bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
if let bestContent = bestAttemptContent {
PushEngage.didReceiveNotificationExtensionRequest(request, bestContentHandler: bestContent)
contentHandler(bestContent)
}
}
override func serviceExtensionTimeWillExpire() {
// Called just before the extension will be terminated by the system.
// Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
if let contentHandler = contentHandler, let request = request ,let bestAttemptContent = bestAttemptContent {
guard let content = PushEngage.serviceExtensionTimeWillExpire(request, content: bestAttemptContent) else {
contentHandler(bestAttemptContent)
return
}
contentHandler(content)
}
}
}
Используя Objective-C
#import "NotificationService.h"
@import PushEngage;
@interface NotificationService ()
@property (nonatomic, strong) void (^contentHandler)(UNNotificationContent *contentToDeliver);
@property (nonatomic, strong) UNMutableNotificationContent *bestAttemptContent;
@property (nonatomic, strong) UNNotificationRequest *request;
@end
@implementation NotificationService
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
self.request = request;
self.contentHandler = contentHandler;
self.bestAttemptContent = [request.content mutableCopy];
if (self.bestAttemptContent) {
[PushEngage didReceiveNotificationExtensionRequest:request bestContentHandler:self.bestAttemptContent];
contentHandler(self.bestAttemptContent);
}
}
- (void)serviceExtensionTimeWillExpire {
if (self.contentHandler && self.request && self.bestAttemptContent) {
UNNotificationContent *content = [PushEngage serviceExtensionTimeWillExpire:self.request content:self.bestAttemptContent];
if (content) {
self.contentHandler(self.bestAttemptContent);
return;
}
}
self.contentHandler(self.bestAttemptContent);
}
@end
Создание Notification Content Extension
Чтобы улучшить отображение путем добавления пользовательского интерфейса, вам потребуется создать Notification Content Extension. Следуйте приведенным ниже шагам для настройки расширения:
1. В Xcode перейдите в File » New » Target.
2. Выберите Notification Content Extension и нажмите Далее.
3. Не выбирайте «Активировать» в диалоговом окне, которое появляется после нажатия «Готово». Отмена сохранит отладку вашего приложения в Xcode вместо расширения. Если вы случайно активируете его, вернитесь к отладке вашего приложения в Xcode (рядом с кнопкой запуска).
4. В навигаторе проекта выберите каталог верхнего уровня проекта и выберите цель NotificationContentExtension в списке целей, созданных в шаге № 2.
5. Установите Deployment Target на iOS 10 или выше, так как это версия iOS, для которой Apple выпустила поддержку этого расширения.
Инициализация SDK PushEngage для Notification Content Extension
Чтобы обеспечить надлежащее функционирование PushEngage SDK в вашем расширении Notification Content для iOS, вам необходимо выполнить следующие шаги:
1. Откройте Podfile, связанный с вашим проектом.
2. Добавьте зависимость, вставьте следующий фрагмент кода в ваш Podfile:
target 'Your_Main_Application_Target' do
pod 'PushEngage'
target 'Your_Notification_Content_Extension' do
pod 'PushEngage'
end
end
3. Выполните следующие команды в вашем терминале в корневом каталоге вашего проекта:
pod repo update
pod install
4. В целевом объекте вашего Notification Content Extension импортируйте фреймворк PushEngage и добавьте необходимый код инициализации. Вот как вы можете это сделать с некоторыми примерами элементов пользовательского интерфейса:
Используя Swift
import UIKit
import UserNotifications
import UserNotificationsUI
import PushEngage
@available(iOSApplicationExtension 10.0, *)
class NotificationViewController: UIViewController, UNNotificationContentExtension {
fileprivate var hostingView: UIHostingController<ContentView>?
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = .white
}
func didReceive(_ notification: UNNotification) {
if(notification.request.content.categoryIdentifier == "your_identifier"){
let payLoad = PushEngage.getCustomUIPayLoad(for: notification.request)
//pass the payload to your custom View
let view = CustomView(payLoadInfo: payLoad)
hostingView = UIHostingController(rootView: view)
If let customView = self.hostingView {
addChild(hostingView!)
}
}
}
}
Objective-C:
#import "NotificationViewController.h"
#import <UserNotifications/UserNotifications.h>
#import <UserNotificationsUI/UserNotificationsUI.h>
@import PushEngage;
@import UIKit;
@interface NotificationViewController () <UNNotificationContentExtension>
@property IBOutlet UILabel *label;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (weak, nonatomic) IBOutlet UIButton *firstButton;
@property (weak, nonatomic) IBOutlet UIButton *secondButton;
@end
@implementation NotificationViewController
- (IBAction)firstbuttonAction:(id)sender {
// do what action you want to perform.
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any required interface initialization here.
}
- (void)didReceiveNotification:(UNNotification *)notification {
NotificationViewController * __block blockSelf = self;
CustomUIModel *object = [PushEngage getCustomUIPayLoadFor:notification.request];
dispatch_async(dispatch_get_main_queue(), ^{
blockSelf.label.text = object.title;
blockSelf.imageView.image = object.image;
[blockSelf.firstButton setTitle:object.buttons.firstObject.text forState:UIControlStateNormal];
[blockSelf.secondButton setTitle:object.buttons.lastObject.text forState:UIControlStateNormal];
blockSelf = NULL;
});
}
@end
Добавить группы приложений
Группы приложений необходимы для связи между основным приложением, расширением сервиса уведомлений и расширением контента. Вы можете выполнить следующие шаги, чтобы добавить группы приложений в ваш проект iOS:
Если у вас уже есть группа приложений и вы хотите использовать только ее, перейдите к шагу № 5.
1. В вашем проекте Xcode, в навигаторе проекта, выберите корневой каталог проекта и выберите основную цель приложения.
2. Перейдите на вкладку "Signing & Capabilities".
3. Нажмите кнопку "+ Capability" и выберите "App Groups" из списка.
4. Нажмите кнопку +, чтобы добавить группу приложений. Добавьте уникальное имя для вашей группы приложений и нажмите OK.
5. В основной области редактора выберите основной целевой объект вашего приложения и создайте группу приложений. Укажите имя группы в файле Info.plist вашего приложения с ключом PushEngage_App_Group_Key.
6. Добавьте тот же ключ и значение в файл Info.plist расширения сервиса уведомлений.
7. Выберите ту же группу приложений в основном целевом объекте приложения и в вашем расширении сервиса уведомлений.
Убедитесь, что вы выбрали ваше расширение сервиса уведомлений на предыдущем шаге.
Глубокие ссылки
Глубокие ссылки позволяют вашим подписчикам переходить непосредственно к определенному экрану в приложении или на указанную веб-страницу при взаимодействии с push-уведомлениями. По умолчанию, если вы предоставите действительный URL, подписчик будет перенаправлен на эту веб-страницу.
Обработка веб-URL:
- Установите значение YES для
PushEngageInAppEnabledв Info.plist, и URL будет загружаться в приложении с использованием WKWebview. - Установите значение NO для
PushEngageInAppEnabledв Info.plist, если вы хотите, чтобы ваш подписчик перенаправлялся в Safari для загрузки URL. - Установите значение YES для
PushEngageAutoHandleDeeplinkURLв Info.plist, и SDK будет обрабатывать глубокую ссылку в соответствии с конфигурациейPushEngageInAppEnabled. - Установите значение NO для
PushEngageAutoHandleDeeplinkURLв Info.plist, и управление обработкой глубокой ссылки будет передано клиентскому приложению от SDK. - Если глубокая ссылка не является допустимым URL, вам необходимо настроить навигацию, используя
setNotificationOpenHandlerвAppDelegateв методеdidFinishLaunchingWithOptions. Это позволит вам перейти к определенному экрану на основе предоставленной строки, как показано ниже. Если не настроено, SDK просто откроет приложение.

Используя Swift:
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
override init() {
super.init()
// method Swizzling enabled for the application.
PushEngage.swizzleInjection(isEnabled: true)
}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
PushEngage.setAppId(key: "APP_ID_FROM_PUSH_ENGAGE_DASHBOARD")
PushEngage.setInitialInfo(for: application,with: launchOptions)
// Notification open handler.
// deep linking screen
// here ShoesScreen and pepay are example deep link texts
PushEngage.setNotificationOpenHandler { (result) in
//replace this block with your own handling
let additionData = result.notification.additionalData
if result.notificationAction.actionID == "ShoesScreen" {
print(additionData ?? [])
let storyBoard = UIStoryboard(name: "Main", bundle: .main)
let viewController = storyBoard.instantiateViewController(withIdentifier: "SportViewController")
let navcontroller = application.windows.first?.rootViewController as? UINavigationController
navcontroller?.popToRootViewController(animated: true)
navcontroller?.pushViewController(viewController, animated: true)
} else if result.notificationAction.actionID == "SalesScreen" {
let storyBoard = UIStoryboard(name: "Main", bundle: .main)
let viewController = storyBoard.instantiateViewController(withIdentifier: "NotificationApiTestViewconttoller")
let navcontroller = application.windows.first?.rootViewController as? UINavigationController
navcontroller?.popToRootViewController(animated: true)
navcontroller?.pushViewController(viewController, animated: true)
} else if result.notificationAction.actionID == "pepay" {
let storyBoard = UIStoryboard(name: "Main", bundle: .main)
let viewController = storyBoard.instantiateViewController(withIdentifier: "PEPay")
let navcontroller = application.windows.first?.rootViewController as? UINavigationController
navcontroller?.popToRootViewController(animated: true)
navcontroller?.pushViewController(viewController, animated: true)
}
}
PushEngage.enableLogs = true
return true
}
}
Используя Objective-C:
@implementation AppDelegate
- (instancetype)init
{
self = [super init];
if (self) {
[PushEngage swizzleInjectionWithIsEnabled: YES];
}
return self;
}
typedef void (^PEnotificationOpenHandler)(PENotificationOpenResult * nonnull);
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UNUserNotificationCenter.currentNotificationCenter.delegate = self;
PEnotificationOpenHandler actionHandler = ^void(PENotificationOpenResult *result) {
//replace this block with your own handling
if ([result.notificationAction.actionID isEqualToString: @"ShoesScreen"]) {
AddToCart *controller = [AddToCart new];
UINavigationController *navigationController = (UINavigationController *) application.windows.firstObject.rootViewController;
[navigationController popToRootViewControllerAnimated:YES];
[navigationController pushViewController:controller animated:YES];
} else if ([result.notificationAction.actionID isEqualToString: @"SalesScreen"]) {
SportsViewcontroller *controller = [SportsViewcontroller new];
UINavigationController *navigationController = (UINavigationController *) application.windows.firstObject.rootViewController;
[navigationController popToRootViewControllerAnimated:YES];
[navigationController pushViewController:controller animated:YES];
}
};
application.applicationIconBadgeNumber = 0;
[PushEngage setAppIdWithKey:@"APP_ID_FROM_PUSH_ENGAGE_DASHBOARD"];
[PushEngage setInitialInfoFor:application with:launchOptions];
[PushEngage setNotificationOpenHandlerWithBlock:actionHandler];
[PushEngage setEnableLogs:true];
return YES;
}
@end
Обработка уведомлений на переднем плане
Когда уведомления приходят в фоновом режиме, вы должны решить, показывать ли оповещение об уведомлении устройству. Для обработки уведомлений в фоновом режиме используйте setNotificationWillShowInForgroundHandler
Если блок завершения не будет вызван вами вообще, SDK вызовет блок завершения через 29 секунд. В любом случае, тихое уведомление или уведомление с оповещением, когда приложение находится в фоновом режиме.
Используя Swift
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
override init() {
super.init()
// method Swizzling enabled for the application.
PushEngage.swizzleInjection(isEnabled: true)
}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
PushEngage.setAppId(key: "APP_ID_FROM_PUSH_ENGAGE_DASHBOARD")
PushEngage.setInitialInfo(for: application, with: launchOptions)
// Notification handler when notification deliver's and app is in foreground.
PushEngage.setNotificationWillShowInForgroundHandler { notification, completion in
if notification.contentAvailable == 1 {
// in case the developer failed to set the completion handler. After 29 sec the handler will call from the SDK after 29 sec.
completion(nil)
} else {
completion(notification)
}
}
PushEngage.enableLogs = true
return true
}
}
Используя Objective-C
@implementation AppDelegate
- (instancetype)init
{
self = [super init];
if (self) {
[PushEngage swizzleInjectionWithIsEnabled: YES];
}
return self;
}
// please create this handlers
typedef void (^ _Nonnull PENotificationDisplayHandler)(PENotification * _Nullable);
-(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UNUserNotificationCenter.currentNotificationCenter.delegate = self;
[PushEngage setNotificationWillShowInForgroundHandlerWithBlock:^(PENotification * _Nonnull notification, PENotificationDisplayHandler completion) {
if (notification.contentAvailable == 1) {
completion(nil);
} else {
completion(notification);
}
}];
[PushEngage setAppIdWithKey:@"APP_ID_FROM_PUSH_ENGAGE_DASHBOARD"];
[PushEngage setInitialInfoFor:application with:launchOptions];
[PushEngage setEnableLogs:true];
return YES;
}
@end
Устранение неполадок
Проблема:
У вас возникли проблемы со сборкой, связанные с песочницей.
Решение:
- Откройте ваш проект в Xcode.
- Перейдите в Build Settings.
- Найдите опцию User Script Sandboxing.
- Установите ее в No.
Проблема:
Вы используете как Firebase SDK, так и PushEngage SDK с включенной подменой методов для обоих, и это вызывает проблемы.
Решение:
Отключите подмену методов для PushEngage SDK и следуйте ручным инструкциям по обработке методов PushEngage. Подробные инструкции можно найти здесь:
Документация PushEngage iOS SDK
Если вы хотите изучить больше возможностей iOS SDK, вы можете ознакомиться с нашей подробной документацией по API.
Если у вас возникнут какие-либо проблемы, пожалуйста, свяжитесь с нами, нажав здесь. Наша служба поддержки сможет вам помочь.