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

Отправка пользовательских данных

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

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

  • изменение цвета фона приложения;
  • открытие пользовательской страницы в вашем приложении.

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

Anchor link to

Это руководство посвящено нативной разработке под iOS. Предполагается, что у вас есть пример приложения для iOS, настроенного на получение push-уведомлений в соответствии с руководством по началу работы с iOS.

В AppDelegate в функции didFinishLaunchingWithOptions мы будем использовать self.viewController в качестве делегата для обработки push-уведомлений:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
Pushwoosh.sharedInstance().delegate = self.viewController
Pushwoosh.sharedInstance().registerForPushNotifications()
if let launchOptions = launchOptions {
Pushwoosh.sharedInstance().handlePushReceived(launchOptions)
}
return true
}

Наш ViewController реализует протокол PWMessagingDelegate:

extension ViewController: PWMessagingDelegate

И, следовательно, имеет функцию onMessageOpened, которая обрабатывает полученные push-уведомления:

// Пользователь нажал на push-уведомление
func pushwoosh(_ pushwoosh: Pushwoosh, onMessageOpened message: PWMessage) {}

Открытие другого ViewController и изменение цвета фона

Anchor link to

Теперь мы получаем customData из данных push-уведомления. Например, давайте изменим цвет фона представления и процент скидки. Мы предполагаем, что пользовательские данные будут содержать элементы «r», «g», «b» и «d» в формате объекта JSON следующим образом:

guard let customDataJson = message.customData,
let redString = customDataJson["r"] as? String,
let greenString = customDataJson["g"] as? String,
let blueString = customDataJson["b"] as? String,
let discount = customDataJson["d"] as? String else {
return
}
setViewBackgroundColor(red: redString, green: greenString, blue: blueString, discount: discount)

Мы будем использовать следующую функцию для открытия нового ViewController и установки цвета фона и процента скидки:

func setViewBackgroundColor(red: String, green: String, blue: String, discount: String) {
let red = CGFloat((red as NSString).floatValue)
let green = CGFloat((green as NSString).floatValue)
let blue = CGFloat((blue as NSString).floatValue)
let color = UIColor(red: red / 255.0, green: green / 255.0, blue: blue / 255.0, alpha: 1)
if let topController = UIApplication.shared.topMostController() {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
if let customViewController = storyboard.instantiateViewController(withIdentifier: "custom_page") as? CustomPageViewController {
customViewController.discount = discount
customViewController.bgColor = color
topController.present(customViewController, animated: true, completion: nil)
}
}
}

Давайте протестируем наш пример. Перейдите в Pushwoosh Journey и добавьте на холст элемент Push. Затем нажмите Create new content. В открывшейся форме контента Push введите любой текст push-уведомления.

Форма создания push-уведомления в панели управления Pushwoosh с текстовым полем и переключателем пользовательских данных

Затем включите переключатель Send custom data. Вставьте JSON в поле Custom data.

Поскольку мы решили, что формат наших пользовательских данных будет объектом JSON со значениями «r», «g», «b», нам нужно использовать поле «custom data» в панели управления и заполнить его объектом JSON {"r":"30", "g":"144", "b":"255", "d":"25"}:

Поле пользовательских данных в форме push-уведомления, показывающее объект JSON со значениями цвета RGB и параметром скидки

При нажатии на push-уведомление открывается CustomPageViewController, устанавливается цвет фона и применяется скидка:

Отображение CustomPageViewController с цветом фона и процентом скидки, примененными из пользовательских данных push-уведомления

Код CustomPageViewController:

class CustomPageViewController: UIViewController {
var bgColor: UIColor?
var discount: String?
@IBOutlet weak var titleLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = self.bgColor
if self.discount != nil {
self.titleLabel?.text = "ONLY TODAY GET \(self.discount!)% DISCOUNT!"
}
}
func showPromoPage(discount: String) {
let vc = CustomPageViewController()
vc.bgColor = self.view.backgroundColor
vc.discount = discount
vc.modalTransitionStyle = UIModalTransitionStyle.crossDissolve
if self.presentedViewController != nil {
self.dismiss(animated: true, completion: {
self.present(vc, animated: true, completion: nil)
})
} else {
self.present(vc, animated: true, completion: nil)
}
}
@IBAction func closeButtonAction(_ sender: Any) {
self.dismiss(animated: true)
}
}

Мы предполагаем, что значение скидки будет передаваться как параметр «d» в JSON данных push-уведомления. Поскольку размер данных push-уведомлений ограничен, лучше использовать короткие имена для параметров.

