# تخصيص إشعارات iOS

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

<img src="/ios-push-notifications-ios-push-customization-1.webp" alt=""/>

يدير ملحق تطبيق محتوى الإشعار وحدة تحكم عرض (view controller) تعرض واجهة الإشعار المخصصة الخاصة بك. يمكن لوحدة تحكم العرض هذه أن تكمل أو تحل محل واجهة النظام الافتراضية لإشعاراتك. يمكنك استخدام وحدة تحكم العرض الخاصة بك من أجل:

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

يجب أن يقوم ملحق التطبيق الخاص بك بتكوين وحدة تحكم العرض الخاصة به باستخدام البيانات المتاحة على الفور، مثل محتويات الإشعار والملفات الموجودة في حزمة ملحق التطبيق الخاص بك. إذا كنت تستخدم مجموعة تطبيقات (app group) لمشاركة البيانات بين تطبيقك وملحق التطبيق الخاص بك، فيمكنك أيضًا استخدام أي ملفات موجودة في مجموعة التطبيقات. لضمان تسليم إشعاراتك في الوقت المناسب، قم بتكوين طرق العرض بأسرع ما يمكن. لا تقم بأي مهام طويلة الأمد، مثل محاولة استرداد البيانات عبر الشبكة.

<Aside type="caution">
ملحقات تطبيق محتوى الإشعار مدعومة فقط في تطبيقات iOS.
</Aside>

### إضافة ملحق تطبيق محتوى الإشعار إلى مشروعك

لإضافة ملحق تطبيق محتوى الإشعار إلى تطبيق iOS الخاص بك:

1.  اختر **File** > **New** > **Target** في Xcode.
2.  حدد **Notification Content Extension** من iOS Application Extension.
3.  انقر على **Next**.
4.  قدم **اسمًا** لملحق التطبيق الخاص بك.
5.  انقر على **Finish**.

### إضافة طرق عرض إلى view controller الخاص بك

يتضمن القالب الذي يوفره Xcode لوحة قصة (storyboard) ووحدة تحكم عرض (view controller) لتكوينها. قم ببناء واجهة الإشعار المخصصة الخاصة بك عن طريق إضافة طرق عرض إلى وحدة تحكم العرض الخاصة بك. على سبيل المثال، استخدم التسميات لعرض العنوان والعنوان الفرعي ونص الرسالة للإشعار. يمكنك أيضًا إضافة طرق عرض الصور وطرق العرض التي تعرض محتوى غير تفاعلي. لا تحتاج إلى توفير أي محتوى أولي لطرق العرض الخاصة بك.

يمكنك إضافة عناصر تحكم تفاعلية (على سبيل المثال، أزرار أو مفاتيح) في iOS 12 والإصدارات الأحدث. لمزيد من المعلومات، راجع دعم عناصر التحكم التفاعلية.

<Aside type="caution">
لا تقم بإضافة view controllers إضافية إلى ملحق التطبيق أو ملف storyboard الخاص بك. يجب أن يحتوي ملحق التطبيق الخاص بك على view controller واحد بالضبط.
</Aside>

### تكوين view controller الخاص بك

