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

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

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

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


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

Это руководство посвящено нативной разработке под iOS. Предполагается, что у вас есть пример приложения для iOS, настроенного на получение push-уведомлений в соответствии с [руководством по началу работы с iOS](/ru/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/quick-start/).

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



```swift
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`:


```swift
extension ViewController: PWMessagingDelegate
```

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


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

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

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

```swift
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 и установки цвета фона и процента скидки:

```swift
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-уведомления.

<img src="/messaging-channels-using-custom-data-1.webp" alt="Форма создания push-уведомления в панели управления Pushwoosh с текстовым полем и переключателем пользовательских данных"/>

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

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


<img src="/messaging-channels-using-custom-data-2.webp" alt="Поле пользовательских данных в форме push-уведомления, показывающее объект JSON со значениями цвета RGB и параметром скидки"/>

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

<img src="/messaging-channels-using-custom-data-3.webp" alt="Отображение CustomPageViewController с цветом фона и процентом скидки, примененными из пользовательских данных push-уведомления"/>

Код CustomPageViewController:

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

```swift
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-тестирования

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

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

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

```swift
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»

<img src="/messaging-channels-using-custom-data-4.webp" alt="View Controller A, отображающий значение скидки для сегмента A/B-тестирования"/>

#### View Controller «B»

<img src="/messaging-channels-using-custom-data-5.webp" alt="View Controller B, отображающий другое значение скидки для сегмента A/B-тестирования"/>

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

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

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

<img src="/messaging-channels-using-custom-data-6.webp" alt="Каталог assets в Xcode, показывающий три разные иконки приложения для динамического переключения"/>

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

```xml
<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-уведомлении. Вот как это можно реализовать:

```swift
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"
}
```

<img src="/messaging-channels-using-custom-data-7.webp" alt="Поле пользовательских данных в форме push-уведомления с объектом JSON, указывающим имя альтернативной иконки приложения"/>

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

<img src="/messaging-channels-using-custom-data-8.webp" alt="Системное диалоговое окно iOS, запрашивающее у пользователя разрешение на изменение иконки приложения на устройстве"/>


Вы можете найти проект, использующий пользовательские данные, на [GitHub](https://github.com/Pushwoosh/pushwoosh-quickstart-ios/tree/main/customdata/newdemo).