guard let customDataJson = message.customData,
let redString = customDataJson["r"] as? String,
let greenString = customDataJson["g"] as? String,
let blueString = customDataJson["b"] as? String,
let discount = customDataJson["d"] as? String else {
return
}

Вы можете написать код для инициализации и открытия различных View Controllers в зависимости от параметров, которые вы передаете в данных push-уведомления.

Открытие view controller для A/B-тестирования

Anchor link to

Рассмотрим еще один вариант использования пользовательских данных в push-уведомлении. Например, нам нужно открыть один view controller для одного сегмента пользователей и другой view controller для другого сегмента. Проще говоря, мы можем использовать пользовательские данные для A/B-тестирования в вашем приложении.

Давайте создадим два view controller. Один контроллер (A) откроется со значением скидки, а второй контроллер (B) — с другим параметром скидки.

Теперь напишем код, который будет открывать соответствующий view controller на основе данных push-уведомления:

func pushwoosh(_ pushwoosh: Pushwoosh, onMessageOpened message: PWMessage) {
// MARK: - A/B Testing via Custom Data
guard let customDataJson = message.customData,
let viewController = customDataJson["vc"] as? String else {
return
}
if viewController == "A" {
setControllerA()
} else if viewController == "B" {
setControllerB()
}
}
func setControllerA() {
if let topController = UIApplication.shared.topMostController() {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
if let customViewController = storyboard.instantiateViewController(withIdentifier: "a_vc") as? AViewController {
customViewController.discountA = "50"
topController.present(customViewController, animated: true, completion: nil)
}
}
}
func setControllerB() {
if let topController = UIApplication.shared.topMostController() {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
if let customViewController = storyboard.instantiateViewController(withIdentifier: "b_vc") as? BViewController {
customViewController.discountB = "100"
topController.present(customViewController, animated: true, completion: nil)
}
}
}

Добавьте ваш JSON в поле Custom data.

{
"vc": "A"
}
// Выберите ваши пользовательские данные (A или B)
{
"vc": "B"
}

В зависимости от пользовательских данных, которые вы отправили в push-уведомлении, 'vc': 'A' или 'vc': 'B', один сегмент пользователей откроет один контроллер, а другой сегмент — другой.

View Controller «A»

Anchor link to
View Controller A, отображающий значение скидки для сегмента A/B-тестирования

View Controller «B»

Anchor link to
View Controller B, отображающий другое значение скидки для сегмента A/B-тестирования

Изменение иконки приложения через push-уведомление

Anchor link to

Еще один пример того, как мы можем использовать push-уведомления в iOS, — это изменение иконки приложения.

Сначала давайте добавим три разные иконки в assets. Одна будет использоваться как иконка приложения по умолчанию, а две другие будут меняться в зависимости от пользовательских данных в push-уведомлении.

Каталог assets в Xcode, показывающий три разные иконки приложения для динамического переключения

Чтобы включить альтернативные иконки в вашем iOS-приложении, вам нужно добавить необходимую конфигурацию в файл Info.plist. Вот как это сделать:

<key>CFBundleIcons</key>
<dict>
<key>CFBundleAlternateIcons</key>
<dict>
<key>AppIcon-2</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>Icon-2</string>
</array>
<key>UIPrerenderedIcon</key>
<true/>
</dict>
<key>AppIcon-3</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>Icon-3</string>
</array>
<key>UIPrerenderedIcon</key>
<true/>
</dict>
</dict>
<key>CFBundlePrimaryIcon</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>Icon-1</string>
</array>
<key>UIPrerenderedIcon</key>
<true/>
</dict>
</dict>

В колбэке pushwoosh(_ pushwoosh: Pushwoosh, onMessageOpened message: PWMessage) вы можете добавить код для изменения иконки приложения на основе пользовательских данных, полученных в push-уведомлении. Вот как это можно реализовать:

func pushwoosh(_ pushwoosh: Pushwoosh, onMessageOpened message: PWMessage) {
// MARK: - Динамическое изменение иконки приложения
guard let customDataJson = message.customData,
let appIcon = customDataJson["i"] as? String else {
return
}
UIApplication.shared.setAlternateIconName(appIcon) { error in
if let error = error {
print(error.localizedDescription)
} else {
print("Success!")
}
}
}

Добавьте JSON-код:

{
"i": "AppIcon-2"
}
Поле пользовательских данных в форме push-уведомления с объектом JSON, указывающим имя альтернативной иконки приложения

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

Системное диалоговое окно iOS, запрашивающее у пользователя разрешение на изменение иконки приложения на устройстве

Вы можете найти проект, использующий пользовательские данные, на GitHub.