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

Руководство по базовой интеграции iOS SDK 7.0+

В этом разделе содержится информация о том, как интегрировать Pushwoosh SDK в ваше iOS-приложение.

Предварительные требования

Anchor link to

Для интеграции Pushwoosh iOS SDK в ваше приложение вам потребуется следующее:

Шаги интеграции

Anchor link to

1. Установка

Anchor link to

Вы можете интегрировать Pushwoosh SDK в ваше приложение, используя Swift Package Manager или CocoaPods.

Swift Package Manager

Anchor link to

В разделе Package Dependencies добавьте следующий пакет:

https://github.com/Pushwoosh/Pushwoosh-XCFramework

Чтобы использовать Pushwoosh iOS SDK, убедитесь, что при интеграции через Swift Package Manager в таргет вашего приложения добавлены следующие три фреймворка:

  • PushwooshFramework
  • PushwooshCore
  • PushwooshBridge

Откройте ваш Podfile и добавьте зависимость:

Terminal window
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
target 'MyApp' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
pod 'PushwooshXCFramework'
end

Затем в терминале выполните следующую команду для установки зависимостей:

Terminal window
pod install

2. Capabilities

Anchor link to

Чтобы включить Push-уведомления в вашем проекте, необходимо добавить определенные capabilities (возможности).

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

  • Push Notifications
  • Background Modes. После добавления этой возможности установите флажок Remote notifications.

Если вы планируете использовать Time Sensitive Notifications (iOS 15+), также добавьте capability Time Sensitive Notifications.

3. Код инициализации

Anchor link to

AppDelegate

Anchor link to

Добавьте следующий код в ваш класс AppDelegate:

import SwiftUI
import PushwooshFramework
@main
struct MyApp: App {
// Register AppDelegate as UIApplicationDelegate
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
class AppDelegate: NSObject, UIApplicationDelegate, PWMessagingDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Initialization code
// Set custom delegate for push handling
Pushwoosh.configure.delegate = self
// Register for push notifications
Pushwoosh.configure.registerForPushNotifications()
return true
}
// Handle token received from APNS
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
Pushwoosh.configure.handlePushRegistration(deviceToken)
}
// Handle token receiving error
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
Pushwoosh.configure.handlePushRegistrationFailure(error)
}
//for silent push notifications
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
Pushwoosh.configure.handlePushReceived(userInfo)
completionHandler(.noData)
}
// Fired when a push is received
func pushwoosh(_ pushwoosh: Pushwoosh, onMessageReceived message: PWMessage) {
print("onMessageReceived: ", message.payload!.description)
}
// Fired when a user taps the notification
func pushwoosh(_ pushwoosh: Pushwoosh, onMessageOpened message: PWMessage) {
print("onMessageOpened: ", message.payload!.description)
}
}
struct ContentView: View {
var body: some View {
Text("Pushwoosh with SwiftUI")
.padding()
}
}

Info.plist

Anchor link to

В вашем Info.plist:

  • установите для ключа Pushwoosh_APPID значение Pushwoosh Application Code.
  • установите для ключа Pushwoosh_API_TOKEN значение Pushwoosh Device API Token

4. Отслеживание доставки сообщений

Anchor link to

Pushwoosh поддерживает отслеживание событий доставки для push-уведомлений через Notification Service Extension

Добавление Notification Service Extension

Anchor link to
  1. В Xcode выберите File > New > Target…
  2. Выберите Notification Service Extension и нажмите Next.
  3. Введите имя таргета и нажмите Finish.
  4. При запросе на активацию нажмите Cancel.

Зависимости для Notification Service Extension (только для CocoaPods)

Anchor link to

Примечание: Если вы используете Swift Package Manager для управления зависимостями, вы можете пропустить этот шаг, так как зависимости добавляются автоматически.

Откройте ваш Podfile и добавьте зависимость для таргета:

Podfile
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
target 'MyApp' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
pod 'PushwooshXCFramework'
end
target 'MyAppNotificationExtension' do
use_frameworks!
pod 'PushwooshXCFramework'
end

Выполните следующую команду в терминале, чтобы обновить зависимости:

Terminal window
pod update

Добавление Pushwoosh SDK в Notification Service Extension

Anchor link to

Замените сгенерированный класс NotificationService подклассом PushwooshNotificationServiceExtension. После этого Pushwoosh будет обрабатывать все, что нужно для push-уведомления — отправку события о доставке, подсчет бейджей, загрузку медиавложений и обязательную обработку таймаута serviceExtensionTimeWillExpire. Никакого другого кода не требуется.

