Отправка пользовательских данных
Это руководство поможет вам лучше понять, как передавать пользовательские данные в ваши приложения через 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-уведомления.

Затем включите переключатель 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}Вы можете написать код для инициализации и открытия различных 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 «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: - Динамическое изменение иконки приложения 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.