Перейти к содержанию

Кастомизация iOS SDK

Интеграция

Anchor link to

Глубокие ссылки (Deep linking)

Anchor link to

В вашем файле Info.plist добавьте массив URL types с URL Identifier и URL Scheme.
В примере ниже URL Scheme — это com.pushwoosh, а URL Identifierpromotion.

В файле делегата вашего приложения (обычно AppDelegate.m для iOS 12 и ниже, или SceneDelegate.m для iOS 13 и выше) добавьте соответствующую функцию-делегат openURL, как показано в примере ниже. Пример проверяет корректность страницы, извлекает значение “id” из URL и в ответ открывает PromoPageViewController.

AppDelegate.swift

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
let page = components?.host
var promotionId: String?
if page == "promotion" {
return
}
let items = components?.queryItems ?? []
for item in items {
if item.name == "id" {
promotionId = item.value
}
}
//show PromoPageViewController
}

SceneDelegate.swift

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
guard let urlContext = URLContexts.first else { return }
let components = URLComponents(url: urlContext.url, resolvingAgainstBaseURL: false)
let page = components?.host
var promotionId: String?
guard page == "promotion" else {
return
}
let items = components?.queryItems ?? []
for item in items {
if item.name == "id" {
promotionId = item.value
}
}
//show PromoPageViewController
}
Anchor link to

Универсальные ссылки (Universal Links) позволяют пользователям открывать ваше приложение напрямую, когда они нажимают на ссылку на ваш сайт. В отличие от пользовательских URL-схем, универсальные ссылки используют стандартные URL-адреса https:// и обеспечивают более плавный пользовательский опыт.

Как это работает

Anchor link to

Когда push-уведомление содержит URL-адрес https:// (в параметре “url” или “l”), SDK будет:

  1. Создавать NSUserActivity с URL-адресом
  2. Вызывать обработчик универсальных ссылок вашего приложения (scene:continueUserActivity: или application:continueUserActivity:restorationHandler:)
  3. Если ваше приложение не обрабатывает URL, он будет открыт в Safari в качестве запасного варианта

Настройка

Anchor link to
  1. Настройте Associated Domains в Xcode

Добавьте возможность Associated Domains в ваше приложение и укажите ваш домен:

applinks:yourdomain.com
  1. Разместите файл Apple App Site Association

Создайте файл apple-app-site-association на вашем веб-сервере по адресу https://yourdomain.com/.well-known/apple-app-site-association:

{
"applinks": {
"apps": [],
"details": [
{
"appID": "TEAM_ID.com.your.bundleid",
"paths": ["/path/*", "/promotion/*"]
}
]
}
}

Замените TEAM_ID на ваш Apple Developer Team ID и com.your.bundleid на идентификатор вашего приложения.

  1. Реализуйте обработчик универсальных ссылок

SceneDelegate.swift (iOS 13+)

func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let url = userActivity.webpageURL else {
return
}
// Обработка URL универсальной ссылки
let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
let path = components?.path
if path?.starts(with: "/promotion") == true {
// Переход на экран акции
let promotionId = components?.queryItems?.first(where: { $0.name == "id" })?.value
// Показать акцию с promotionId
}
}

AppDelegate.swift (iOS 12 и ранее, или в качестве запасного варианта)

func application(_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let url = userActivity.webpageURL else {
return false
}
// Обработка URL универсальной ссылки
let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
let path = components?.path
if path?.starts(with: "/promotion") == true {
// Переход на экран акции
return true
}
return false
}

Отправка push-уведомления с универсальной ссылкой

Anchor link to

При создании push-уведомления используйте URL вашего сайта в поле Action:

https://yourdomain.com/promotion?id=123

SDK автоматически направит этот URL в ваш обработчик универсальных ссылок, что позволит вам перенаправить пользователя на соответствующий экран в вашем приложении.

Отслеживание встроенных покупок

Anchor link to

По умолчанию отслеживание встроенных покупок отключено. Если вы хотите отслеживать встроенные покупки при настройке Customer Journeys, установите флаг Pushwoosh_PURCHASE_TRACKING_ENABLED в значение true в файле info.plist. Список доступных флагов вы можете найти в таблице.

Если вы хотите отслеживать встроенные покупки вручную, вы можете использовать код ниже.

В методе-делегате paymentQueue:updatedTransactions: вызовите метод sendSKPaymentTransactions из PushManager

