Отправка пользовательских данных
Это руководство поможет вам лучше понять, как передавать Custom data в ваши приложения в полезной нагрузке push-уведомления, чтобы ваше приложение могло реагировать на такие push-уведомления и выполнять соответствующие действия.
Способы обработки Custom data могут варьироваться в зависимости от ваших бизнес-целей. В этой статье мы покажем несколько базовых примеров разбора Custom data и выполнения простых действий:
- изменение цвета фона приложения;
- открытие пользовательской страницы в вашем приложении.
Предварительные требования
Section titled “Предварительные требования”Это руководство посвящено нативной 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 и изменение цвета фона
Section titled “Открытие другого ViewController и изменение цвета фона”Теперь мы получаем customData из полезной нагрузки push-уведомления. Например, давайте изменим цвет фона представления и процент скидки. Мы предполагаем, что Custom data будут содержать элементы “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) } }}Давайте протестируем наш пример. Перейдите в Wavesend Journey и добавьте элемент Push на холст. Затем нажмите Создать новый контент. В открывшейся форме контента Push введите любой текст push-уведомления.

Затем включите переключатель Отправить Custom data. Вставьте JSON в поле Custom data.
Поскольку мы решили, что наш формат Custom data будет объектом JSON со значениями “r”, “g”, “b”, нам нужно использовать поле “Custom data” в Control Panel и заполнить его объектом 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-тестирования
Section titled “Открытие ViewController для A/B-тестирования”Рассмотрим еще один пример использования Custom data в push-уведомлении. Например, нам нужно открыть один ViewController для одного сегмента пользователей и другой ViewController для другого сегмента. Проще говоря, вы можете использовать Custom data для 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"}В зависимости от Custom data, которые вы отправили в полезной нагрузке push-уведомления, — 'vc': 'A' или 'vc': 'B', — один Segment пользователей откроет один контроллер, а другой Segment — другой.
ViewController «A»
Section titled “ViewController «A»”
ViewController «B»
Section titled “ViewController «B»”
Изменение иконки приложения через push-уведомление
Section titled “Изменение иконки приложения через push-уведомление”Еще один пример того, как мы можем использовать push-уведомления в iOS, — это изменение иконки приложения.
Сначала давайте добавим три разные иконки в assets. Одна будет использоваться как иконка приложения по умолчанию, а две другие будут меняться в зависимости от Custom data в 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) вы можете добавить код для изменения иконки приложения на основе Custom data, полученных в 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-уведомление система предложит вам изменить иконку приложения на устройстве.

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