# مقاطع التطبيق لـ iOS

تتيح مقاطع التطبيق (App Clips) للمستخدمين إكمال مهمة بسرعة دون تنزيل تطبيقك الكامل. مع Pushwoosh، يمكنك إرسال إشعارات لحظية لمستخدمي مقاطع التطبيق — يمنح iOS تلقائيًا **وصولاً للإشعارات لمدة 8 ساعات** عند فتح مقطع التطبيق.


## ما الذي تحتاجه

- Pushwoosh iOS SDK **7.0.33+**
- Xcode 15+
- **تطبيق Pushwoosh منفصل** لمقطع التطبيق الخاص بك (معرف حزمة مختلف = تطبيق منفصل)
- جهاز حقيقي للاختبار (رموز الإشعارات اللحظية لا تعمل على المحاكي)

## 1. إنشاء تطبيق Pushwoosh

مقطع التطبيق الخاص بك له معرف حزمة (bundle ID) مختلف (على سبيل المثال `com.yourapp.Clip`)، لذا فهو يحتاج إلى **تطبيق Pushwoosh منفصل** بمفتاح APNs الخاص به.

1. اذهب إلى [لوحة تحكم Pushwoosh](https://app.pushwoosh.com/)
2. أنشئ تطبيقًا جديدًا باستخدام معرف حزمة مقطع التطبيق
3. حمّل مفتاح مصادقة APNs الخاص بك
4. انسخ **رمز التطبيق (Application Code)** و **رمز API (API Token)**



## 2. إنشاء هدف (target) لمقطع التطبيق

1. في Xcode: **File → New → Target → App Clip**
2. أضف قدرة **Push Notifications** إلى هدف مقطع التطبيق

للحصول على لقطات شاشة مفصلة لإضافة القدرات، راجع [دليل التكامل الأساسي](/ar/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk-7-0/basic-integration-guide/).


## 3. إضافة أطر عمل Pushwoosh

في هدف مقطع التطبيق، ضمن **Build Phases → Link Binary With Libraries**، أضف:

- `PushwooshFramework.framework`
- `PushwooshCore.framework`
- `PushwooshBridge.framework`


## 4. تكوين Info.plist

```xml
<!-- Pushwoosh -->
<key>Pushwoosh_APPID</key>
<string>XXXXX-XXXXX</string>
<key>Pushwoosh_API_TOKEN</key>
<string>YOUR_API_TOKEN</string>

<!-- Ephemeral push (8-hour auto-grant, no dialog) -->
<key>NSAppClip</key>
<dict>
    <key>NSAppClipRequestEphemeralUserNotification</key>
    <true/>
    <key>NSAppClipRequestLocationConfirmation</key>
    <false/>
</dict>

<key>UIBackgroundModes</key>
<array>
    <string>remote-notification</string>
</array>
```



## 5. تهيئة SDK

<Tabs>
<TabItem label="SwiftUI">
```swift
import SwiftUI
import PushwooshFramework

class AppClipDelegate: NSObject, UIApplicationDelegate, PWMessagingDelegate {

    func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {
        Pushwoosh.configure.delegate = self
        Pushwoosh.configure.registerForPushNotifications()
        return true
    }

    func application(_ application: UIApplication,
                     didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        Pushwoosh.configure.handlePushRegistration(deviceToken)
    }

    func application(_ application: UIApplication,
                     didFailToRegisterForRemoteNotificationsWithError error: Error) {
        Pushwoosh.configure.handlePushRegistrationFailure(error as NSError)
    }

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

    func pushwoosh(_ pushwoosh: Pushwoosh, onMessageOpened message: PWMessage) {
        print("Push opened: \(message.payload ?? [:])")
    }
}

@main
struct YourAppClip: App {
    @UIApplicationDelegateAdaptor(AppClipDelegate.self) var appDelegate

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
```
</TabItem>
<TabItem label="UIKit">
```swift
import UIKit
import PushwooshFramework

@main
class AppDelegate: UIResponder, UIApplicationDelegate, PWMessagingDelegate {

    func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        Pushwoosh.configure.delegate = self
        Pushwoosh.configure.registerForPushNotifications()
        return true
    }

    func application(_ application: UIApplication,
                     didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        Pushwoosh.configure.handlePushRegistration(deviceToken)
    }

    func application(_ application: UIApplication,
                     didFailToRegisterForRemoteNotificationsWithError error: Error) {
        Pushwoosh.configure.handlePushRegistrationFailure(error as NSError)
    }

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

    func pushwoosh(_ pushwoosh: Pushwoosh, onMessageOpened message: PWMessage) {
        print("Push opened: \(message.payload ?? [:])")
    }
}
```
</TabItem>
</Tabs>

مع الأذونات المؤقتة، يمنح iOS الوصول إلى الإشعارات اللحظية لمدة 8 ساعات تلقائيًا. إذا كنت ترغب في استخدام الوضع المؤقت **دون إظهار مربع حوار طلب الإذن**، فاستدعِ `UIApplication.shared.registerForRemoteNotifications()` مباشرةً بدلاً من `Pushwoosh.configure.registerForPushNotifications()`.

لطلب إذن **دائم** للإشعارات اللحظية (مربع الحوار القياسي)، استخدم `Pushwoosh.configure.registerForPushNotifications()` كما هو موضح أعلاه.



## أذونات الإشعارات اللحظية المؤقتة

عندما يفتح المستخدم مقطع التطبيق الخاص بك، يمنح iOS الوصول إلى الإشعارات اللحظية لمدة **8 ساعات** دون طلب. بعد 8 ساعات، تنتهي صلاحية الإذن. يجب على المستخدم إعادة فتح مقطع التطبيق للحصول على 8 ساعات أخرى.

للحصول على رمز إشعار لحظي لمدة 8 ساعات **دون إظهار مربع حوار طلب الإذن**:

```swift
UIApplication.shared.registerForRemoteNotifications()
```

للحصول على رمز إشعار لحظي **دائم** (يعرض مربع حوار طلب الإذن القياسي):

```swift
Pushwoosh.configure.registerForPushNotifications()
```

## القيود

| القيد | التفاصيل |
|---|---|
| **لا توجد إشعارات غنية** | لا يمكن لمقاطع التطبيق تضمين ملحق خدمة الإشعارات (Notification Service Extension) — لا صور، لا إشعارات تواصل (Communication Notifications) |
| **حد الحجم** | 15 ميجابايت (iOS 16) / 50 ميجابايت (iOS 17+) |
| **نافذة إشعارات لمدة 8 ساعات** | تنتهي صلاحية الإذن المؤقت بعد 8 ساعات |
| **لا توجد معالجة في الخلفية** | الإشعارات الصامتة (Silent push) لها وظائف محدودة |
| **معرف الجهاز (Device ID)** | `identifierForVendor` يُرجع أصفارًا — يتعامل SDK مع هذا تلقائيًا (7.0.33+) |



## كيف يبدو ذلك

<center>

<img src="/ios-appclip-push.png" alt="إشعار لحظي لمقطع تطبيق على iPhone" width="300" />

*إشعار لحظي تم استلامه في مقطع تطبيق بأذونات مؤقتة*

</center>