# iOS মোডাল রিচ মিডিয়া

Pushwoosh SDK সংস্করণ 6.7.5 থেকে, আপনার কাছে **মোডাল রিচ মিডিয়া** পাঠানোর ক্ষমতা রয়েছে।

আমরা নতুন **মোডাল রিচ মিডিয়া** চালু করছি, যা কাস্টমাইজ করা যায়। নতুন মোডাল রিচ মিডিয়া স্ক্রিনকে পুরোপুরি ব্লক করে না এবং স্ক্রিনের বিভিন্ন অংশে (উপরে, নিচে এবং কেন্দ্রে) স্থাপন করা যেতে পারে।

> রিচ মিডিয়া পেজ সম্পর্কে আরও তথ্যের জন্য, অনুগ্রহ করে [আমাদের গাইড](/bn/product/content/rich-media) দেখুন।

## কনফিগারেশন

<Aside type="note">
 ডিফল্টরূপে, Pushwoosh iOS SDK লিগ্যাসি রিচ মিডিয়া প্রদর্শন সমর্থন করে।
</Aside>

<Aside type="note">
আপনি যদি Customer Journey Builder-এ ইন-অ্যাপ মেসেজ হিসাবে মোডাল রিচ মিডিয়া ডিসপ্লে ব্যবহার করার পরিকল্পনা করেন, তাহলে নিশ্চিত করুন যে আপনি নীচে দেখানো কোডটি প্রয়োগ করেছেন। বিস্তারিত জানতে [বেসিক SDK ইন্টিগ্রেশন](/bn/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/basic-integration-guide/) দেখুন।
</Aside>

```swift
//for silent push notifications
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    Pushwoosh.configure.handlePushReceived(userInfo)
    completionHandler(.noData)
}
```

### বিকল্প ১: Info.plist কনফিগারেশন

মোডাল রিচ মিডিয়া প্রদর্শন সক্ষম করতে, আপনার **info.plist**-এ `Pushwoosh_RICH_MEDIA_STYLE` প্যারামিটার সেট করুন এবং এটিকে `MODAL_RICH_MEDIA` মান দিন।

**Info.plist**:
```xml
<key>Pushwoosh_RICH_MEDIA_STYLE</key>
<string>MODAL_RICH_MEDIA</string>
```

### বিকল্প ২: প্রোগ্রাম্যাটিক কনফিগারেশন (SDK 7.0.14+)

<Aside type="tip">
Pushwoosh iOS SDK সংস্করণ **7.0.14** থেকে উপলব্ধ।
</Aside>

আপনি আপনার AppDelegate-এ প্রোগ্রাম্যাটিকভাবে রিচ মিডিয়া প্রেজেন্টেশন স্টাইল কনফিগার করতে পারেন:

<Tabs>
<TabItem label="Swift">
```swift
func application(_ application: UIApplication,
                 didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    // Set modal presentation style
    Pushwoosh.media.setRichMediaPresentationStyle(.modal)

    // Configure modal window appearance
    Pushwoosh.media.modalRichMedia.configure(
        position: .PWModalWindowPositionBottom,
        presentAnimation: .PWAnimationPresentFromBottom,
        dismissAnimation: .PWAnimationDismissDown
    )

    Pushwoosh.configure.registerForPushNotifications()
    return true
}
```
</TabItem>
<TabItem label="Objective-C">
```objective-c
- (BOOL)application:(UIApplication *)application
        didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // Set modal presentation style
    [[Pushwoosh media] setRichMediaPresentationStyle:PWRichMediaPresentationStyleModal];

    // Configure modal window appearance
    [[[Pushwoosh media] modalRichMedia] configureWithPosition:PWModalWindowPositionBottom
                                             presentAnimation:PWAnimationPresentFromBottom
                                             dismissAnimation:PWAnimationDismissDown];

    [[Pushwoosh configure] registerForPushNotifications];
    return YES;
}
```
</TabItem>
</Tabs>

ডিফল্টরূপে, মোডাল রিচ মিডিয়া স্ক্রিনের কেন্দ্রে নিচ থেকে উপরে প্রদর্শিত হওয়ার অ্যানিমেশন সহ দেখানো হবে।

