# الوسائط الغنية المشروطة لنظام iOS

بدءًا من إصدار Pushwoosh SDK 6.7.5، لديك القدرة على إرسال **الوسائط الغنية المشروطة (Modal Rich Media)**.

نحن نقدم **وسائط غنية مشروطة (Modal Rich Media)** جديدة يمكن تخصيصها. الوسائط الغنية المشروطة الجديدة لا تحجب الشاشة بالكامل ويمكن وضعها في أجزاء مختلفة من الشاشة (أعلى، أسفل، وفي المنتصف).

> لمزيد من المعلومات حول صفحات الوسائط الغنية، يرجى الرجوع إلى [دليلنا](/ar/product/content/rich-media).

## الإعدادات

<Aside type="note">
 بشكل افتراضي، يدعم Pushwoosh iOS SDK عرض الوسائط الغنية القديمة.
</Aside>

<Aside type="note">
إذا كنت تخطط لاستخدام عرض الوسائط الغنية المشروطة كرسائل داخل التطبيق في Customer Journey Builder، تأكد من أنك قمت بتنفيذ الكود الموضح أدناه. راجع [التكامل الأساسي لـ SDK](/ar/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)
}
```

### الخيار 1: إعدادات Info.plist

لتمكين عرض الوسائط الغنية المشروطة، قم بتعيين المعلمة `Pushwoosh_RICH_MEDIA_STYLE` في ملف **info.plist** الخاص بك وقم بتعيين القيمة `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 {

    // 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 defining the possible positions for displaying a modal window.

 - `PWModalWindowPositionTop`: The modal window appears at the top of the screen, within the safe area.
 - `PWModalWindowPositionCenter`: The modal window appears at the center of the screen, within the safe area.
 - `PWModalWindowPositionBottom`: The modal window appears at the bottom of the screen, within the safe area.
 - `PWModalWindowPositionBottomSheet`: The modal window appears at the very bottom of the screen, ignoring the safe area.
 - `PWModalWindowPositionDefault`: The default position is the center of the screen, within the safe area.
 */
typedef NS_ENUM(NSInteger, ModalWindowPosition) {
    PWModalWindowPositionTop,       // Appears at the top of the screen (within safe area)
    PWModalWindowPositionCenter,    // Appears at the center of the screen (within safe area)
    PWModalWindowPositionBottom,    // Appears at the bottom of the screen (within safe area)
    PWModalWindowPositionBottomSheet, // Appears at the very bottom of the screen (ignores safe area)
    PWModalWindowPositionFullScreen, // Fullscreen, ignores safe area insets
    PWModalWindowPositionDefault    // Default position (center of the screen, within safe area)
};
```

المثال أدناه يوضح وسائط غنية مشروطة معروضة في الجزء العلوي من الشاشة.

<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,

    /**
     * Default dismiss animation is `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,         // Light vibration feedback
    PWHapticFeedbackMedium,        // Medium vibration feedback
    PWHapticFeedbackHard,          // Strong vibration feedback
    PWHapticFeedbackNone           // Vibration is off (default)
};
```

**اتجاهات السحب:**

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

## PWRichMediaPresentingDelegate

<Aside type="tip">
الـ API الخاص بالمفوض عبر `Pushwoosh.media.modalRichMedia.delegate` متاح منذ إصدار SDK **7.0.14**.
</Aside>

لإدارة قائمة انتظار الوسائط الغنية المشروطة، تحتاج إلى تنفيذ أساليب المفوض (delegate) الخاصة بـ `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 {

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

        // Set delegate
        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)
        }

        // Present next rich media in queue
        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;

    // Configure modal rich media
    [[Pushwoosh media] setRichMediaPresentationStyle:PWRichMediaPresentationStyleModal];
    [[[Pushwoosh media] modalRichMedia] configureWithPosition:PWModalWindowPositionBottom
                                             presentAnimation:PWAnimationPresentFromBottom
                                             dismissAnimation:PWAnimationDismissDown];

    // Set delegate
    [[[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];

    // Present next rich media in queue
    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>