# iOS मोडल रिच मीडिया

Pushwoosh SDK संस्करण 6.7.5 से, आप **मोडल रिच मीडिया** भेज सकते हैं।

हम नए **मोडल रिच मीडिया** पेश कर रहे हैं, जिन्हें अनुकूलित किया जा सकता है। नए मोडल रिच मीडिया स्क्रीन को पूरी तरह से ब्लॉक नहीं करते हैं और स्क्रीन के विभिन्न हिस्सों (ऊपर, नीचे, और केंद्र) में स्थित किए जा सकते हैं।

> रिच मीडिया पृष्ठों पर अधिक जानकारी के लिए, कृपया [हमारी गाइड](/hi/product/content/rich-media) देखें।

## कॉन्फ़िगरेशन

<Aside type="note">
 डिफ़ॉल्ट रूप से, Pushwoosh iOS SDK लीगेसी रिच मीडिया को प्रदर्शित करने का समर्थन करता है।
</Aside>

<Aside type="note">
यदि आप Customer Journey Builder में इन-ऐप संदेशों के रूप में मोडल रिच मीडिया डिस्प्ले का उपयोग करने की योजना बना रहे हैं, तो सुनिश्चित करें कि आपने नीचे दिखाए गए कोड को लागू किया है। विवरण के लिए [बेसिक SDK इंटीग्रेशन](/hi/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/basic-integration-guide/) देखें।
</Aside>

```swift
//साइलेंट पुश नोटिफिकेशन के लिए
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    Pushwoosh.configure.handlePushReceived(userInfo)
    completionHandler(.noData)
}
```

### विकल्प 1: 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>
```

### विकल्प 2: प्रोग्रामेटिक कॉन्फ़िगरेशन (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 {

    // मोडल प्रस्तुति शैली सेट करें
    Pushwoosh.media.setRichMediaPresentationStyle(.modal)

    // मोडल विंडो की उपस्थिति को कॉन्फ़िगर करें
    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 {

    // मोडल प्रस्तुति शैली सेट करें
    [[Pushwoosh media] setRichMediaPresentationStyle:PWRichMediaPresentationStyleModal];

    // मोडल विंडो की उपस्थिति को कॉन्फ़िगर करें
    [[[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
/**
 मोडल विंडो प्रदर्शित करने के लिए संभावित स्थितियों को परिभाषित करने वाला एनम।

 - `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
// हैप्टिक फीडबैक प्रकार
Pushwoosh.media.modalRichMedia.setHapticFeedbackType(.PWHapticFeedbackLight)

// खारिज करने के लिए स्वाइप दिशाएं
Pushwoosh.media.modalRichMedia.setDismissSwipeDirections([
    NSNumber(value: DismissSwipeDirection.PWSwipeDismissDown.rawValue),
    NSNumber(value: DismissSwipeDirection.PWSwipeDismissUp.rawValue)
])

// रिच मीडिया कॉर्नर रेडियस सेट करें
let topCorners = PWCornerTypeTopLeft.rawValue | PWCornerTypeTopRight.rawValue
Pushwoosh.media.modalRichMedia.setCornerType(CornerType(rawValue: topCorners), withRadius: 16)

// N सेकंड के बाद मोडल रिच मीडिया बंद करें
Pushwoosh.media.modalRichMedia.closeAfter(3)
```
</TabItem>
<TabItem label="Objective-C">
```objective-c
// हैप्टिक फीडबैक प्रकार
[[[Pushwoosh media] modalRichMedia] setHapticFeedbackType:PWHapticFeedbackLight];

// खारिज करने के लिए स्वाइप दिशाएं
[[[Pushwoosh media] modalRichMedia] setDismissSwipeDirections:@[
    @(PWSwipeDismissDown),
    @(PWSwipeDismissUp)
]];

// रिच मीडिया कॉर्नर रेडियस सेट करें
CornerType topCorners = PWCornerTypeTopLeft | PWCornerTypeTopRight;
[[[Pushwoosh media] modalRichMedia] setCornerType:topCorners withRadius:16.0];

// N सेकंड के बाद मोडल रिच मीडिया बंद करें
[[[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>