<div style={{ display: "flex", justifyContent: "center" }}>
<video src="/ios-push-notifications-ios-modal-rich-media-1.webm" title="উদাহরণ" autoplay loop muted playsinline width="300" />
</div>

### মোডাল রিচ মিডিয়া পজিশনিং

মোডাল রিচ মিডিয়া স্ক্রিনের বিভিন্ন স্থানে স্থাপন করা যেতে পারে।

```objective-c
/**
 মোডাল উইন্ডো প্রদর্শনের জন্য সম্ভাব্য অবস্থানগুলি সংজ্ঞায়িত করে এমন enum।

 - `PWModalWindowPositionTop`: মোডাল উইন্ডোটি স্ক্রিনের উপরে, নিরাপদ এলাকার মধ্যে প্রদর্শিত হয়।
 - `PWModalWindowPositionCenter`: মোডাল উইন্ডোটি স্ক্রিনের কেন্দ্রে, নিরাপদ এলাকার মধ্যে প্রদর্শিত হয়।
 - `PWModalWindowPositionBottom`: মোডাল উইন্ডোটি স্ক্রিনের নীচে, নিরাপদ এলাকার মধ্যে প্রদর্শিত হয়।
 - `PWModalWindowPositionBottomSheet`: মোডাল উইন্ডোটি স্ক্রিনের একেবারে নীচে, নিরাপদ এলাকা উপেক্ষা করে প্রদর্শিত হয়।
 - `PWModalWindowPositionDefault`: ডিফল্ট অবস্থান হলো স্ক্রিনের কেন্দ্র, নিরাপদ এলাকার মধ্যে।
 */
typedef NS_ENUM(NSInteger, ModalWindowPosition) {
    PWModalWindowPositionTop,       // স্ক্রিনের উপরে প্রদর্শিত হয় (নিরাপদ এলাকার মধ্যে)
    PWModalWindowPositionCenter,    // স্ক্রিনের কেন্দ্রে প্রদর্শিত হয় (নিরাপদ এলাকার মধ্যে)
    PWModalWindowPositionBottom,    // স্ক্রিনের নীচে প্রদর্শিত হয় (নিরাপদ এলাকার মধ্যে)
    PWModalWindowPositionBottomSheet, // স্ক্রিনের একেবারে নীচে প্রদর্শিত হয় (নিরাপদ এলাকা উপেক্ষা করে)
    PWModalWindowPositionFullScreen, // ফুলস্ক্রিন, নিরাপদ এলাকার ইনসেট উপেক্ষা করে
    PWModalWindowPositionDefault    // ডিফল্ট অবস্থান (স্ক্রিনের কেন্দ্র, নিরাপদ এলাকার মধ্যে)
};
```

নীচের উদাহরণটি স্ক্রিনের শীর্ষে প্রদর্শিত একটি মোডাল রিচ মিডিয়া দেখাচ্ছে।

<div style={{ display: "flex", justifyContent: "center" }}>
<video src="/ios-push-notifications-ios-modal-rich-media-2.webm" title="উদাহরণ" autoplay loop muted playsinline width="300" />
</div>

মোডাল রিচ মিডিয়া শো অ্যানিমেশনগুলির মধ্যে রয়েছে:

```objective-c
typedef NS_ENUM(NSInteger, PresentModalWindowAnimation) {
    PWAnimationPresentFromBottom,
    PWAnimationPresentFromTop,
    PWAnimationPresentFromRight,
    PWAnimationPresentFromLeft,
    PWAnimationPresentNone
};
```

মোডাল রিচ মিডিয়া ক্লোজ অ্যানিমেশনগুলির মধ্যে রয়েছে:

```objective-c
typedef NS_ENUM(NSInteger, DismissModalWindowAnimation) {
    PWAnimationDismissDown,
    PWAnimationDismissUp,
    PWAnimationDismissLeft,
    PWAnimationDismissRight,
    PWAnimationCurveEaseInOut,
    PWAnimationDismissNone,

    /**
     * ডিফল্ট ডিসমিস অ্যানিমেশন হলো `PWAnimationCurveEaseInOut`
     */
    PWAnimationDismissDefault
};
```