func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
// Код Pushwoosh для отслеживания встроенных покупок
Pushwoosh.sharedInstance().sendSKPaymentTransactions(transactions)
// остальной код, обработка транзакций и т.д.
}
InAppTrackingViewController.swift

Push-уведомления на основе геозон

Anchor link to

Push-уведомления на основе геозон инкапсулированы в отдельный фреймворк PushwooshGeozones.

  1. Добавьте PushwooshGeozones.framework в ваш проект

Чтобы добавить PushwooshGeozones.framework в ваш проект с помощью менеджера зависимостей, добавьте следующие строки в ваш podfile или cartfile:

pod 'PushwooshXCFramework/Geozones'

В качестве альтернативы, вы можете просто перетащить фреймворк в Link Binaries With Libraries в Build Phases вашего проекта.

  1. Добавьте следующие ключи в ваш Info.plist:
  • NSLocationWhenInUseUsageDescription(обязательно), чтобы приложение отслеживало геозоны только во время работы на переднем плане.
  • NSLocationAlwaysAndWhenInUseUsageDescription(обязательно), чтобы приложение отслеживало геозоны как на переднем, так и на заднем плане и показывало диалоговое окно с запросом разрешения.
  • NSLocationAlwaysUsageDescription(необязательно), чтобы приложение отслеживало геозоны постоянно; следует использовать, если ваше приложение нацелено на iOS 10 и более ранние версии.
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>for app to track Geozones in both conditions and to show a permission request dialog</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>for app to track Geozones only while running in the foreground</string>

  1. Импортируйте фреймворк
import PushwooshGeozones
  1. Запустите отслеживание геозон
PWGeozonesManager.shared()?.startLocationTracking()

Ссылка на GitHub

Пример
Anchor link to
override func viewDidLoad() {
super.viewDidLoad()
// Запустите отслеживание геозон, когда это необходимо
PWGeozonesManager.shared().startLocationTracking()
}

Создание очереди Rich Media

Anchor link to

В случае, когда необходимо одновременно отобразить несколько страниц Rich Media (например, события-триггеры для двух или более In-App’ов происходят в один момент, или страница Rich Media уже отображается в момент возникновения другого события-триггера), вы можете настроить очередь для отображения страниц Rich Media. Чтобы создать очередь, выполните следующие шаги.

  1. Создайте класс, реализующий PWRichMediaPresentingDelegate:
@interface ChainedRichMediaPresentingDelegate () <PWRichMediaPresentingDelegate>
@property (nonatomic) NSMutableArray *queue;
@property (nonatomic) BOOL inAppIsPresenting;
@end
@implementation ChainedRichMediaPresentingDelegate
- (instancetype)init {
self = [super init];
if (self) {
_queue = [NSMutableArray new];
}
return self;
}
- (BOOL)richMediaManager:(PWRichMediaManager *)richMediaManager shouldPresentRichMedia:(PWRichMedia *)richMedia {
[_queue addObject:richMedia];
return !_inAppIsPresenting;
}
- (void)richMediaManager:(PWRichMediaManager *)richMediaManager didPresentRichMedia:(PWRichMedia *)richMedia {
_inAppIsPresenting = YES;
}
- (void)richMediaManager:(PWRichMediaManager *)richMediaManager didCloseRichMedia:(PWRichMedia *)richMedia {
_inAppIsPresenting = NO;
[_queue removeObject:richMedia];
if (_queue.count) {
[[PWRichMediaManager sharedManager] presentRichMedia:_queue.firstObject];
}
}
- (void)richMediaManager:(PWRichMediaManager *)richMediaManager presentingDidFailForRichMedia:(PWRichMedia *)richMedia withError:(NSError *)error {
[self richMediaManager:richMediaManager didCloseRichMedia:richMedia];
}
@end

2. Установите делегат:

[PWRichMediaManager sharedManager].delegate = [ChainedRichMediaPresentingDelegate new];

Автовоспроизведение видео из Rich Notification по force touch

Anchor link to

Чтобы видео, отправленное как вложение Rich Notification, автоматически воспроизводилось при раскрытии уведомления без какого-либо взаимодействия с пользователем, выполните следующие шаги:

  1. Добавьте Notification Content Extension в ваш проект:
  • В Xcode выберите File > New > Target.
  • Выберите Notification Content Extension.
  • Присвойте ему имя и завершите настройку.
Notification Content Extension - iOS Rich Push Notification

Если появится сообщение “Activate scheme”, выберите Cancel.

Активировать схему Notification Content
  1. Настройте свойства и методы в Content Extension следующим образом:
