# Benutzerdefinierte Daten senden

Diese Anleitung hilft Ihnen, besser zu verstehen, wie Sie benutzerdefinierte Daten in der Push-Benachrichtigungs-Payload an Ihre Apps übergeben können, damit Ihre App auf solche Pushes reagieren und entsprechend verschiedene Aktionen ausführen kann.

Die Art und Weise, wie Sie benutzerdefinierte Daten handhaben, kann je nach Ihren Geschäftszielen variieren. In diesem Artikel zeigen wir einige grundlegende Beispiele für das Parsen von benutzerdefinierten Daten und die Durchführung einfacher Aktionen:

* Ändern der Hintergrundfarbe der App;
* Öffnen einer benutzerdefinierten Seite in Ihrer App.

## Voraussetzungen

Diese Anleitung behandelt die native iOS-Entwicklung. Es wird davon ausgegangen, dass Sie eine iOS-Beispielanwendung konfiguriert haben und Push-Benachrichtigungen gemäß der [Anleitung für die ersten Schritte mit iOS](/de/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/quick-start/) erhalten.

In `AppDelegate` in der Funktion `didFinishLaunchingWithOptions` werden wir `self.viewController` als Delegat für die Verarbeitung von Push-Benachrichtigungen verwenden:

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

Unser `ViewController` implementiert das `PWMessagingDelegate`-Protokoll:

```swift
extension ViewController: PWMessagingDelegate
```

Und hat daher die Funktion `onMessageOpened`, die empfangene Push-Benachrichtigungen verarbeitet:

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

## Einen anderen ViewController öffnen und die Hintergrundfarbe ändern

Jetzt erhalten wir `customData` aus der Push-Payload. Lassen Sie uns zum Beispiel die Hintergrundfarbe der Ansicht und den Rabattprozentsatz ändern. Wir gehen davon aus, dass die benutzerdefinierten Daten die Elemente `„r“`, `„g“`, `„b“` und `„d“` im JSON-Objektformat wie folgt enthalten werden:

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

Wir werden die folgende Funktion verwenden, um einen neuen ViewController zu öffnen und die Hintergrundfarbe sowie den Rabattprozentsatz festzulegen:

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

Testen wir unser Beispiel. Navigieren Sie zu Pushwoosh Journey und fügen Sie ein **Push-Element** zur Leinwand hinzu. Klicken Sie als Nächstes auf **Neuen Inhalt erstellen**. Geben Sie im sich öffnenden Formular für den Push-Inhalt einen beliebigen Text für die Push-Benachrichtigung ein.

<img src="/messaging-channels-using-custom-data-1.webp" alt="Formular zur Erstellung von Push-Benachrichtigungen im Pushwoosh Control Panel mit Textfeld und Schalter für benutzerdefinierte Daten"/>

Aktivieren Sie dann den Schalter `Benutzerdefinierte Daten senden`. Fügen Sie das JSON in das Feld für benutzerdefinierte Daten ein.

Da wir uns entschieden haben, dass unser benutzerdefiniertes Datenformat ein JSON-Objekt mit den Werten `„r“`, `„g“`, `„b“` sein wird, müssen wir das Feld `„Benutzerdefinierte Daten“` im Control Panel verwenden und es mit dem JSON-Objekt `{"r":"30", "g":"144", "b":"255", "d":"25"}` füllen:

<img src="/messaging-channels-using-custom-data-2.webp" alt="Feld für benutzerdefinierte Daten im Push-Benachrichtigungsformular, das ein JSON-Objekt mit RGB-Farbwerten und Rabattparameter anzeigt"/>

Nach dem Tippen auf die Push-Benachrichtigung öffnet sich der `CustomPageViewController`, die Hintergrundfarbe wird festgelegt und der Rabatt wird angewendet:

<img src="/messaging-channels-using-custom-data-3.webp" alt="Benutzerdefinierte Seitenansicht des View Controllers, die mit Hintergrundfarbe und Rabattprozentsatz aus den benutzerdefinierten Daten der Push-Benachrichtigung angewendet wird"/>

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