নীচের উদাহরণটি স্ক্রিনের নীচে বাম থেকে ডানে শো অ্যানিমেশন এবং ডানদিকে ক্লোজ অ্যানিমেশন সহ মোডাল রিচ মিডিয়া প্রদর্শন করে:

<div style={{ display: "flex", justifyContent: "center" }}>
<video src="/ios-push-notifications-ios-modal-rich-media-3.webm" title="উদাহরণ" autoplay loop muted playsinline width="300" />
</div>

### মোডাল রিচ মিডিয়ার জন্য অতিরিক্ত প্যারামিটার

<Aside type="tip">
নিম্নলিখিত API Pushwoosh iOS SDK সংস্করণ **7.0.14** থেকে উপলব্ধ।
</Aside>

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

<Tabs>
<TabItem label="Swift">
```swift
// Haptic Feedback Type
Pushwoosh.media.modalRichMedia.setHapticFeedbackType(.PWHapticFeedbackLight)

// Swipe directions to dismiss
Pushwoosh.media.modalRichMedia.setDismissSwipeDirections([
    NSNumber(value: DismissSwipeDirection.PWSwipeDismissDown.rawValue),
    NSNumber(value: DismissSwipeDirection.PWSwipeDismissUp.rawValue)
])

// Set Rich Media corner radius
let topCorners = PWCornerTypeTopLeft.rawValue | PWCornerTypeTopRight.rawValue
Pushwoosh.media.modalRichMedia.setCornerType(CornerType(rawValue: topCorners), withRadius: 16)

// Close Modal Rich Media after N seconds
Pushwoosh.media.modalRichMedia.closeAfter(3)
```
</TabItem>
<TabItem label="Objective-C">
```objective-c
// Haptic Feedback Type
[[[Pushwoosh media] modalRichMedia] setHapticFeedbackType:PWHapticFeedbackLight];

// Swipe directions to dismiss
[[[Pushwoosh media] modalRichMedia] setDismissSwipeDirections:@[
    @(PWSwipeDismissDown),
    @(PWSwipeDismissUp)
]];

// Set Rich Media corner radius
CornerType topCorners = PWCornerTypeTopLeft | PWCornerTypeTopRight;
[[[Pushwoosh media] modalRichMedia] setCornerType:topCorners withRadius:16.0];

// Close Modal Rich Media after N seconds
[[[Pushwoosh media] modalRichMedia] closeAfter:3.0];
```
</TabItem>
</Tabs>

**হ্যাপটিক ফিডব্যাক টাইপ:**

```objective-c
typedef NS_ENUM(NSInteger, HapticFeedbackType) {
    PWHapticFeedbackLight,         // হালকা ভাইব্রেশন ফিডব্যাক
    PWHapticFeedbackMedium,        // মাঝারি ভাইব্রেশন ফিডব্যাক
    PWHapticFeedbackHard,          // শক্তিশালী ভাইব্রেশন ফিডব্যাক
    PWHapticFeedbackNone           // ভাইব্রেশন বন্ধ (ডিফল্ট)
};
```

**সোয়াইপ দিকনির্দেশ:**

```objective-c
typedef NS_ENUM(NSInteger, DismissSwipeDirection) {
    PWSwipeDismissDown,
    PWSwipeDismissUp,
    PWSwipeDismissLeft,
    PWSwipeDismissRight,
    PWSwipeDismissNone
};
```

## PWRichMediaPresentingDelegate

<Aside type="tip">
`Pushwoosh.media.modalRichMedia.delegate`-এর মাধ্যমে ডেলিগেট API SDK সংস্করণ **7.0.14** থেকে উপলব্ধ।
</Aside>

মোডাল রিচ মিডিয়ার কিউ পরিচালনা করতে, আপনাকে `PWRichMediaPresentingDelegate`-এর ডেলিগেট মেথডগুলি প্রয়োগ করতে হবে। এই কার্যকারিতা ব্যবহার করার সময়, মোডাল রিচ মিডিয়াগুলি ক্রমানুসারে উপস্থাপিত হয় এবং ব্যবহারকারী বর্তমানটি বন্ধ না করা পর্যন্ত পরবর্তীটি প্রদর্শিত হবে না। ব্যবহারকারী উপস্থাপিত রিচ মিডিয়াটি বন্ধ করার পরে, পরবর্তীটি, যা একটি ভিন্ন পুশ নোটিফিকেশনের অংশ ছিল, দেখানো হবে।

