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

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

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

Затем включите опцию 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.