# Envoyer des données personnalisées

Ce guide vous aidera à mieux comprendre comment transmettre des données personnalisées à vos applications dans la charge utile des notifications push afin que votre application puisse réagir à ces notifications et effectuer diverses actions en conséquence.

Les manières de gérer les données personnalisées peuvent varier en fonction de vos objectifs commerciaux. Dans cet article, nous montrerons quelques exemples de base d'analyse de données personnalisées et d'exécution d'actions simples :

* changer la couleur de fond de l'application ;
* ouvrir une page personnalisée dans votre application.


## Prérequis

Ce guide couvre le développement natif iOS. Il est supposé que vous disposez d'une application iOS d'exemple configurée et recevant des notifications push conformément au [guide de démarrage iOS](/fr/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/quick-start/).

Dans `AppDelegate`, dans la fonction `didFinishLaunchingWithOptions`, nous utiliserons `self.viewController` comme délégué pour le traitement des notifications 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
}
```

Notre `ViewController` implémente le protocole `PWMessagingDelegate` :


```swift
extension ViewController: PWMessagingDelegate
```

Et a donc la fonction `onMessageOpened` qui gère les notifications push reçues :


```swift
// User pressed on the push notification
func pushwoosh(_ pushwoosh: Pushwoosh, onMessageOpened message: PWMessage) {}
```

## Ouvrir un autre ViewController et changer la couleur de fond

Maintenant, nous récupérons `customData` depuis la charge utile du push. Par exemple, changeons la couleur de fond de la vue et le pourcentage de réduction. Nous supposons que les données personnalisées contiendront les éléments `« r »`, `« g »`, `« b »` et `« d »` au format d'objet JSON comme suit :

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

Nous utiliserons la fonction suivante pour ouvrir un nouveau ViewController et définir la couleur de fond ainsi que le pourcentage de réduction :

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

Testons notre exemple. Accédez à Pushwoosh Journey et ajoutez un **élément Push** au canevas. Ensuite, cliquez sur **Créer un nouveau contenu**. Dans le formulaire de contenu Push qui s'ouvre, saisissez n'importe quel texte de notification push.

<img src="/messaging-channels-using-custom-data-1.webp" alt="Formulaire de création de notification push dans le Panneau de Contrôle Pushwoosh avec champ de texte et bascule pour les données personnalisées"/>

Ensuite, activez l'option `Send custom data`. Insérez le JSON dans le champ Custom data.

Comme nous avons décidé que notre format de données personnalisées serait un objet JSON avec les valeurs `« r »`, `« g »`, `« b »`, nous devons utiliser le champ `« custom data »` dans le Panneau de Contrôle et le remplir avec l'objet JSON `{"r":"30", "g":"144", "b":"255", "d":"25"}` :


<img src="/messaging-channels-using-custom-data-2.webp" alt="Champ de données personnalisées dans le formulaire de notification push montrant un objet JSON avec des valeurs de couleur RVB et un paramètre de réduction"/>

En appuyant sur la notification push, le `CustomPageViewController` s'ouvre, la couleur de fond est définie et la réduction est appliquée :

<img src="/messaging-channels-using-custom-data-3.webp" alt="ViewController de page personnalisée affiché avec la couleur de fond et le pourcentage de réduction appliqués à partir des données personnalisées de la notification push"/>

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

Nous supposons que la valeur de la réduction viendra en tant que paramètre `« d »` dans le JSON de la charge utile de la notification push. Comme les charges utiles des notifications push sont de taille limitée, il est préférable d'utiliser des noms courts pour les paramètres.

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

Vous pouvez écrire du code pour initialiser et ouvrir différents View Controllers en fonction des paramètres que vous passez dans la charge utile de la notification push.


## Ouvrir le view controller de test A/B

Considérons un autre cas d'utilisation des données personnalisées dans une notification push. Par exemple, nous devons ouvrir un view controller pour un segment d'utilisateurs et un autre view controller pour un segment d'utilisateurs différent. Autrement dit, nous pouvons utiliser les données personnalisées pour des tests A/B dans votre application.

Créons deux view controllers. Un contrôleur (A) s'ouvrira avec une valeur de réduction, et le second contrôleur (B) s'ouvrira avec un paramètre de réduction différent.

Maintenant, écrivons le code qui ouvrira le view controller approprié en fonction de la charge utile de la notification 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)
        }
    }
}
```
Ajoutez votre JSON au champ Custom data.
```
{
  "vc": "A"
}

// Choose your Custom Data (A or B)

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

Selon les données personnalisées que vous avez envoyées dans la charge utile du push, soit `'vc': 'A'` soit `'vc': 'B'`, un segment d'utilisateurs ouvrira un contrôleur, tandis qu'un autre segment d'utilisateurs ouvrira un contrôleur différent.

#### View Controller « A »

<img src="/messaging-channels-using-custom-data-4.webp" alt="View Controller A affichant la valeur de la réduction pour le segment de test A/B"/>

#### View Controller « B »

<img src="/messaging-channels-using-custom-data-5.webp" alt="View Controller B affichant une valeur de réduction différente pour le segment de test A/B"/>

## Changer l'icône de l'application via une notification push

Un autre exemple de la manière dont nous pouvons utiliser les notifications push dans iOS est de changer l'icône de l'application.

Tout d'abord, ajoutons trois icônes différentes aux assets. L'une sera utilisée comme icône par défaut de l'application, tandis que les deux autres changeront en fonction des données personnalisées de la notification push.

<img src="/messaging-channels-using-custom-data-6.webp" alt="Catalogue d'assets Xcode montrant trois icônes d'application différentes pour le changement d'icône dynamique"/>

Pour activer les icônes d'application alternatives dans votre application iOS, vous devez ajouter la configuration nécessaire dans le fichier `Info.plist`. Voici les étapes pour le faire :

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

Dans le rappel `pushwoosh(_ pushwoosh: Pushwoosh, onMessageOpened message: PWMessage)`, vous pouvez ajouter le code pour changer l'icône de l'application en fonction des données personnalisées reçues dans la notification push. Voici comment vous pouvez l'implémenter :

```swift
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!")
        }
    }
}
```
Ajoutez le code JSON :
```
{
  "i": "AppIcon-2"
}
```

<img src="/messaging-channels-using-custom-data-7.webp" alt="Champ de données personnalisées dans le formulaire de notification push avec un objet JSON spécifiant le nom de l'icône d'application alternative"/>

En appuyant sur la notification push, le système vous demandera de changer l'icône de l'application sur l'appareil.

<img src="/messaging-channels-using-custom-data-8.webp" alt="Boîte de dialogue du système iOS demandant à l'utilisateur la permission de changer l'icône de l'application sur l'appareil"/>


Vous pouvez trouver le projet utilisant les données personnalisées sur [GitHub](https://github.com/Pushwoosh/pushwoosh-quickstart-ios/tree/main/customdata/newdemo).