import PushwooshFramework
class NotificationService: PushwooshNotificationServiceExtension {}

Примечание: вы можете полностью пропустить исходный файл — установите NSExtensionPrincipalClass расширения в его Info.plist на PushwooshNotificationServiceExtension и не пишите никакого кода.

Чтобы изменить уведомление перед его отображением, переопределите didReceive(_:withContentHandler:), вызовите super со своим собственным обработчиком контента, измените контент внутри него, а затем передайте его исходному обработчику. Pushwoosh по-прежнему будет выполнять отправку события о доставке, обработку бейджа, вложения и таймаута.

import UserNotifications
import PushwooshFramework
class NotificationService: PushwooshNotificationServiceExtension {
override func didReceive(_ request: UNNotificationRequest,
withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
super.didReceive(request) { content in
let mutable = (content.mutableCopy() as? UNMutableNotificationContent) ?? content
// Modify the notification content here...
contentHandler(mutable)
}
}
}

Info.plist

Anchor link to

Расширение наследует Pushwoosh_APPID (и другие ключи Pushwoosh_*) от основного приложения, поэтому вам не нужно дублировать их в Info.plist расширения. Добавляйте ключ туда только если хотите переопределить значение основного приложения.

Для синхронизации счетчика бейджей и настроек обратного прокси с приложением, используйте общую App Group для приложения и расширения. Добавьте capability App Groups к обоим таргетам, затем установите ID App Group в Info.plist основного приложения:

  • PW_APP_GROUPS_NAME - идентификатор вашей App Group (например, group.com.example.app).

Расширение наследует это значение от основного приложения, поэтому вам не нужно повторять его в Info.plist расширения — добавляйте его туда только для переопределения. В качестве альтернативы, вы можете указать его в коде, переопределив pushwooshAppGroupsName.

5. Запуск проекта

Anchor link to
  1. Соберите и запустите проект.
  2. Перейдите в Панель управления Pushwoosh и отправьте push-уведомление.
  3. Вы должны увидеть уведомление в приложении.

Расширенная интеграция Pushwoosh iOS

Anchor link to

На этом этапе вы уже интегрировали SDK и можете отправлять и получать push-уведомления. Теперь давайте рассмотрим основной функционал

Push-уведомления

Anchor link to

В Pushwoosh SDK есть два колбэка, предназначенных для обработки push-уведомлений:

  • onMessageReceived: Этот метод вызывается при получении push-уведомления.
  • onMessageOpened: Этот метод вызывается, когда пользователь взаимодействует с уведомлением (открывает его).

Эти колбэки позволяют разработчикам управлять получением push-уведомлений и взаимодействием пользователей с ними в своих приложениях

import PushwooshFramework
class AppDelegate: NSObject, UIApplicationDelegate, PWMessagingDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
Pushwoosh.configure.delegate = self;
}
func pushwoosh(_ pushwoosh: Pushwoosh, onMessageOpened message: PWMessage) {
if let payload = message.payload {
print("onMessageOpened: \(payload)")
}
}
func pushwoosh(_ pushwoosh: Pushwoosh, onMessageReceived message: PWMessage) {
if let payload = message.payload {
print("onMessageReceived: \(payload)")
}
}
}

Конфигурация пользователя

Anchor link to

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

import PushwooshFramework
class Registration {
func afterUserLogin(user: User) {
let pushwoosh = Pushwoosh.configure
// set user ID
if let userId = user.userId {
pushwoosh.setUserId(userId)
}
// set user email
if let userEmail = user.email {
pushwoosh.setEmail(userEmail)
}
// set user SMS number
if let userSmsNumber = user.SmsNumber {
pushwoosh.registerSmsNumber(userSmsNumber)
}
// set user WhatsApp number
if let userWhatsAppNumber = user.WhatsAppNumber {
pushwoosh.registerSmsNumber(userWhatsAppNumber)
}
// setting additional user information as tags for Pushwoosh
if let age = user.userDetails.age,
let name = user.userDetails.userName,
let lastLogin = user.userDetails.lastLoginDate {
pushwoosh.setTags([
"age": age,
"name": name,
"last_login": lastLogin
])
}
}
}

Теги (Tags) — это пары «ключ-значение», присваиваемые пользователям или устройствам, которые позволяют сегментировать аудиторию на основе таких атрибутов, как предпочтения или поведение, для целевых сообщений.