import UIKit
import UserNotifications
import UserNotificationsUI
import AVKit
class NotificationViewController: UIViewController, UNNotificationContentExtension {
var playerController: AVPlayerViewController!
@IBOutlet weak var playerBackgroundView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
// Выполните здесь любую необходимую инициализацию интерфейса.
}
func didReceive(_ notification: UNNotification) {
let attachment = notification.request.content.attachments.first
playerController = AVPlayerViewController()
// Установите высоту программно
// preferredContentSize.height = 250
if let url = attachment?.url {
setupVideoPlayer(url: url)
} else {
print("No valid URL...")
}
}
private func setupVideoPlayer(url: URL) {
guard let playerController = self.playerController else { return }
let player = AVPlayer(url: url)
playerController.player = player
playerController.view.frame = self.playerBackgroundView.bounds
playerBackgroundView.addSubview(playerController.view)
addChild(playerController)
playerController.didMove(toParent: self)
player.play()
}
  1. Включите UIView в MainInterface.storyboard:
UIView в MainInterface.storyboard
  1. Свяжите IBOutlet playerBackgroundView с только что добавленным UIView:
Связывание IBOutlet playerBackgroundView с UIView
  1. Обновите файл info.plist, добавив следующую запись:
UNNotificationExtensionUserInteractionEnabled = true
UNNotificationExtensionUserInteractionEnabled = true

Чтобы прикрепить видео к вашему уведомлению, введите URL видео в поле Media Attachment в Control Panel:

URL видео в поле Media Attachment в Pushwoosh Control Panel

При отправке уведомления через API-запрос /createMessage включите URL в параметр “ios_attachment” и убедитесь, что флаг “mutable-content” установлен в 1.

Пользовательский звук push-уведомления

Anchor link to

Чтобы воспроизвести пользовательский звук при получении push-уведомления, сначала поместите аудиофайл в корневую папку вашего проекта.

Затем укажите имя звукового файла в параметрах push-уведомления – заполните поле Sound в настройках для iOS вашего сообщения или укажите имя файла в качестве значения для параметра “ios_sound” в API-запросе createMessage.

Аудиофайл для пользовательского звука в iOS должен быть в одном из следующих форматов: .aif, .caf, .wav. Обязательно укажите формат в имени файла; в противном случае он будет проигнорирован Pushwoosh iOS SDK.

iOS Provisional Push

Anchor link to

Как это работает

Anchor link to

Provisional push notifications появляются беззвучно в Центре уведомлений пользователя, но не на экране блокировки. Этот тип push-уведомлений не требует явного разрешения от пользователя: вы можете начать отправлять их, как только пользователь установит и запустит ваше приложение.

Однако пользователи все еще могут подписаться на ваши обычные push-уведомления: при открытии Provisional Push у них есть два варианта выбора — оставить push-уведомления в Центре уведомлений без оповещений и звуков или разрешить вам отправлять push-уведомления в обычном режиме, чтобы они появлялись на экране блокировки.

Provisional Pushes разработаны для того, чтобы пользователи могли принимать взвешенные решения о том, хотят ли они получать уведомления от вашего приложения. Поскольку нативный запрос на подписку APN показывается пользователям только один раз, и чтобы подписаться позже, им нужно зайти в системные настройки телефона, некоторые пользователи могут не подписываться, так как не знают, какую ценность они получат от ваших push-уведомлений. Provisional Pushes дают пользователям это понимание: они могут видеть, какой контент вы доставляете в push-уведомлениях, и решать, нужно ли им получать уведомления об этом контенте в обычном режиме.

Как реализовать

Anchor link to

1. Интегрируйте Pushwoosh iOS SDK, следуя руководству.

2. Добавьте следующую строку в AppDelegate вашего проекта перед вызовом метода registerForPushNotifications():

if #available(iOS 12.0, *) {
Pushwoosh.sharedInstance().additionalAuthorizationOptions = UNAuthorizationOptions.provisional
}

Вот и все! Пользователи приложения будут получать сообщения прямо в свой Центр уведомлений после установки приложения.

Поделитесь с нами своим мнением

Anchor link to

Ваши отзывы помогают нам улучшать наш продукт, поэтому мы будем рады услышать от вас, если у вас возникнут какие-либо проблемы в процессе интеграции SDK. Если вы столкнетесь с какими-либо трудностями, пожалуйста, не стесняйтесь поделиться с нами своими мыслями через эту форму.