<Tabs>
<TabItem label="Swift">
```swift
import UIKit
import PushwooshFramework

@main
class AppDelegate: UIResponder, UIApplicationDelegate, PWRichMediaPresentingDelegate {

    var richMediaQueue: [PWRichMedia] = []
    var isPresenting = false

    func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        // মোডাল রিচ মিডিয়া কনফিগার করুন
        Pushwoosh.media.setRichMediaPresentationStyle(.modal)
        Pushwoosh.media.modalRichMedia.configure(
            position: .PWModalWindowPositionBottom,
            presentAnimation: .PWAnimationPresentFromBottom,
            dismissAnimation: .PWAnimationDismissDown
        )

        // ডেলিগেট সেট করুন
        Pushwoosh.media.modalRichMedia.delegate = self

        Pushwoosh.configure.registerForPushNotifications()
        return true
    }

    // MARK: - PWRichMediaPresentingDelegate

    func richMediaManager(_ richMediaManager: PWRichMediaManager, shouldPresent richMedia: PWRichMedia) -> Bool {
        if !richMediaQueue.contains(where: { $0 === richMedia }) {
            richMediaQueue.append(richMedia)
        }
        return !isPresenting
    }

    func richMediaManager(_ richMediaManager: PWRichMediaManager, didPresent richMedia: PWRichMedia) {
        isPresenting = true
    }

    func richMediaManager(_ richMediaManager: PWRichMediaManager, didClose richMedia: PWRichMedia) {
        isPresenting = false

        if let idx = richMediaQueue.firstIndex(where: { $0 === richMedia }) {
            richMediaQueue.remove(at: idx)
        }

        // কিউ-তে পরবর্তী রিচ মিডিয়া উপস্থাপন করুন
        if let nextRichMedia = richMediaQueue.first {
            Pushwoosh.media.modalRichMedia.present(nextRichMedia)
        }
    }

    func richMediaManager(_ richMediaManager: PWRichMediaManager, presentingDidFailFor richMedia: PWRichMedia, withError error: Error) {
        richMediaManager(richMediaManager, didClose: richMedia)
    }
}
```
</TabItem>
<TabItem label="Objective-C">
```objective-c
#import "AppDelegate.h"
#import <PushwooshFramework/PushwooshFramework.h>

@interface AppDelegate () <PWRichMediaPresentingDelegate>

@property (nonatomic, strong) NSMutableArray<PWRichMedia *> *richMediaQueue;
@property (nonatomic, assign) BOOL isPresenting;

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application
        didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    self.richMediaQueue = [NSMutableArray array];
    self.isPresenting = NO;

    // মোডাল রিচ মিডিয়া কনফিগার করুন
    [[Pushwoosh media] setRichMediaPresentationStyle:PWRichMediaPresentationStyleModal];
    [[[Pushwoosh media] modalRichMedia] configureWithPosition:PWModalWindowPositionBottom
                                             presentAnimation:PWAnimationPresentFromBottom
                                             dismissAnimation:PWAnimationDismissDown];

    // ডেলিগেট সেট করুন
    [[[Pushwoosh media] modalRichMedia] setDelegate:self];

    [[Pushwoosh configure] registerForPushNotifications];
    return YES;
}

#pragma mark - PWRichMediaPresentingDelegate

- (BOOL)richMediaManager:(PWRichMediaManager *)richMediaManager shouldPresentRichMedia:(PWRichMedia *)richMedia {
    if (![self.richMediaQueue containsObject:richMedia]) {
        [self.richMediaQueue addObject:richMedia];
    }
    return !self.isPresenting;
}

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

- (void)richMediaManager:(PWRichMediaManager *)richMediaManager didCloseRichMedia:(PWRichMedia *)richMedia {
    self.isPresenting = NO;

    [self.richMediaQueue removeObject:richMedia];

    // কিউ-তে পরবর্তী রিচ মিডিয়া উপস্থাপন করুন
    if (self.richMediaQueue.count > 0) {
        [[[Pushwoosh media] modalRichMedia] presentRichMedia:self.richMediaQueue.firstObject];
    }
}

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

@end
```
</TabItem>
</Tabs>