# iOS পুশ কাস্টমাইজেশন

যখন একটি iOS ডিভাইস একটি অ্যালার্ট সহ নোটিফিকেশন পায়, সিস্টেম দুটি পর্যায়ে অ্যালার্টের বিষয়বস্তু প্রদর্শন করে। প্রাথমিকভাবে, এটি নোটিফিকেশনের শিরোনাম, উপশিরোনাম এবং দুই থেকে চার লাইনের বডি টেক্সট সহ একটি সংক্ষিপ্ত ব্যানার প্রদর্শন করে। যদি ব্যবহারকারী সংক্ষিপ্ত ব্যানারটি চাপেন, iOS সম্পূর্ণ নোটিফিকেশন ইন্টারফেস প্রদর্শন করে, যার মধ্যে যেকোনো নোটিফিকেশন-সম্পর্কিত অ্যাকশন অন্তর্ভুক্ত থাকে। সিস্টেম সংক্ষিপ্ত ব্যানারের জন্য ইন্টারফেস সরবরাহ করে, কিন্তু আপনি একটি নোটিফিকেশন কন্টেন্ট অ্যাপ এক্সটেনশন ব্যবহার করে সম্পূর্ণ ইন্টারফেসটি কাস্টমাইজ করতে পারেন।

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

নোটিফিকেশন কন্টেন্ট অ্যাপ এক্সটেনশন একটি ভিউ কন্ট্রোলার পরিচালনা করে যা আপনার কাস্টম নোটিফিকেশন ইন্টারফেস প্রদর্শন করে। এই ভিউ কন্ট্রোলারটি আপনার নোটিফিকেশনের জন্য ডিফল্ট সিস্টেম ইন্টারফেসকে পরিপূরক বা প্রতিস্থাপন করতে পারে। আপনি আপনার ভিউ কন্ট্রোলার ব্যবহার করতে পারেন:

* অ্যালার্টের শিরোনাম, উপশিরোনাম এবং বডি টেক্সট সহ আইটেমগুলির স্থান নির্ধারণ কাস্টমাইজ করতে।
* ইন্টারফেস উপাদানগুলির জন্য বিভিন্ন ফন্ট বা স্টাইলিং প্রতিস্থাপন করতে।
* অ্যাপ-নির্দিষ্ট ডেটা প্রদর্শন করতে—উদাহরণস্বরূপ, নোটিফিকেশনের পেলোডের অ্যাপ-নির্দিষ্ট কী-তে সংরক্ষিত ডেটা।
* কাস্টম ছবি বা ব্র্যান্ডিং অন্তর্ভুক্ত করতে।

আপনার অ্যাপ এক্সটেনশনকে তার ভিউ কন্ট্রোলারটি অবিলম্বে উপলব্ধ ডেটা ব্যবহার করে কনফিগার করতে হবে, যেমন নোটিফিকেশনের বিষয়বস্তু এবং আপনার অ্যাপ এক্সটেনশনের বান্ডেলে উপস্থিত ফাইলগুলি। যদি আপনি আপনার অ্যাপ এবং অ্যাপ এক্সটেনশনের মধ্যে ডেটা শেয়ার করার জন্য একটি অ্যাপ গ্রুপ ব্যবহার করেন, তাহলে আপনি অ্যাপ গ্রুপে পাওয়া যেকোনো ফাইলও ব্যবহার করতে পারেন। আপনার নোটিফিকেশনগুলি সময়মতো ডেলিভারি নিশ্চিত করতে, ভিউগুলি যত তাড়াতাড়ি সম্ভব কনফিগার করুন। নেটওয়ার্কের মাধ্যমে ডেটা পুনরুদ্ধার করার মতো কোনো দীর্ঘস্থায়ী কাজ করবেন না।

<Aside type="caution">
নোটিফিকেশন কন্টেন্ট অ্যাপ এক্সটেনশন শুধুমাত্র iOS অ্যাপে সমর্থিত।
</Aside>

### আপনার প্রজেক্টে নোটিফিকেশন কন্টেন্ট অ্যাপ এক্সটেনশন যোগ করুন

আপনার iOS অ্যাপে একটি নোটিফিকেশন কন্টেন্ট অ্যাপ এক্সটেনশন যোগ করতে:

1. Xcode-এ **File** > **New** > **Target** নির্বাচন করুন।
2. iOS Application Extension থেকে **Notification Content Extension** নির্বাচন করুন।
3. **Next** ক্লিক করুন।
4. আপনার অ্যাপ এক্সটেনশনের জন্য একটি **নাম** দিন।
5. **Finish** ক্লিক করুন।

### আপনার ভিউ কন্ট্রোলারে ভিউ যোগ করুন

Xcode দ্বারা প্রদত্ত টেমপ্লেটে আপনার কনফিগার করার জন্য একটি স্টোরিবোর্ড এবং একটি ভিউ কন্ট্রোলার অন্তর্ভুক্ত থাকে। আপনার ভিউ কন্ট্রোলারে ভিউ যোগ করে আপনার কাস্টম নোটিফিকেশন ইন্টারফেস তৈরি করুন। উদাহরণস্বরূপ, নোটিফিকেশনের শিরোনাম, উপশিরোনাম এবং বডি টেক্সট প্রদর্শন করতে লেবেল ব্যবহার করুন। আপনি ইমেজ ভিউ এবং এমন ভিউও যোগ করতে পারেন যা নন-ইন্টারেক্টিভ কন্টেন্ট প্রদর্শন করে। আপনার ভিউগুলির জন্য কোনো প্রাথমিক কন্টেন্ট সরবরাহ করার প্রয়োজন নেই।

আপনি iOS 12 এবং তার পরের সংস্করণগুলিতে ইন্টারেক্টিভ কন্ট্রোল (উদাহরণস্বরূপ, বাটন বা সুইচ) যোগ করতে পারেন। আরও তথ্যের জন্য, Support Interactive Controls দেখুন।

<Aside type="caution">
আপনার অ্যাপ এক্সটেনশন বা স্টোরিবোর্ড ফাইলে অতিরিক্ত ভিউ কন্ট্রোলার যোগ করবেন না। আপনার অ্যাপ এক্সটেনশনে অবশ্যই একটি ভিউ কন্ট্রোলার থাকতে হবে।
</Aside>

### আপনার ভিউ কন্ট্রোলার কনফিগার করুন

আপনার ভিউ কন্ট্রোলারের লেবেল এবং অন্যান্য ভিউ আপডেট করতে `didReceive(_:)` মেথডটি ব্যবহার করুন। নোটিফিকেশন পেলোডে আপনার ভিউ কন্ট্রোলার কনফিগার করার জন্য ব্যবহারযোগ্য ডেটা থাকে। আপনি আপনার অ্যাপ এক্সটেনশনের অন্যান্য ফাইল থেকেও ডেটা ব্যবহার করতে পারেন। [তালিকা ১](https://developer.apple.com/documentation/usernnotificationsui/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. আপনার Notification Content Extension-এর `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>