# الأنشطة المباشرة في iOS

<Aside type="tip">
شاهد فيديو عن الأنشطة المباشرة في iOS
<YouTube id="jRrDh_pIZCE" playlabel="فيديو يوتيوب: الأنشطة المباشرة في iOS" /> 
</Aside>


تعرض [الأنشطة المباشرة (Live Activities)](https://developer.apple.com/design/human-interface-guidelines/live-activities) أحدث بيانات تطبيقك على شاشة القفل في iPhone أو iPad وفي الجزيرة الديناميكية (Dynamic Island). تتيح هذه الميزة للمستخدمين رؤية المعلومات المباشرة بلمحة سريعة وتنفيذ إجراءات سريعة تتعلق بالمعلومات المعروضة.

إليك بعض الأمثلة على استخدام الأنشطة المباشرة:

*   إظهار حالة الطلب في تطبيق توصيل؛
*   توفير عد تنازلي في الوقت الفعلي في تطبيق تدريب؛
*   إظهار معلومات التتبع في تطبيق سيارات الأجرة؛
*   عرض إحصائيات اللعبة والنتائج الحالية في تطبيق رياضي؛
*   توفير توقعات الطقس كل ساعة في تطبيق الطقس.

يمكنك تمكين الأنشطة المباشرة باستخدام Pushwoosh iOS SDK كما هو موضح أدناه. لإدارة الأنشطة المباشرة وتحديث محتواها، استخدم طريقة [/updateLiveActivity](/ar/developer/api-reference/ios-live-activities-api#updateliveactivity).



## الإعداد 
<Aside type="caution" title="هام" >
تدعم الأنشطة المباشرة في Pushwoosh فقط [الإعداد القائم على الرمز المميز (token-based configuration)](/ar/developer/first-steps/connect-messaging-services/ios-configuration/ios-token-based-configuration/). [الإعداد القائم على الشهادة (certificate-based configuration)](/ar/developer/first-steps/connect-messaging-services/ios-configuration/ios-platform-configuration/) غير مدعوم.
</Aside> 

### إضافة ملحق واجهة المستخدم (Widget Extension)

1.  إنشاء هدف جديد

اذهب إلى **File > New > Target** واختر **Widget Extension**.

<img src="/ios-push-notifications-ios-live-activities-1.webp" alt=""/>

2.  إعداد ملحق الواجهة المستخدم (Widget Extension)
الرجاء إدخال اسم والتأكد من تحديد **Include Live Activity** والنقر على **Finish**.

<img src="/ios-push-notifications-ios-live-activities-2.webp" alt=""/>

###  إعداد Info.plist
ابحث عن ملف Info.plist في الهدف الأساسي، وأدرج مفتاح "Supports Live Activities"، واضبط قيمته على YES.

```xml
	<key>NSSupportsLiveActivities</key>
	<true/>
```

###  تمكين الأنشطة المباشرة من التطبيق
لتمكين الأنشطة المباشرة، أضف الكود الخاص بها إلى ملحق الواجهة المستخدم الحالي أو أنشئ واحدًا جديدًا إذا لم يكن لدى تطبيقك واحد بالفعل. تستخدم الأنشطة المباشرة وظائف [SwiftUI](https://developer.apple.com/documentation/SwiftUI) و [WidgetKit](https://developer.apple.com/documentation/WidgetKit) لواجهة المستخدم الخاصة بها. يعالج ActivityKit دورة حياة كل نشاط مباشر: يتم استخدام واجهة برمجة التطبيقات (API) الخاصة به لطلب وتحديث وإنهاء نشاط مباشر واستلام إشعارات الدفع من ActivityKit. يمكنك معرفة المزيد عن الأنشطة المباشرة في [وثائق Apple](https://developer.apple.com/documentation/activitykit/displaying-live-data-with-live-activities).

 1. انتقل إلى ملف ContentView لمشروعك في Xcode وأنشئ زرًا

```swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack(spacing: 20) {

            Button(action: {
                LiveActivityManager.shared.startActivity()
            }, label: {
                Text("Start Live Activity")
                    .foregroundColor(.white)
                    .padding()
                    .background(Color.blue)
                    .cornerRadius(10)
            })
        }
        .padding()
    }
}

#Preview {
    ContentView()
}
```
<img src="/ios-push-notifications-ios-live-activities-4.webp" alt=""/>

 2. أنشئ ملف LiveActivityManager.swift لإدارة الأنشطة المباشرة

```swift
import Foundation
import ActivityKit
import UIKit
import PushwooshFramework
import PushwooshLiveActivities

class LiveActivityManager: NSObject, ObservableObject {
    public static let shared: LiveActivityManager = LiveActivityManager()

    private var currentActivity: Activity<FoodDeliveryAttributes>? = nil

    override init() {
        super.init()
    }

    func startActivity() {
        guard ActivityAuthorizationInfo().areActivitiesEnabled else {
            print("You can't start live activity.")
            return
        }
        do {
            let pushwooshData = PushwooshLiveActivityAttributeData(activityId: "activity_id")
            let atttribute = FoodDeliveryAttributes(orderNumber: "1234567", pushwoosh: pushwooshData)
            let initialState = FoodDeliveryAttributes.ContentState(
                status: "Preparing your meal",
                estimatedTime: "25 min",
                emoji: "👨‍🍳",
                pushwoosh: nil
            )
            let activity = try Activity<FoodDeliveryAttributes>.request(
                attributes: atttribute,
                content: .init(state:initialState , staleDate: nil),
                pushType: .token
            )
            self.currentActivity = activity

            Task {
                for await pushToken in activity.pushTokenUpdates {
                    let pushTokenString = pushToken.reduce("") {
                        $0 + String(format: "%02x", $1)
                    }
                    print("Activity:\(activity.id) push token: \(pushTokenString)")

                    // MARK: - Send Push Token to Pushwoosh
                    Pushwoosh.LiveActivities.startLiveActivity(
                        token: pushTokenString,
                        activityId: "activity_id"
                    )
                }
            }
        } catch {
            print("Start Activity Error: \(error.localizedDescription)")
        }
    }
}

```

 3. هذا كل شيء، الآن نقوم بتشغيل المشروع ونضغط على زر 'Start Live Activity'. ثم ننتقل إلى شاشة القفل ونرى النشاط المباشر الذي تم إنشاؤه.


<img src="/live-activities-1.webp" alt=""/>

### بدء نشاط مباشر بإشعار دفع عن بعد

1.  لبدء نشاط مباشر عبر إشعار دفع عن بعد، تحتاج إلى إرسال الرمز المميز `pushToStartTokenUpdates` إلى Pushwoosh.

```swift
func getPushToStartToken() {
    if #available(iOS 17.2, *) {
        Task {
            for await data in Activity<LiveActivityAttributes>.pushToStartTokenUpdates {
                let token = data.map {String(format: "%02x", $0)}.joined()
                print("Activity PushToStart Token: \(token)")

                // Send `pushToStartTokenUpdates` token to Pushwoosh
                try await Pushwoosh.LiveActivities.sendPushToStartLiveActivity(token: token)
            }
        }
    }
}
```
2.  بدء نشاط مباشر بإشعار دفع عن بعد

<Aside type="tip">
 اتبع [مرجع Pushwoosh API](/ar/developer/api-reference/ios-live-activities-api#startliveactivity) للحصول على تعليمات وأمثلة حول كيفية تقديم طلب لبدء نشاط مباشر عن بعد.
</Aside>

### إدارة الأنشطة المباشرة 

يوفر Pushwoosh iOS SDK الطرق التالية للعمل مع الأنشطة المباشرة:

```swift
// Send Live Activity Push To Start Token to Pushwoosh
static func sendPushToStartLiveActivity(token: String)
static func sendPushToStartLiveActivity(token: String, completion: @escaping (Error?) -> Void)

// Start Live Activity Methods with Activity ID
static func startLiveActivity(token: String, activityId: String)
static func startLiveActivity(token: String, activityId: String, completion: @escaping (Error?) -> Void)

// Stop Live Activity Methods
static func stopLiveActivity()
static func stopLiveActivity(completion: @escaping (Error?) -> Void)

static func stopLiveActivity(activityId: String)
static func stopLiveActivity(activityId: String, completion: @escaping (Error?) -> Void)

```

يمكنك أيضًا تحديث الأنشطة المباشرة حسب الشرائح باستخدام معامل `Activity ID`. عند إنشاء نشاط، تحتاج إلى تمرير معامل `Activity ID` فريد في الطريقة، والذي سيكون ذا صلة بشريحة مستخدمين معينة.

على سبيل المثال، اشترك N من المستخدمين في نفس الحدث في نشاط مباشر. من الضروري أن يكون معامل `Activity ID` فريدًا لجميع هؤلاء المستخدمين N.

عند الانتهاء من العمل مع نشاط مباشر، استخدم هذه الطرق:
```swift
static func stopLiveActivity()
static func stopLiveActivity(completion: @escaping (Error?) -> Void)
```
<Aside type="note">
 يمكنك إدارة الأنشطة المباشرة في iOS عبر [Pushwoosh API](/ar/developer/api-reference/ios-live-activities-api).
</Aside>

### طريقة `Setup()`
يبسط Pushwoosh نقل معرفات النشاط عن طريق تقديم دالة `PushwooshLiveActivities.setup`، التي تتعامل مع دورة حياة النشاط المباشر بأكملها داخل التطبيق. تستمع هذه الدالة تلقائيًا إلى تحديثات الرموز المميزة `pushToStart` و `pushToUpdate`. باستخدام هذه الطريقة، لم يعد التطبيق بحاجة إلى تتبع بدء الأنشطة المباشرة يدويًا أو إدارة تحديثات الرموز المميزة لتحديثات النشاط.

نوصي باستخدام هذه الطريقة لأنها تتعامل مع كل إدارة الرموز المميزة من جانبنا، مما يقلل من كمية الكود الذي تحتاج إلى صيانته من جانبك. هذا يبسط التكامل ويضمن تجربة أكثر سلاسة وكفاءة لتطبيقك.

في AppDelegate، تأكد من استيراد `PushwooshFramework` و `PushwooshLiveActivities` واستدعاء طريقة `setup` من وحدة `Pushwoosh.LiveActivities`.

**AppDelegate.swift**
```swift
if #available(iOS 16.1, *) {
    Pushwoosh.LiveActivities.setup(FoodDeliveryAttributes.self)
}
```
**FoodDeliveryAttributes**

```swift
import WidgetKit
import SwiftUI
import ActivityKit
import PushwooshFramework
import PushwooshLiveActivities

struct FoodDeliveryAttributes: PushwooshLiveActivityAttributes {
    public struct ContentState: PushwooshLiveActivityContentState {
        var status: String
        var estimatedTime: String
        var emoji: String
        var pushwoosh: PushwooshLiveActivityContentStateData?
    }

    var orderNumber: String
    var pushwoosh: PushwooshLiveActivityAttributeData
}
```
`FoodDeliveryAttributes`: يتوافق هذا الهيكل مع بروتوكول `PushwooshLiveActivityAttributes`. يتم استخدامه لتحديد سمات النشاط المباشر داخل التطبيق.

<Aside type="note">
 يمكنك إدارة الأنشطة المباشرة وتحديث محتواها باستخدام طريقة /updateLiveActivity من Pushwoosh API. لمزيد من المعلومات، يرجى قراءة [هذا الدليل](/ar/developer/api-reference/ios-live-activities-api)
</Aside>

## دليل الترحيل

بدءًا من الإصدار 6.8.0 من Pushwoosh iOS SDK، قمنا بتحديث بنية SDK. يتم الآن الوصول إلى طرق الأنشطة المباشرة من خلال وحدة `PushwooshLiveActivities`.

إذا كنت تستخدم إصدارًا من Pushwoosh iOS SDK أقدم من 6.8.0 وكنت تستدعي الطرق المدرجة أدناه، وقمت بالتحديث إلى الإصدار 6.8.0 أو أحدث، يرجى ملاحظة التغييرات التالية:

```swift
static func setup<Attributes: PushwooshLiveActivityAttributes>(_ activityType: Attributes.Type)
static func defaultSetup()
static func defaultStart(_ activityId: String, attributes: [String: Any], content: [String: Any])
```

الآن، للوصول إلى هذه الطرق، يجب عليك استخدام وحدة LiveActivity.

```swift
import PushwooshFramework
import PushwooshLiveActivities

```

```swift
Pushwoosh.LiveActivities.setup(FoodDeliveryAttributes.self)
Pushwoosh.LiveActivities.defaultSetup()
Pushwoosh.LiveActivities.defaultStart("activity_id",
                            attributes: ["key_attribute": "value_attribute"],
                            content: ["key_content": "value_content"])
```

لقد حافظنا أيضًا على دعم الطرق من خلال `Pushwoosh.sharedInstance()` كما هو موضح أدناه، ولكن يرجى ملاحظة أن هذه الطرق سيتم إيقافها في الإصدارات المستقبلية.

``` swift
// Send Live Activity Push To Start Token to Pushwoosh
static func sendPushToStartLiveActivity(token: String)
static func sendPushToStartLiveActivity(token: String, completion: @escaping (Error?) -> Void)

// Start Live Activity Methods with Activity ID
static func startLiveActivity(token: String, activityId: String)
static func startLiveActivity(token: String, activityId: String, completion: @escaping (Error?) -> Void)

// Stop Live Activity Methods
static func stopLiveActivity()
static func stopLiveActivity(completion: @escaping (Error?) -> Void)

static func stopLiveActivity(activityId: String)
static func stopLiveActivity(activityId: String, completion: @escaping (Error?) -> Void)
```