Отправка пользовательских данных
Это руководство поможет вам лучше понять, как передавать пользовательские данные в ваши приложения в полезной нагрузке 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-уведомления:
// User pressed on the push notificationfunc 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-уведомления введите любой текст.

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

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

Код 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}
Вы можете написать код для инициализации и открытия разных ViewController в зависимости от параметров, которые вы передаете в полезной нагрузке push-уведомления.
Открытие ViewController для A/B-тестирования
Anchor link toРассмотрим еще один вариант использования пользовательских данных в push-уведомлении. Например, нам нужно открыть один ViewController для одного сегмента пользователей и другой ViewController для другого сегмента. Проще говоря, мы можем использовать пользовательские данные для A/B-тестирования в вашем приложении.
Давайте создадим два ViewController. Один контроллер (A) будет открываться со значением скидки, а второй контроллер (B) — с другим параметром скидки.
Теперь напишем код, который будет открывать соответствующий ViewController на основе полезной нагрузки 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"}
// Choose your Custom Data (A or B)
{ "vc": "B"}
В зависимости от пользовательских данных, отправленных в полезной нагрузке push-уведомления ('vc': 'A'
или 'vc': 'B'
), один сегмент пользователей откроет один контроллер, а другой сегмент — другой.
ViewController «A»
Anchor link to
ViewController «B»
Anchor link to
Изменение иконки приложения через push-уведомление
Anchor link toЕще один пример того, как мы можем использовать push-уведомления в iOS, — это изменение иконки приложения.
Сначала давайте добавим три разные иконки в assets. Одна будет использоваться как иконка приложения по умолчанию, а две другие будут меняться в зависимости от пользовательских данных в push-уведомлении.

Чтобы включить альтернативные иконки приложений в вашем 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: - Change the app icon dynamically 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-уведомление система предложит вам изменить иконку приложения на устройстве.

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