استخدم طريقة `didReceive(_:)` لوحدة تحكم العرض الخاصة بك لتحديث تسمياتها وطرق العرض الأخرى. تحتوي حمولة الإشعار على البيانات التي يجب استخدامها عند تكوين وحدة تحكم العرض الخاصة بك. يمكنك أيضًا استخدام بيانات من الملفات الأخرى لملحق التطبيق الخاص بك. [القائمة 1](https://developer.apple.com/documentation/usernotificationsui/customizing_the_appearance_of_notifications#2950663) تعرض إصدارًا من هذه الطريقة يسترد العنوان ونص الرسالة من حمولة الإشعار ويعين السلاسل إلى عنصري تحكم [`UILabel`](https://developer.apple.com/documentation/uikit/uilabel)، والتي يتم تخزينها كمخارج في وحدة تحكم العرض.

<Tabs>
<TabItem label="Swift">
```swift
// Configuring the notification interface at runtime

func didReceive(_ notification: UNNotification) {
   self.bodyText?.text = notification.request.content.body
   self.headlineText?.text = notification.request.content.title
}
```
</TabItem>
</Tabs>

إذا وصل إشعار ثانٍ عندما تكون وحدة تحكم العرض الخاصة بك مرئية بالفعل، فإن النظام يستدعي طريقة `didReceive(_:)` مرة أخرى مع حمولة الإشعار الجديدة.

### دعم عناصر التحكم التفاعلية
في iOS 12 والإصدارات الأحدث، يمكنك تمكين تفاعلات المستخدم في إشعاراتك المخصصة. يتيح لك ذلك إضافة عناصر تحكم تفاعلية، مثل الأزرار والمفاتيح إلى واجهتك المخصصة.

لتمكين تفاعلات المستخدم:

1.  افتح ملف `info.plist` الخاص بملحق محتوى الإشعار.
2.  أضف مفتاح `UNNotificationExtensionUserInteractionEnabled` إلى سمات الملحق الخاص بك. أعطه قيمة منطقية، معينة إلى `YES`.

<img src="/ios-push-notifications-ios-push-customization-2.webp" alt="تمكين تفاعلات المستخدم في ملف info.plist الخاص بملحق الإشعار"/>

### إضافة Apple Pay إلى ملحق إشعار الدفع الخاص بك (مثال عرض)
<br />
<img
  src="/ios-push-notifications-ios-push-customization-3.webp"
  alt=""
  style={{ display: "block", margin: "0 auto", maxWidth: "60%", height: "auto" }}
  width="400"
/>

### مثال على كتلة التعليمات البرمجية مع زر Apple Pay في ملحق إشعار الدفع

<Tabs>
<TabItem label="Swift">
```swift
import UIKit
import Foundation
import UserNotifications
import UserNotificationsUI
import PassKit

class NotificationViewController: UIViewController, UNNotificationContentExtension, PKPaymentAuthorizationViewControllerDelegate {


    func paymentAuthorizationViewControllerDidFinish(_ controller: PKPaymentAuthorizationViewController) {
        controller.dismiss(animated: true, completion: nil)
    }


    @IBOutlet weak var buyWithApplePayButton: UIButton!
    @IBOutlet weak var containerView: UIView!
    @IBOutlet weak var payInAppButton: UIButton!
    @IBOutlet weak var segmentCustom: UISegmentedControl!

    private var amount: NSDecimalNumber = 0;

    override func viewDidLoad() {
        super.viewDidLoad()

        buttonCustomisation()

        amount = NSDecimalNumber.init(value: 5)
    }

    func buttonCustomisation () {
        self.buyWithApplePayButton.layer.masksToBounds = true
        self.buyWithApplePayButton.layer.cornerRadius = 10
        self.payInAppButton.layer.masksToBounds = true
        self.payInAppButton.layer.cornerRadius = 10
        self.containerView.layer.borderColor = UIColor.gray.cgColor
        self.containerView.layer.borderWidth = 0.7
        self.containerView.layer.masksToBounds = true
        self.containerView.layer.cornerRadius = 20
    }

    func didReceive(_ notification: UNNotification) {
        // Configuring the notification interface at runtime
    }

    @IBAction func buyWithApplePayAction(_ sender: Any) {
        let request = PKPaymentRequest()
        request.merchantIdentifier = "merchant.com.sample.ApplePayAction"
        request.supportedNetworks = [PKPaymentNetwork.visa, PKPaymentNetwork.masterCard, PKPaymentNetwork.amex]
        request.merchantCapabilities = PKMerchantCapability.capability3DS
        request.countryCode = "US"
        request.currencyCode = "USD"

        request.paymentSummaryItems = [
            PKPaymentSummaryItem(label: "Some Product", amount: amount)
        ]

        let applePayController = PKPaymentAuthorizationViewController(paymentRequest: request)
        applePayController?.delegate = self
        self.present(applePayController!, animated: true, completion: nil)
    }

    @IBAction func payInAppButtonAction(_ sender: Any) {
        print("pay in app button tapped")
    }

    @IBAction func segmentAction(_ sender: Any) {
        switch segmentCustom.selectedSegmentIndex {
        case 0:
            amount = NSDecimalNumber.init(value: 5)
            break
        case 1:
            amount = NSDecimalNumber.init(value: 10)
            break
        case 2:
            amount = NSDecimalNumber.init(value: 20)
            break
        default:
            amount = NSDecimalNumber.init(value: 5)
            break
        }
    }
}
```
</TabItem>
</Tabs>