# iOS SDK কাস্টমাইজ করা

## ইন্টিগ্রেশন

* [ডিপ লিঙ্কিং](#deep-linking)
* [ইউনিভার্সাল লিঙ্ক](#universal-links)
* [ইন-অ্যাপ পারচেজ ট্র্যাকিং](#in-app-purchase-tracking)
* [জিওজোন পুশ নোটিফিকেশন](#geozones-push-notifications)
* [একটি রিচ মিডিয়া কিউ তৈরি করা](#creating-a-rich-media-queue)
* [ফোর্স টাচ সহ একটি রিচ নোটিফিকেশনে পাঠানো ভিডিও অটোপ্লে করা](#autoplay-a-video-sent-in-a-rich-notification-with-force-touch)
* [কাস্টম পুশ সাউন্ড](#custom-push-sound)
* [iOS প্রভিশনাল পুশ](#ios-provisional-push)


### ডিপ লিঙ্কিং

আপনার **Info.plist** ফাইলে `URL Identifier` এবং `URL Scheme` সহ `URL types` অ্যারে যোগ করুন।
নীচের উদাহরণে `URL Scheme` হল _com.pushwoosh_ এবং `URL Identifier` হল _promotion_।

<img src="/ios-push-notifications-customizing-ios-sdk-3.webp" alt="Info.plist-এ URL টাইপ"/>

আপনার অ্যাপ ডেলিগেট ফাইলে (সাধারণত iOS 12 এবং তার নিচের জন্য AppDelegate.m, অথবা iOS 13 এবং তার উপরের জন্য SceneDelegate.m), নীচের উদাহরণে বর্ণিত উপযুক্ত openURL ডেলিগেট ফাংশন যোগ করুন। উদাহরণটি সঠিক পেজ পরীক্ষা করে, URL থেকে "id" মান পার্স করে এবং প্রতিক্রিয়ায় PromoPageViewController খোলে।

```AppDelegate.swift```
<Tabs>
<TabItem label="Swift">
```swift
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
    let page = components?.host
    var promotionId: String?

    if page == "promotion" {
        return
    }

    let items = components?.queryItems ?? []

    for item in items {
        if item.name == "id" {
            promotionId = item.value
        }
    }

    //show PromoPageViewController
}
```
</TabItem>

<TabItem label="Objective-C">
```objective-c
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];
    NSString *page = components.host;
    NSString *promotionId = nil;

    //return if this is not a promotion deep link
    if(![page isEqualToString:@"promotion"])
        return NO;

    for(NSURLQueryItem *item in components.queryItems)
    {
        if([item.name isEqualToString:@"id"])
            promotionId = item.value;
    }

    PromoPageViewController *vc = [[PromoPageViewController alloc] init];
    vc.promotionId = promotionId
    [self presentViewController:vc animated:YES completion:nil];
}
```
</TabItem>
</Tabs>

```SceneDelegate.swift```
<Tabs>
<TabItem label="Swift">
```swift
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
    guard let urlContext = URLContexts.first else { return }
        
    let components = URLComponents(url: urlContext.url, resolvingAgainstBaseURL: false)
    let page = components?.host
    var promotionId: String?
        
    guard page == "promotion" else {
        return
    }
        
    let items = components?.queryItems ?? []
        
    for item in items {
        if item.name == "id" {
            promotionId = item.value
        }
    }
        
    //show PromoPageViewController
}
```
</TabItem>

<TabItem label="Objective-C">
```objective-c
- (void)scene:(UIWindowScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts {
    UIOpenURLContext *urlContext = URLContexts.anyObject;
    if (!urlContext) {
        return;
    }

    NSURLComponents *components = [NSURLComponents componentsWithURL:urlContext.URL resolvingAgainstBaseURL:NO];
    NSString *page = components.host;
    NSString *promotionId = nil;

    if (![page isEqualToString:@"promotion"]) {
        return;
    }

    for (NSURLQueryItem *item in components.queryItems) {
        if ([item.name isEqualToString:@"id"]) {
            promotionId = item.value;
        }
    }

    //show PromoPageViewController
}
```

</TabItem>
</Tabs>

### ইউনিভার্সাল লিঙ্ক

ইউনিভার্সাল লিঙ্ক ব্যবহারকারীদের আপনার ওয়েবসাইটের একটি লিঙ্কে ট্যাপ করার সাথে সাথে সরাসরি আপনার অ্যাপ খুলতে দেয়। কাস্টম URL স্কিমের বিপরীতে, ইউনিভার্সাল লিঙ্কগুলি স্ট্যান্ডার্ড `https://` URL ব্যবহার করে এবং একটি আরও নির্বিঘ্ন ব্যবহারকারীর অভিজ্ঞতা প্রদান করে।

<Aside type="note">
**SDK সংস্করণ 7.0.15** থেকে, Pushwoosh iOS SDK স্বয়ংক্রিয়ভাবে পুশ নোটিফিকেশন থেকে ইউনিভার্সাল লিঙ্কগুলিকে Safari-তে খোলার পরিবর্তে আপনার অ্যাপের হ্যান্ডলারগুলিতে রুট করে।
</Aside>

#### এটি কিভাবে কাজ করে

যখন একটি পুশ নোটিফিকেশনে একটি `https://` URL থাকে ("url" বা "l" প্যারামিটারে), SDK যা করবে:

1. URL সহ একটি `NSUserActivity` তৈরি করবে
2. আপনার অ্যাপের ইউনিভার্সাল লিঙ্ক হ্যান্ডলারকে কল করবে (`scene:continueUserActivity:` বা `application:continueUserActivity:restorationHandler:`)
3. যদি আপনার অ্যাপ URLটি হ্যান্ডেল না করে, তবে এটি ফলব্যাক হিসাবে Safari-তে খুলবে

#### সেটআপ

1. **Xcode-এ অ্যাসোসিয়েটেড ডোমেইন কনফিগার করুন**

আপনার অ্যাপে অ্যাসোসিয়েটেড ডোমেইন ক্ষমতা যোগ করুন এবং আপনার ডোমেইন যোগ করুন:

```
applinks:yourdomain.com
```

2. **Apple App Site Association ফাইলটি হোস্ট করুন**

আপনার ওয়েব সার্ভারে `https://yourdomain.com/.well-known/apple-app-site-association`-এ একটি `apple-app-site-association` ফাইল তৈরি করুন:

```json
{
  "applinks": {
    "apps": [],
    "details": [
      {
        "appID": "TEAM_ID.com.your.bundleid",
        "paths": ["/path/*", "/promotion/*"]
      }
    ]
  }
}
```

`TEAM_ID`-কে আপনার Apple Developer Team ID এবং `com.your.bundleid`-কে আপনার অ্যাপের বান্ডেল আইডেন্টিফায়ার দিয়ে প্রতিস্থাপন করুন।

3. **ইউনিভার্সাল লিঙ্ক হ্যান্ডলার ইমপ্লিমেন্ট করুন**

```SceneDelegate.swift``` (iOS 13+)
<Tabs>
<TabItem label="Swift">
```swift
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
    guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
          let url = userActivity.webpageURL else {
        return
    }

    // Handle the Universal Link URL
    let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
    let path = components?.path

    if path?.starts(with: "/promotion") == true {
        // Navigate to promotion screen
        let promotionId = components?.queryItems?.first(where: { $0.name == "id" })?.value
        // Show promotion with promotionId
    }
}
```
</TabItem>

<TabItem label="Objective-C">
```objective-c
- (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity {
    if (![userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
        return;
    }

    NSURL *url = userActivity.webpageURL;
    if (!url) {
        return;
    }

    // Handle the Universal Link URL
    NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];
    NSString *path = components.path;

    if ([path hasPrefix:@"/promotion"]) {
        // Navigate to promotion screen
        NSString *promotionId = nil;
        for (NSURLQueryItem *item in components.queryItems) {
            if ([item.name isEqualToString:@"id"]) {
                promotionId = item.value;
                break;
            }
        }
        // Show promotion with promotionId
    }
}
```
</TabItem>
</Tabs>

```AppDelegate.swift``` (iOS 12 এবং তার আগের সংস্করণ, অথবা ফলব্যাক হিসাবে)
<Tabs>
<TabItem label="Swift">
```swift
func application(_ application: UIApplication,
                 continue userActivity: NSUserActivity,
                 restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
          let url = userActivity.webpageURL else {
        return false
    }

    // Handle the Universal Link URL
    let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
    let path = components?.path

    if path?.starts(with: "/promotion") == true {
        // Navigate to promotion screen
        return true
    }

    return false
}
```
</TabItem>

<TabItem label="Objective-C">
```objective-c
- (BOOL)application:(UIApplication *)application
        continueUserActivity:(NSUserActivity *)userActivity
          restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> *restorableObjects))restorationHandler {

    if (![userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
        return NO;
    }

    NSURL *url = userActivity.webpageURL;
    if (!url) {
        return NO;
    }

    // Handle the Universal Link URL
    NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];
    NSString *path = components.path;

    if ([path hasPrefix:@"/promotion"]) {
        // Navigate to promotion screen
        return YES;
    }

    return NO;
}
```
</TabItem>
</Tabs>

#### ইউনিভার্সাল লিঙ্ক সহ পুশ পাঠানো

একটি পুশ নোটিফিকেশন তৈরি করার সময়, **Action** ফিল্ডে আপনার ওয়েবসাইটের URL ব্যবহার করুন:

```
https://yourdomain.com/promotion?id=123
```

SDK স্বয়ংক্রিয়ভাবে এই URLটি আপনার ইউনিভার্সাল লিঙ্ক হ্যান্ডলারে রুট করবে, যা আপনাকে ব্যবহারকারীকে আপনার অ্যাপের উপযুক্ত স্ক্রিনে নেভিগেট করতে দেবে।

<Aside type="tip">
ইউনিভার্সাল লিঙ্কগুলি কাস্টম URL স্কিমের চেয়ে ভাল ব্যবহারকারীর অভিজ্ঞতা প্রদান করে কারণ সেগুলি আপনার অ্যাপ ইনস্টল না থাকলেও কাজ করে — ব্যবহারকারীকে পরিবর্তে আপনার ওয়েবসাইটে নিয়ে যাওয়া হবে।
</Aside>

### ইন-অ্যাপ পারচেজ ট্র্যাকিং

ডিফল্টরূপে, ইন-অ্যাপ পারচেজ ট্র্যাকিং নিষ্ক্রিয় করা থাকে। আপনি যদি [Customer Journeys](/bn/product/customer-journey/pushwoosh-journey-overview) কনফিগার করার সময় ইন-অ্যাপ পারচেজ ট্র্যাক করতে চান, তাহলে _info.plist_ ফাইলে _Pushwoosh\_PURCHASE\_TRACKING\_ENABLED_ ফ্ল্যাগটি _true_ তে সেট করুন। আপনি [টেবিলে](/bn/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/advanced-integration-guide/#complete-list-of-infoplist-properties) উপলব্ধ ফ্ল্যাগগুলির একটি তালিকা খুঁজে পেতে পারেন।

আপনি যদি ম্যানুয়ালি ইন-অ্যাপ পারচেজ ট্র্যাক করতে চান, তাহলে আপনি নীচের কোডটি ব্যবহার করতে পারেন।

`paymentQueue:updatedTransactions: delegate` পদ্ধতিতে `PushManager`-এর `sendSKPaymentTransactions` পদ্ধতি কল করুন

<Tabs>
<TabItem label="Swift">
```swift
 func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
     // In-Apps Tracking Pushwoosh code here
     Pushwoosh.sharedInstance().sendSKPaymentTransactions(transactions)
     // the rest of the code, consume transactions, etc
 }
```
</TabItem>

<TabItem label="Objective-C">
```objective-c
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {

  [[PushNotificationManager pushManager] sendSKPaymentTransactions:transactions];

  //the rest of the code, consume transactions, etc
}
```
</TabItem>
</Tabs>

<img src="/ios-push-notifications-customizing-ios-sdk-4.webp" alt="InAppTrackingViewController.swift"/>

<LinkCard title="উদাহরণ" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizing/In-Apps%20Tracking/InAppTrackingViewController.swift" />

### জিওজোন পুশ নোটিফিকেশন

জিওজোন পুশ নোটিফিকেশন একটি পৃথক ফ্রেমওয়ার্ক **PushwooshGeozones**-এ এনক্যাপসুলেট করা আছে।

1. আপনার প্রজেক্টে PushwooshGeozones.framework যোগ করুন

একটি ডিপেন্ডেন্সি ম্যানেজার ব্যবহার করে আপনার প্রজেক্টে PushwooshGeozones.framework যোগ করতে, আপনার `podfile` বা `cartfile`-এ নিম্নলিখিত লাইনগুলি রাখুন:

<Tabs>
  <TabItem value="podfile" label="Podfile">

  ```plaintext
  pod 'PushwooshXCFramework/Geozones'
  ```

  </TabItem>
  
  <TabItem value="carfile" label="Carfile">

  ```plaintext
  github "Pushwoosh/pushwoosh-ios-sdk"
  ```

  </TabItem>
  
  <TabItem value="swiftpm" label="SwiftPM">
  
  আপনি যদি **PushwooshGeozones.xcframework** ব্যবহার করতে চান, তাহলে নিম্নলিখিত প্যাকেজ URL লিখুন:
  [PushwooshGeozones-XCFramework](https://github.com/Pushwoosh/PushwooshGeozones-XCFramework)

  </TabItem>
</Tabs>


বিকল্পভাবে, আপনি কেবল ফ্রেমওয়ার্কটি আপনার প্রজেক্টের **Build Phases**-এর **Link Binaries With Libraries**-এ ড্র্যাগ এবং ড্রপ করতে পারেন।


2. আপনার Info.plist-এ নিম্নলিখিত কীগুলি যোগ করুন:

- **NSLocationWhenInUseUsageDescription** – *(প্রয়োজনীয়)* অ্যাপটি শুধুমাত্র ফোরগ্রাউন্ডে চলার সময় জিওজোন ট্র্যাক করার জন্য।
- **NSLocationAlwaysAndWhenInUseUsageDescription** – *(প্রয়োজনীয়)* অ্যাপটি **ফোরগ্রাউন্ড এবং ব্যাকগ্রাউন্ড উভয় অবস্থাতেই** জিওজোন ট্র্যাক করার জন্য এবং একটি অনুমতি অনুরোধ ডায়ালগ পপ-আপ দেখানোর জন্য।
- **NSLocationAlwaysUsageDescription** – *(ঐচ্ছিক)* অ্যাপটি **সব সময়** জিওজোন ট্র্যাক করার জন্য; যদি আপনার অ্যাপ iOS 10 এবং তার আগের সংস্করণগুলিকে টার্গেট করে তবে এটি ব্যবহার করা উচিত।

```xml
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>for app to track Geozones in both conditions and to show a permission request dialog</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>for app to track Geozones only while running in the foreground</string>
```
![]() 

<LinkCard title="Pushwoosh Info.plist উদাহরণ" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizingObjC/customizingObjC/Info.plist" />

3. ফ্রেমওয়ার্কটি ইম্পোর্ট করুন

<Tabs>
  <TabItem value="swift" label="Swift">

  ```swift
  import PushwooshGeozones
  ```

  </TabItem>
  
  <TabItem value="objective-c" label="Objective-C">

  ```objc
  #import <PushwooshGeozones/PWGeozonesManager.h>
  ```

  </TabItem>
</Tabs>

4. জিওজোন ট্র্যাকিং শুরু করুন

<Tabs>
  <TabItem value="swift" label="Swift">

  ```swift
  PWGeozonesManager.shared()?.startLocationTracking()
  ```

  [GitHub রেফারেন্স](https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizing/Geozones%20Push%20Notification/GeozonesViewController.swift)

  </TabItem>
  
  <TabItem value="objective-c" label="Objective-C">

  ```objc
  [[PWGeozonesManager sharedManager] startLocationTracking];
  ```

  [GitHub রেফারেন্স](https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizingObjC/customizingObjC/Geozones%20Push%20Notification/PWGeozonesViewController.m)

  </TabItem>
</Tabs>

##### উদাহরণ
<Tabs>
  <TabItem value="swift" label="Swift Example">

  ```swift
  override func viewDidLoad() {
      super.viewDidLoad()

      // Start Geozones tracking when needed
      PWGeozonesManager.shared().startLocationTracking()
  }
  ```

  </TabItem>
  
  <TabItem value="objective-c" label="Objective-C Example">

  ```objc
  - (void)viewDidLoad {
      [super viewDidLoad];
      // Do any additional setup after loading the view.

      // Start Geozones tracking when needed
      [[PWGeozonesManager sharedManager] startLocationTracking];
  }
  ```

  </TabItem>
</Tabs>


### একটি রিচ মিডিয়া কিউ তৈরি করা

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

1. একটি ক্লাস তৈরি করুন যা PWRichMediaPresentingDelegate ইমপ্লিমেন্ট করে:

```objective-c
@interface ChainedRichMediaPresentingDelegate () <PWRichMediaPresentingDelegate>

@property (nonatomic) NSMutableArray *queue;

@property (nonatomic) BOOL inAppIsPresenting;

@end


@implementation ChainedRichMediaPresentingDelegate

- (instancetype)init {
    self = [super init];

    if (self) {
        _queue = [NSMutableArray new];
    }

    return self;
}

- (BOOL)richMediaManager:(PWRichMediaManager *)richMediaManager shouldPresentRichMedia:(PWRichMedia *)richMedia {
    [_queue addObject:richMedia];
    return !_inAppIsPresenting;
}

- (void)richMediaManager:(PWRichMediaManager *)richMediaManager didPresentRichMedia:(PWRichMedia *)richMedia {
    _inAppIsPresenting = YES;
}

- (void)richMediaManager:(PWRichMediaManager *)richMediaManager didCloseRichMedia:(PWRichMedia *)richMedia {
    _inAppIsPresenting = NO;

    [_queue removeObject:richMedia];

    if (_queue.count) {
        [[PWRichMediaManager sharedManager] presentRichMedia:_queue.firstObject];
    }
}

- (void)richMediaManager:(PWRichMediaManager *)richMediaManager presentingDidFailForRichMedia:(PWRichMedia *)richMedia withError:(NSError *)error {
    [self richMediaManager:richMediaManager didCloseRichMedia:richMedia];
}

@end
```

2. ডেলিগেট সেট করুন:

```objective-c
 [PWRichMediaManager sharedManager].delegate = [ChainedRichMediaPresentingDelegate new];
```

<Tabs>
<TabItem label="Swift (GitHub)">
<LinkCard title="উদাহরণ" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/tree/main/customizing/customizing/Rich%20Media%20Queue" />
</TabItem>

<TabItem label="Objective-C (GitHub)">
<LinkCard title="উদাহরণ" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/tree/main/customizing/customizingObjC/customizingObjC/Rich%20Media%20Queue" />
</TabItem>
</Tabs>

### ফোর্স টাচ সহ একটি রিচ নোটিফিকেশনে পাঠানো ভিডিও অটোপ্লে করা

একটি [রিচ নোটিফিকেশন সংযুক্তি](/bn/developer/pushwoosh-sdk/ios-sdk/ios-rich-notifications-integration/) হিসাবে পাঠানো ভিডিওটি ব্যবহারকারীর কোনো ইন্টারঅ্যাকশন ছাড়াই নোটিফিকেশনটি প্রসারিত হলে অটোপ্লে করতে, নীচের পদক্ষেপগুলি অনুসরণ করুন:

1. আপনার প্রজেক্টে নোটিফিকেশন কন্টেন্ট এক্সটেনশন যোগ করুন:

* Xcode-এ, File > New > Target নির্বাচন করুন।
* Notification Content Extension বেছে নিন।
* এটিকে একটি নাম দিন এবং সেটআপ সম্পূর্ণ করুন।

<img src="/ios-push-notifications-customizing-ios-sdk-5.webp" alt="নোটিফিকেশন কন্টেন্ট এক্সটেনশন - iOS রিচ পুশ নোটিফিকেশন"/>

যদি "Activate scheme" বার্তা দিয়ে অনুরোধ করা হয়, তাহলে Cancel বেছে নিন।

<img
  src="/ios-push-notifications-customizing-ios-sdk-6.webp"
  alt="নোটিফিকেশন কন্টেন্ট স্কিম সক্রিয় করুন"
  style={{ display: "block", margin: "0 auto", maxWidth: "40%", height: "auto" }}
  width="400"
/>

2. কন্টেন্ট এক্সটেনশনে প্রপার্টি এবং মেথডগুলি নিম্নরূপ সামঞ্জস্য করুন:

```
import UIKit
import UserNotifications
import UserNotificationsUI
import AVKit


class NotificationViewController: UIViewController, UNNotificationContentExtension {
    var playerController: AVPlayerViewController!
    @IBOutlet weak var playerBackgroundView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any required interface initialization here.
    }

    func didReceive(_ notification: UNNotification) {
        let attachment = notification.request.content.attachments.first

        playerController = AVPlayerViewController()
        // Set height programmatically
        // preferredContentSize.height = 250

        if let url = attachment?.url {
            setupVideoPlayer(url: url)
        } else {
            print("No valid URL...")
        }
    }

    private func setupVideoPlayer(url: URL) {
        guard let playerController = self.playerController else { return }
        let player = AVPlayer(url: url)
        playerController.player = player
        playerController.view.frame = self.playerBackgroundView.bounds
        playerBackgroundView.addSubview(playerController.view)
        addChild(playerController)
        playerController.didMove(toParent: self)
        player.play()
    }
```

3. MainInterface.storyboard-এ একটি UIView অন্তর্ভুক্ত করুন:

<img src="/ios-push-notifications-customizing-ios-sdk-7.webp" alt="MainInterface.storyboard-এ UIView"/>

4. playerBackgroundView IBOutlet-টিকে আপনার সদ্য যোগ করা UIView-এর সাথে লিঙ্ক করুন:

<img src="/ios-push-notifications-customizing-ios-sdk-8.webp" alt="playerBackgroundView IBOutlet-কে UIView-এর সাথে লিঙ্ক করুন"/>

5. info.plist ফাইলটি নিম্নলিখিত এন্ট্রি দিয়ে আপডেট করুন:

```
UNNotificationExtensionUserInteractionEnabled = true
```

<img src="/ios-push-notifications-customizing-ios-sdk-9.webp" alt="UNNotificationExtensionUserInteractionEnabled = true"/>

আপনার নোটিফিকেশনে একটি ভিডিও সংযুক্ত করতে, কন্ট্রোল প্যানেলের মিডিয়া অ্যাটাচমেন্ট ফিল্ডে একটি ভিডিওর URL ইনপুট করুন:

<img src="/ios-push-notifications-customizing-ios-sdk-10.webp" alt="Pushwoosh কন্ট্রোল প্যানেলে মিডিয়া অ্যাটাচমেন্ট ফিল্ডে ভিডিওর URL"/>

API [/createMessage](/bn/developer/api-reference/messages-api#createmessage) অনুরোধের মাধ্যমে একটি নোটিফিকেশন পাঠানোর সময়, "ios\_attachment" প্যারামিটারে URL অন্তর্ভুক্ত করুন এবং নিশ্চিত করুন যে "mutable-content" ফ্ল্যাগটি \`1\` এ সেট করা আছে।

<Aside type="note">
অটোপ্লে ফিচারটি পরীক্ষা করার জন্য, আপনি নিম্নলিখিত নমুনা ভিডিওটি ব্যবহার করতে পারেন: [Hello World Sample Video](https://docs-assets.developer.apple.com/published/efa8e7a0a97cfab20bf0f4c307b9b121/Hello-World-overview.mp4)।
</Aside>

<video src="/ios-push-notifications-customizing-ios-sdk-11.webm" title="Hello World নমুনা ভিডিও" autoplay loop muted playsinline />

### কাস্টম পুশ সাউন্ড

একটি পুশ নোটিফিকেশন পাওয়ার সময় একটি কাস্টম সাউন্ড প্লে করতে, প্রথমে অডিও ফাইলটি আপনার প্রজেক্টের রুট ফোল্ডারে রাখুন।

<img
  src="/ios-push-notifications-customizing-ios-sdk-12.webp"
  alt="প্রজেক্টের রুট ফোল্ডারে অডিও ফাইল"
  style={{ display: "block", margin: "0 auto", maxWidth: "40%", height: "auto" }}
  width="400"
/>

তারপর, পুশ প্যারামিটারে সাউন্ড ফাইলের নাম উল্লেখ করুন – আপনার বার্তার [iOS-নির্দিষ্ট সেটিংস](/bn/product/messaging-channels/push-notifications/send-push-notifications/one-time-push#ios)-এর সাউন্ড ফিল্ডটি পূরণ করুন অথবা [createMessage API অনুরোধ](/bn/developer/api-reference/messages-api/)-এর "ios\_sound" প্যারামের মান হিসাবে ফাইলের নাম উল্লেখ করুন।

কাস্টম iOS সাউন্ডের জন্য অডিও ফাইলটি নিম্নলিখিত ফরম্যাটগুলির মধ্যে একটিতে হতে হবে: **.aif**, **.caf**, **.wav**। **ফাইলের নামে ফরম্যাট উল্লেখ করতে ভুলবেন না; অন্যথায়, এটি Pushwoosh iOS SDK দ্বারা উপেক্ষা করা হবে।**

<Aside type="tip">
আপনার বান্ডেলে সাউন্ড ফাইল যোগ করার সময় অ্যাপ স্টোরের বান্ডেল আকারের সীমাবদ্ধতা বিবেচনা করুন।
</Aside>


### iOS প্রভিশনাল পুশ

<Aside>
iOS 12 এবং তার পরবর্তী সংস্করণগুলিতে সমর্থিত।
</Aside>

#### এটি কিভাবে কাজ করে

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

তবে, ব্যবহারকারীরা এখনও আপনার প্রমিনেন্ট পুশ নোটিফিকেশনে সাবস্ক্রাইব করতে পারেন: প্রভিশনাল পুশ খোলার সময়, তাদের অভিজ্ঞতা বেছে নেওয়ার জন্য দুটি বিকল্প থাকে – অ্যালার্ট এবং সাউন্ড ছাড়াই নোটিফিকেশন সেন্টারে পুশ রাখা অথবা আপনাকে প্রমিনেন্টভাবে পুশ পাঠানোর অনুমতি দেওয়া যাতে সেগুলি লক স্ক্রিনে উপস্থিত হয়।

প্রভিশনাল পুশগুলি ব্যবহারকারীদের আপনার অ্যাপ থেকে নোটিফিকেশন পেতে চান কিনা সে সম্পর্কে অবগত সিদ্ধান্ত নিতে দেওয়ার জন্য ডিজাইন করা হয়েছে। যেহেতু APN নেটিভ সাবস্ক্রিপশন অনুরোধ ব্যবহারকারীদের শুধুমাত্র একবার দেখানো হয় এবং পরে সাবস্ক্রাইব করার জন্য তাদের ফোনের সিস্টেম সেটিংসে যেতে হয়, তাই কিছু ব্যবহারকারী সাবস্ক্রাইব নাও করতে পারেন কারণ তারা আপনার পুশগুলির মাধ্যমে কী মূল্য পাবেন সে সম্পর্কে অবগত নন। প্রভিশনাল পুশগুলি ব্যবহারকারীদের এই বোঝাপড়া দেয়: তারা দেখতে পারে আপনি পুশ নোটিফিকেশনে কী কন্টেন্ট ডেলিভার করেন এবং সিদ্ধান্ত নিতে পারে যে তাদের এই কন্টেন্ট সম্পর্কে প্রমিনেন্টভাবে অবহিত হওয়ার প্রয়োজন আছে কিনা।

<Aside type="caution" title="গুরুত্বপূর্ণ">
অনুগ্রহ করে মনে রাখবেন যে প্রভিশনাল পুশগুলি, যখন ইমপ্লিমেন্ট করা হয়, তখন নেটিভ APN প্রম্পটকে প্রতিস্থাপন করে, যার মানে ব্যবহারকারীরা তাদের নোটিফিকেশন সেন্টার না খোলা পর্যন্ত এবং প্রভিশনাল পুশগুলিকে প্রমিনেন্ট হিসাবে গ্রহণ করার বিকল্প বেছে না নেওয়া পর্যন্ত প্রমিনেন্ট নোটিফিকেশনে সাবস্ক্রাইব করতে পারে না।
</Aside>

#### কিভাবে ইমপ্লিমেন্ট করবেন

1. [গাইড](/bn/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/quick-start/) অনুসরণ করে Pushwoosh iOS SDK ইন্টিগ্রেট করুন।

2. `registerForPushNotifications()` পদ্ধতি কল করার আগে আপনার প্রজেক্টের AppDelegate-এ নিম্নলিখিত স্ট্রিংটি যোগ করুন:

<Tabs>
<TabItem label="Swift">
```swift
if #available(iOS 12.0, *) {
    Pushwoosh.sharedInstance().additionalAuthorizationOptions = UNAuthorizationOptions.provisional
}
```

<LinkCard title="উদাহরণ" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/provisionalpush/provisionalpush/AppDelegate/AppDelegate.swift" />
</TabItem>

<TabItem label="Objective-C">
```objective-c
if (@available(iOS 12.0, *)) {
	[Pushwoosh sharedInstance].additionalAuthorizationOptions = UNAuthorizationOptionProvisional;
}
```

<LinkCard title="উদাহরণ" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/provisionalpush/provisionalpushObjC/provisionalpushObjC/AppDelegate/AppDelegate.m" />
</TabItem>
</Tabs>

এটাই! অ্যাপ ব্যবহারকারীরা অ্যাপ ইনস্টল করার সাথে সাথেই সরাসরি তাদের নোটিফিকেশন সেন্টারে বার্তা পাবেন।

### আমাদের সাথে আপনার মতামত শেয়ার করুন

আপনার মতামত আমাদের একটি উন্নত অভিজ্ঞতা তৈরি করতে সাহায্য করে, তাই SDK ইন্টিগ্রেশন প্রক্রিয়ার সময় আপনার কোনো সমস্যা হলে আমরা আপনার কাছ থেকে শুনতে চাই। আপনি যদি কোনো অসুবিধার সম্মুখীন হন, তাহলে অনুগ্রহ করে [এই ফর্মের মাধ্যমে](https://docs.google.com/forms/d/e/1FAIpQLSd_0b8jwn-V_JmoPLIxIFYbHACCQhrzidOZV3ELywoQPXRSxw/viewform) আমাদের সাথে আপনার চিন্তা শেয়ার করতে দ্বিধা করবেন না।