Wir gehen davon aus, dass der Rabattwert als Parameter `„d“` im JSON der Push-Benachrichtigungs-Payload übergeben wird. Da die Payloads von Push-Benachrichtigungen in ihrer Größe begrenzt sind, sollten Sie eher kurze Namen für die Parameter verwenden.

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

Sie können Code schreiben, um verschiedene View Controllers zu initialisieren und zu öffnen, abhängig von den Parametern, die Sie in der Push-Benachrichtigungs-Payload übergeben.

## Öffnen des A/B-Testing View Controllers

Betrachten wir einen weiteren Anwendungsfall für benutzerdefinierte Daten in einer Push-Benachrichtigung. Zum Beispiel müssen wir einen View Controller für ein Benutzersegment und einen anderen View Controller für ein anderes Benutzersegment öffnen. Einfach ausgedrückt, können wir benutzerdefinierte Daten für A/B-Tests in Ihrer Anwendung verwenden.

Erstellen wir zwei View Controllers. Ein Controller (A) wird mit einem Rabattwert geöffnet, und der zweite Controller (B) wird mit einem anderen Rabattparameter geöffnet.

Schreiben wir nun den Code, der den entsprechenden View Controller basierend auf der Push-Benachrichtigungs-Payload öffnet:

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

Fügen Sie Ihr JSON in das Feld für benutzerdefinierte Daten ein.

```
{
  "vc": "A"
}

// Wählen Sie Ihre benutzerdefinierten Daten (A oder B)

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

Abhängig von den benutzerdefinierten Daten, die Sie in der Push-Payload gesendet haben, entweder `'vc': 'A'` oder `'vc': 'B'`, wird ein Segment von Benutzern einen Controller öffnen, während ein anderes Segment von Benutzern einen anderen Controller öffnet.

#### View Controller „A“

<img src="/messaging-channels-using-custom-data-4.webp" alt="View Controller A, der den Rabattwert für das A/B-Testsegment anzeigt"/>

#### View Controller „B“

<img src="/messaging-channels-using-custom-data-5.webp" alt="View Controller B, der einen anderen Rabattwert für das A/B-Testsegment anzeigt"/>

## Ändern des App-Symbols per Push-Benachrichtigung

Ein weiteres Beispiel, wie wir Push-Benachrichtigungen in iOS verwenden können, ist das Ändern des App-Symbols.

Fügen wir zunächst drei verschiedene Symbole zu den Assets hinzu. Eines wird als Standard-App-Symbol verwendet, während die anderen beiden sich basierend auf den benutzerdefinierten Daten in der Push-Benachrichtigung ändern.

<img src="/messaging-channels-using-custom-data-6.webp" alt="Xcode-Asset-Katalog, der drei verschiedene App-Symbole für den dynamischen Symbolwechsel anzeigt"/>

Um alternative App-Symbole in Ihrer iOS-Anwendung zu aktivieren, müssen Sie die erforderliche Konfiguration in der Datei `Info.plist` hinzufügen. Hier sind die Schritte dazu:

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

Im Callback `pushwoosh(_ pushwoosh: Pushwoosh, onMessageOpened message: PWMessage)` können Sie den Code hinzufügen, um das App-Symbol basierend auf den in der Push-Benachrichtigung empfangenen benutzerdefinierten Daten zu ändern. So können Sie dies implementieren:

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

Fügen Sie den JSON-Code hinzu:

```
{
  "i": "AppIcon-2"
}
```

<img src="/messaging-channels-using-custom-data-7.webp" alt="Feld für benutzerdefinierte Daten im Push-Benachrichtigungsformular mit JSON-Objekt, das den Namen des alternativen App-Symbols angibt"/>

Wenn Sie auf die Push-Benachrichtigung tippen, fordert das System Sie auf, das App-Symbol auf dem Gerät zu ändern.

<img src="/messaging-channels-using-custom-data-8.webp" alt="Systemdialog von iOS, der den Benutzer um Erlaubnis bittet, das App-Symbol auf dem Gerät zu ändern"/>

Sie finden das Projekt, das benutzerdefinierte Daten verwendet, auf [GitHub](https://github.com/Pushwoosh/pushwoosh-quickstart-ios/tree/main/customdata/newdemo).