# Enviar datos personalizados

Esta guía le ayudará a comprender mejor cómo pasar datos personalizados a sus aplicaciones en la carga útil de la notificación push para que su aplicación pueda reaccionar a dichos pushes y realizar diversas acciones en consecuencia.

Las formas en que maneja los datos personalizados pueden variar según sus objetivos comerciales. En este artículo mostraremos algunos ejemplos básicos de análisis de datos personalizados y realización de acciones simples:

* cambiar el color de fondo de la aplicación;
* abrir una página personalizada en su aplicación.


## Prerrequisitos

Esta guía cubre el desarrollo nativo de iOS. Se asume que tiene una aplicación de ejemplo de iOS configurada y que recibe notificaciones push según la [guía de inicio de iOS](/es/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/quick-start/).

En `AppDelegate`, en la función `didFinishLaunchingWithOptions`, usaremos `self.viewController` como delegado para el procesamiento de notificaciones 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
}
```

Nuestro `ViewController` implementa el protocolo `PWMessagingDelegate`:


```swift
extension ViewController: PWMessagingDelegate
```

Y por lo tanto tiene la función `onMessageOpened` que maneja las notificaciones push recibidas:


```swift
// El usuario presionó la notificación push
func pushwoosh(_ pushwoosh: Pushwoosh, onMessageOpened message: PWMessage) {}
```

## Abrir otro ViewController y cambiar el color de fondo

Ahora estamos obteniendo `customData` de la carga útil del push. Por ejemplo, cambiemos el color de fondo de la vista y el porcentaje de descuento. Asumimos que los datos personalizados contendrán los elementos `“r”`, `“g”`, `“b”` y `"d"` en formato de objeto JSON de la siguiente manera:

```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)
```

Usaremos la siguiente función para abrir un nuevo ViewController y establecer el color de fondo y el porcentaje de descuento:

```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)
        }
    }
}
```

Probemos nuestro ejemplo. Navegue a Pushwoosh Journey y agregue un **elemento Push** al lienzo. A continuación, haga clic en **Crear nuevo contenido**. En el formulario de contenido Push que se abre, ingrese cualquier texto de notificación push.

<img src="/messaging-channels-using-custom-data-1.webp" alt="Formulario de creación de notificaciones push en el Panel de Control de Pushwoosh con campo de texto y conmutador de datos personalizados"/>

Luego, active `Enviar datos personalizados`. Inserte el JSON en el campo de datos personalizados.

Como hemos decidido que nuestro formato de datos personalizados sería un objeto JSON con los valores `“r”`, `“g”`, `“b”` en él, necesitamos usar el campo `“datos personalizados”` en el Panel de Control y llenarlo con el objeto JSON `{"r":"30", "g":"144", "b":"255", "d":"25"}`:


<img src="/messaging-channels-using-custom-data-2.webp" alt="Campo de datos personalizados en el formulario de notificación push que muestra un objeto JSON con valores de color RGB y parámetro de descuento"/>

Al tocar la notificación push, se abre el `CustomPageViewController`, se establece el color de fondo y se aplica el descuento:

<img src="/messaging-channels-using-custom-data-3.webp" alt="ViewController de página personalizada que se muestra con el color de fondo y el porcentaje de descuento aplicados desde los datos personalizados de la notificación push"/>

Código de 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)
    }
}
```

Asumimos que el valor del descuento vendrá como parámetro `"d"` en el JSON de la carga útil de la notificación push. Como las cargas útiles de las notificaciones push tienen un tamaño limitado, es preferible usar nombres cortos para los parámetros.

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

Puede escribir código para inicializar y abrir diferentes ViewControllers dependiendo de los parámetros que pase en la carga útil de la notificación push.


## Abrir el ViewController de pruebas A/B

Consideremos otro caso de uso para datos personalizados en una notificación push. Por ejemplo, necesitamos abrir un ViewController para un segmento de usuarios y otro ViewController para un segmento de usuarios diferente. En pocas palabras, podemos usar datos personalizados para pruebas A/B en su aplicación.

Creemos dos ViewControllers. Un controlador (A) se abrirá con un valor de descuento, y el segundo controlador (B) se abrirá con un parámetro de descuento diferente.

Ahora escribamos el código que abrirá el ViewController apropiado según la carga útil de la notificación push:

```swift
func pushwoosh(_ pushwoosh: Pushwoosh, onMessageOpened message: PWMessage) {
    // MARK: - Pruebas A/B a través de datos personalizados
    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)
        }
    }
}
```
Agregue su JSON al campo de datos personalizados.
```
{
  "vc": "A"
}

// Elija sus datos personalizados (A o B)

{
  "vc": "B"
}
```

Dependiendo de los datos personalizados que envió en la carga útil del push, ya sea `'vc': 'A'` o `'vc': 'B'`, un segmento de usuarios abrirá un controlador, mientras que otro segmento de usuarios abrirá un controlador diferente.

#### ViewController "A"

<img src="/messaging-channels-using-custom-data-4.webp" alt="ViewController A mostrando el valor de descuento para el segmento de prueba A/B"/>

#### ViewController "B"

<img src="/messaging-channels-using-custom-data-5.webp" alt="ViewController B mostrando un valor de descuento diferente para el segmento de prueba A/B"/>

## Cambiar el icono de la aplicación a través de una notificación push

Otro ejemplo de cómo podemos usar las notificaciones push en iOS es para cambiar el icono de la aplicación.

Primero, agreguemos tres iconos diferentes a los assets. Uno se usará como el icono predeterminado de la aplicación, mientras que los otros dos cambiarán según los datos personalizados en la notificación push.

<img src="/messaging-channels-using-custom-data-6.webp" alt="Catálogo de assets de Xcode que muestra tres iconos de aplicación diferentes para el cambio dinámico de iconos"/>

Para habilitar iconos de aplicación alternativos en su aplicación de iOS, debe agregar la configuración necesaria en el archivo `Info.plist`. Aquí están los pasos para hacerlo:

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

En el callback `pushwoosh(_ pushwoosh: Pushwoosh, onMessageOpened message: PWMessage)`, puede agregar el código para cambiar el icono de la aplicación según los datos personalizados recibidos en la notificación push. Así es como puede implementarlo:

```swift
func pushwoosh(_ pushwoosh: Pushwoosh, onMessageOpened message: PWMessage) {
    // MARK: - Cambiar el icono de la aplicación dinámicamente
    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!")
        }
    }
}
```
Agregue el código JSON:
```
{
  "i": "AppIcon-2"
}
```

<img src="/messaging-channels-using-custom-data-7.webp" alt="Campo de datos personalizados en el formulario de notificación push con objeto JSON que especifica el nombre del icono de la aplicación alternativo"/>

Al tocar la notificación push, el sistema le pedirá que cambie el icono de la aplicación en el dispositivo.

<img src="/messaging-channels-using-custom-data-8.webp" alt="Diálogo de aviso del sistema iOS pidiendo permiso al usuario para cambiar el icono de la aplicación en el dispositivo"/>


Puede encontrar el proyecto que utiliza datos personalizados en [GitHub](https://github.com/Pushwoosh/pushwoosh-quickstart-ios/tree/main/customdata/newdemo).