# إرسال بيانات مخصصة

سيساعدك هذا الدليل على فهم أفضل لكيفية تمرير البيانات المخصصة إلى تطبيقاتك في حمولة الإشعار الفوري حتى يتمكن تطبيقك من التفاعل مع هذه الإشعارات وتنفيذ إجراءات مختلفة وفقًا لذلك.

يمكن أن تختلف طرق تعاملك مع البيانات المخصصة وفقًا لأهداف عملك. في هذا المقال، سنعرض بعض الأمثلة الأساسية لتحليل البيانات المخصصة وتنفيذ إجراءات بسيطة:

* تغيير لون خلفية التطبيق؛
* فتح صفحة مخصصة في تطبيقك.

## المتطلبات الأساسية

يغطي هذا الدليل تطوير iOS الأصلي (Native). يُفترض أن لديك تطبيق iOS نموذجي تم تكوينه ويستقبل الإشعارات الفورية وفقًا لـ [دليل البدء السريع لـ iOS](/ar/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/quick-start/).

في `AppDelegate` في دالة `didFinishLaunchingWithOptions`، سنستخدم `self.viewController` كمفوض لمعالجة الإشعارات الفورية:

```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` التي تتعامل مع الإشعارات الفورية المستلمة:

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

## فتح ViewController آخر وتغيير لون الخلفية

الآن نحن نحصل على `customData` من حمولة الإشعار. على سبيل المثال، دعنا نغير لون خلفية العرض ونسبة الخصم. نفترض أن البيانات المخصصة ستحتوي على العناصر `“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**. في نموذج محتوى الإشعار الذي يفتح، أدخل أي نص للإشعار الفوري.

<img src="/messaging-channels-using-custom-data-1.webp" alt="نموذج إنشاء إشعار فوري في لوحة تحكم Pushwoosh مع حقل نصي ومفتاح تبديل للبيانات المخصصة"/>

ثم قم بتفعيل `Send custom data`. أدخل JSON في حقل البيانات المخصصة.

بما أننا قررنا أن يكون تنسيق بياناتنا المخصصة كائن 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="حقل البيانات المخصصة في نموذج الإشعار الفوري يعرض كائن JSON بقيم ألوان RGB ومعامل الخصم"/>

عند النقر على الإشعار الفوري، يفتح `CustomPageViewController`، ويتم تعيين لون الخلفية، ويتم تطبيق الخصم:

<img src="/messaging-channels-using-custom-data-3.webp" alt="عرض وحدة تحكم الصفحة المخصصة مع لون الخلفية ونسبة الخصم المطبقة من بيانات الإشعار الفوري المخصصة"/>

كود 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 لحمولة الإشعار الفوري. بما أن حمولات الإشعارات الفورية محدودة الحجم، فمن الأفضل استخدام أسماء قصيرة للمعاملات.

```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) مختلفة اعتمادًا على المعاملات التي تمررها في حمولة الإشعار الفوري.

## فتح وحدة تحكم اختبار A/B

دعنا ننظر في حالة استخدام أخرى للبيانات المخصصة في إشعار فوري. على سبيل المثال، نحتاج إلى فتح وحدة تحكم عرض واحدة لشريحة مستخدمين ووحدة تحكم عرض أخرى لشريحة مستخدمين مختلفة. ببساطة، يمكننا استخدام البيانات المخصصة لاختبار A/B في تطبيقك.

دعنا ننشئ وحدتي تحكم عرض. ستفتح وحدة التحكم الأولى (A) بقيمة خصم، وستفتح وحدة التحكم الثانية (B) بمعامل خصم مختلف.

الآن دعنا نكتب الكود الذي سيفتح وحدة تحكم العرض المناسبة بناءً على حمولة الإشعار الفوري:

```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 الخاص بك إلى حقل البيانات المخصصة.
```
{
  "vc": "A"
}

// Choose your Custom Data (A or B)

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

اعتمادًا على البيانات المخصصة التي أرسلتها في حمولة الإشعار، إما `'vc': 'A'` أو `'vc': 'B'`، ستفتح شريحة من المستخدمين وحدة تحكم واحدة، بينما ستفتح شريحة أخرى من المستخدمين وحدة تحكم مختلفة.

#### وحدة التحكم "A"

<img src="/messaging-channels-using-custom-data-4.webp" alt="وحدة التحكم A تعرض قيمة الخصم لشريحة اختبار A/B"/>

#### وحدة التحكم "B"

<img src="/messaging-channels-using-custom-data-5.webp" alt="وحدة التحكم B تعرض قيمة خصم مختلفة لشريحة اختبار A/B"/>

## تغيير أيقونة التطبيق عبر الإشعار الفوري

مثال آخر على كيفية استخدام الإشعارات الفورية في iOS هو تغيير أيقونة التطبيق.

أولاً، دعنا نضيف ثلاث أيقونات مختلفة إلى الأصول (assets). ستُستخدم واحدة كأيقونة التطبيق الافتراضية، بينما ستتغير الأيقونتان الأخريان بناءً على البيانات المخصصة في الإشعار الفوري.

<img src="/messaging-channels-using-custom-data-6.webp" alt="كتالوج الأصول في 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)`، يمكنك إضافة الكود لتغيير أيقونة التطبيق بناءً على البيانات المخصصة المستلمة في الإشعار الفوري. إليك كيفية تنفيذ ذلك:

```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!")
        }
    }
}
```
أضف كود JSON:
```
{
  "i": "AppIcon-2"
}
```

<img src="/messaging-channels-using-custom-data-7.webp" alt="حقل البيانات المخصصة في نموذج الإشعار الفوري مع كائن JSON يحدد اسم أيقونة التطبيق البديلة"/>

عند النقر على الإشعار الفوري، سيطالبك النظام بتغيير أيقونة التطبيق على الجهاز.

<img src="/messaging-channels-using-custom-data-8.webp" alt="مربع حوار مطالبة نظام iOS يطلب إذن المستخدم لتغيير أيقونة التطبيق على الجهاز"/>

يمكنك العثور على المشروع الذي يستخدم البيانات المخصصة على [GitHub](https://github.com/Pushwoosh/pushwoosh-quickstart-ios/tree/main/customdata/newdemo).