import PushwooshFramework
class UpdateUser {
func afterUserUpdateProfile(user: User) {
let pushwoosh = Pushwoosh.configure
// set list of favorite categories
pushwoosh.setTags(["favorite_categories" : user.getFavoriteCategories()])
// set payment information
pushwoosh.setTags([
"is_subscribed": user.isSubscribed(),
"payment_status": user.getPaymentStatus(),
"billing_address": user.getBillingAddress()
])
}
}

События

Anchor link to

События (Events) — это определенные действия пользователя или происшествия в приложении, которые можно отслеживать для анализа поведения и запуска соответствующих сообщений или действий.

import PushwooshFramework
class Registration {
func afterUserLogin(user: User) {
if let userName = user.getUserName(), let lastLogin = user.getLastLoginDate() {
PWInAppManager.shared().postEvent("login", withAttributes: [
"name": userName,
"last_login": lastLogin
])
}
}
func afterUserPurchase(user: User, product: Product) {
let pushwoosh = Pushwoosh.configure
// Track purchase event
PWInAppManager.shared().postEvent("purchase", withAttributes: [
"product_id": product.getId(),
"product_name": product.getName(),
"price": product.getPrice(),
"quantity": product.getQuantity()
])
// Set user tags
let lastPurchaseDate = Date().timeIntervalSince1970
let lifetimeSpend = getCurrentLifetimeSpend() + product.getPrice()
pushwoosh.setTags([
"last_purchase_date": lastPurchaseDate,
"lifetime_spend": lifetimeSpend
])
}
}

Rich Media

Anchor link to

Rich media — это интерактивный и мультимедийный контент, такой как изображения, видео или HTML, используемый в уведомлениях и In-App сообщениях для повышения вовлеченности пользователей.

import PushwooshFramework
class ViewController: UIViewController, PWRichMediaPresentingDelegate {
override func viewDidLoad() {
super.viewDidLoad()
let richMediaConfiguration = PWModalWindowConfiguration.shared()
PWRichMediaManager.shared().delegate = self
richMediaConfiguration.configureModalWindow(with: .PWModalWindowPositionBottom,
present: .PWAnimationPresentFromBottom,
dismiss: .PWAnimationDismissDown)
}
func richMediaManager(_ richMediaManager: PWRichMediaManager!, shouldPresent richMedia: PWRichMedia!) -> Bool {
print("Rich media will be presented with: \(richMedia.pushPayload!)")
return true
}
func richMediaManager(_ richMediaManager: PWRichMediaManager!, didPresent richMedia: PWRichMedia!) {
print("Rich media has been presented with: \(richMedia.pushPayload!)")
}
func richMediaManager(_ richMediaManager: PWRichMediaManager!, didClose richMedia: PWRichMedia!) {
print("Rich media has been closed with: \(richMedia.pushPayload!)")
}
func richMediaManager(_ richMediaManager: PWRichMediaManager!, presentingDidFailFor richMedia: PWRichMedia!, withError error: (any Error)!) {
print("Failed to present rich media with: \(richMedia.pushPayload!). Error: \(error.localizedDescription)")
}
}

Устранение неполадок

Anchor link to

Не удалось собрать модуль ‘PushwooshFramework’

Anchor link to

При сборке проекта вы можете столкнуться с ошибкой, похожей на эту:

Failed to build module 'PushwooshFramework'; this SDK is not supported by the compiler
(the SDK is built with 'Apple Swift version 5.10 (swiftlang-5.10.0.13 clang-1500.3.9.4)',
while this compiler is 'Apple Swift version 6.1.2 effective-5.10 (swiftlang-6.1.2.1.2 clang-1700.0.13.5)')

Причина: Эта ошибка не связана с несовместимостью версий компилятора Swift. Начиная с версии Pushwoosh iOS SDK 6.8.0, SDK разделен на несколько взаимодействующих компонентов. Ошибка возникает, когда в ваш проект добавлены не все необходимые фреймворки.

Решение: Убедитесь, что при интеграции через Swift Package Manager в таргет вашего приложения добавлены все четыре необходимых фреймворка:

  • PushwooshFramework
  • PushwooshCore
  • PushwooshBridge
  • PushwooshLiveActivities

Чтобы проверить это в Xcode:

  1. Выберите ваш проект в Project Navigator
  2. Выберите таргет вашего приложения
  3. Перейдите в General > Frameworks, Libraries, and Embedded Content
  4. Убедитесь, что в списке присутствуют все четыре фреймворка

Если у вас возникнут какие-либо проблемы в процессе интеграции, обратитесь к разделу поддержки и сообщества.