# iOS লাইভ অ্যাক্টিভিটিস

<Aside type="tip">
iOS লাইভ অ্যাক্টিভিটিস সম্পর্কে একটি ভিডিও দেখুন
<YouTube id="jRrDh_pIZCE" playlabel="ইউটিউব ভিডিও: iOS লাইভ অ্যাক্টিভিটিস" /> 
</Aside>


[লাইভ অ্যাক্টিভিটিস](https://developer.apple.com/design/human-interface-guidelines/live-activities) আপনার অ্যাপের সবচেয়ে সাম্প্রতিক ডেটা iPhone বা iPad-এর লক স্ক্রিনে এবং ডাইনামিক আইল্যান্ডে প্রদর্শন করে। এই ফিচারটি ব্যবহারকারীদের এক নজরে লাইভ তথ্য দেখতে এবং প্রদর্শিত তথ্যের সাথে সম্পর্কিত দ্রুত কাজ সম্পাদন করতে দেয়।

এখানে লাইভ অ্যাক্টিভিটিস ব্যবহারের কয়েকটি উদাহরণ দেওয়া হলো:

*   একটি ডেলিভারি অ্যাপে অর্ডারের স্ট্যাটাস দেখানো;
*   একটি ট্রেনিং অ্যাপে রিয়েল-টাইম কাউন্টডাউন প্রদান করা;
*   একটি ট্যাক্সি অ্যাপে ট্র্যাকিং তথ্য দেখানো;
*   একটি স্পোর্টস অ্যাপে গেমের পরিসংখ্যান এবং বর্তমান স্কোর প্রদর্শন করা;
*   একটি আবহাওয়া অ্যাপে ঘণ্টায় ঘণ্টায় পূর্বাভাস প্রদান করা।

আপনি নিচে বর্ণিত Pushwoosh iOS SDK ব্যবহার করে লাইভ অ্যাক্টিভিটিস সক্ষম করতে পারেন। লাইভ অ্যাক্টিভিটিস পরিচালনা করতে এবং তাদের বিষয়বস্তু আপডেট করতে, [/updateLiveActivity](/bn/developer/api-reference/ios-live-activities-api#updateliveactivity) মেথডটি ব্যবহার করুন।



## সেটআপ 
<Aside type="caution" title="গুরুত্বপূর্ণ" >
Pushwoosh-এ লাইভ অ্যাক্টিভিটিস শুধুমাত্র [টোকেন-ভিত্তিক কনফিগারেশন](/bn/developer/first-steps/connect-messaging-services/ios-configuration/ios-token-based-configuration/) সমর্থন করে। [সার্টিফিকেট-ভিত্তিক কনফিগারেশন](/bn/developer/first-steps/connect-messaging-services/ios-configuration/ios-platform-configuration/) সমর্থিত নয়।
</Aside> 

### একটি উইজেট এক্সটেনশন যোগ করুন

১. একটি নতুন টার্গেট তৈরি করুন

**File > New > Target**-এ যান এবং **Widget Extension** নির্বাচন করুন।

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

২. উইজেট এক্সটেনশন কনফিগারেশন
অনুগ্রহ করে একটি নাম লিখুন এবং **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/>
```

<Aside type="tip" title="ঘন ঘন আপডেট">
যদি আপনার লাইভ অ্যাক্টিভিটি ঘন ঘন আপডেট করা হয় (উদাহরণস্বরূপ, লাইভ স্পোর্টস স্কোর), তাহলে `NSSupportsLiveActivitiesFrequentUpdates` কী-টি `true` সেট করে যোগ করুন। অ্যাপল প্রতি ঘণ্টায় একটি অ্যাপ কতগুলি উচ্চ-অগ্রাধিকার পুশ আপডেট পাঠাতে পারে তার উপর একটি সীমা আরোপ করে। এই কী সেই বাজেট বাড়িয়ে দেয়। ডেলিভারি অগ্রাধিকার কীভাবে প্রতি আপডেটে নিয়ন্ত্রিত হয় তা জানতে [লাইভ অ্যাক্টিভিটিস API রেফারেন্সে](/bn/developer/api-reference/ios-live-activities-api/#time-sensitive-push-and-delivery-priority) `apns_priority` প্যারামিটারটি দেখুন।

```xml
	<key>NSSupportsLiveActivitiesFrequentUpdates</key>
	<true/>
```
</Aside>

###  অ্যাপ থেকে লাইভ অ্যাক্টিভিটিস সক্ষম করা
লাইভ অ্যাক্টিভিটিস সক্ষম করতে, আপনার বিদ্যমান উইজেট এক্সটেনশনে তাদের কোড যোগ করুন অথবা যদি আপনার অ্যাপে এটি না থাকে তবে একটি নতুন তৈরি করুন। লাইভ অ্যাক্টিভিটিস তাদের ইউজার ইন্টারফেসের জন্য [SwiftUI](https://developer.apple.com/documentation/SwiftUI) এবং [WidgetKit](https://developer.apple.com/documentation/WidgetKit) ফাংশনালিটি ব্যবহার করে। ActivityKit প্রতিটি লাইভ অ্যাক্টিভিটির জীবনচক্র পরিচালনা করে: এর API একটি লাইভ অ্যাক্টিভিটি অনুরোধ, আপডেট এবং শেষ করতে এবং ActivityKit পুশ নোটিফিকেশন গ্রহণ করতে ব্যবহৃত হয়। আপনি [অ্যাপল ডকুমেন্টেশনে](https://developer.apple.com/documentation/activitykit/displaying-live-data-with-live-activities) লাইভ অ্যাক্টিভিটিস সম্পর্কে আরও জানতে পারেন।

 ১. Xcode-এ আপনার প্রজেক্টের ContentView ফাইলে নেভিগেট করুন এবং একটি বাটন তৈরি করুন

```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=""/>

 ২. লাইভ অ্যাক্টিভিটিস পরিচালনা করার জন্য একটি 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)")
        }
    }
}

```

 ৩. এইটুকুই, এখন আমরা প্রজেক্টটি রান করি এবং 'Start Live Activity' বাটনে চাপ দিই। তারপর আমরা লক স্ক্রিনে নেভিগেট করি এবং তৈরি করা লাইভ অ্যাক্টিভিটি দেখতে পাই।


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

### একটি রিমোট পুশ নোটিফিকেশনের মাধ্যমে লাইভ অ্যাক্টিভিটি শুরু করুন

১. রিমোট পুশ নোটিফিকেশনের মাধ্যমে একটি লাইভ অ্যাক্টিভিটি শুরু করতে, আপনাকে Pushwoosh-এ pushToStartTokenUpdates টোকেন পাঠাতে হবে।

```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)
            }
        }
    }
}
```
২. একটি রিমোট পুশ নোটিফিকেশনের মাধ্যমে একটি লাইভ অ্যাক্টিভিটি শুরু করুন

<Aside type="tip">
 একটি লাইভ অ্যাক্টিভিটি দূরবর্তীভাবে শুরু করার জন্য অনুরোধ করার নির্দেশাবলী এবং উদাহরণের জন্য আমাদের [Pushwoosh API রেফারেন্স](/bn/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)

// Schedule a Live Activity to start at a future date (iOS 26.0+)
static func schedule<Attributes: PushwooshLiveActivityAttributes>(attributes: Attributes, contentState: Attributes.ContentState, at startDate: Date, alertTitle: String, alertBody: String) throws -> Activity<Attributes>

// Cancel a scheduled or running Live Activity by its Activity ID (iOS 16.2+)
static func cancel<Attributes: PushwooshLiveActivityAttributes>(_ activityType: Attributes.Type, activityId: String)

```

আপনি অ্যাক্টিভিটি আইডি প্যারামিটার ব্যবহার করে সেগমেন্ট দ্বারা লাইভ অ্যাক্টিভিটিস আপডেট করতে পারেন। একটি অ্যাক্টিভিটি তৈরি করার সময়, আপনাকে মেথডে একটি অনন্য অ্যাক্টিভিটি আইডি প্যারামিটার পাস করতে হবে, যা একটি নির্দিষ্ট ব্যবহারকারী সেগমেন্টের জন্য প্রাসঙ্গিক হবে।

উদাহরণস্বরূপ, N সংখ্যক ব্যবহারকারী একটি লাইভ অ্যাক্টিভিটিতে একই ইভেন্টে সাবস্ক্রাইব করেছেন। এটি প্রয়োজন যে অ্যাক্টিভিটি আইডি প্যারামিটারটি এই N সংখ্যক ব্যবহারকারীর সকলের জন্য অনন্য হতে হবে।

যখন আপনি একটি লাইভ অ্যাক্টিভিটির সাথে কাজ শেষ করবেন, তখন এই মেথডগুলি ব্যবহার করুন:
```swift
static func stopLiveActivity()
static func stopLiveActivity(completion: @escaping (Error?) -> Void)
```
<Aside type="note">
 আপনি [Pushwoosh API](/bn/developer/api-reference/ios-live-activities-api) এর মাধ্যমে iOS লাইভ অ্যাক্টিভিটিস পরিচালনা করতে পারেন।
</Aside>

### ভবিষ্যতে শুরু করার জন্য একটি লাইভ অ্যাক্টিভিটি শিডিউল করা

<Aside type="note">
iOS 26.0+ প্রয়োজন।
</Aside>

একটি লাইভ অ্যাক্টিভিটি অবিলম্বে শুরু করার পরিবর্তে, আপনি এটিকে ভবিষ্যতের একটি তারিখে শুরু করার জন্য শিডিউল করতে পারেন। `alertTitle` এবং `alertBody` ব্যবহারকারীকে স্থানীয় নোটিফিকেশন সতর্কবার্তায় দেখানো হয় যখন শিডিউল করা অ্যাক্টিভিটি আসলে শুরু হয়:

```swift
if #available(iOS 26.0, *) {
    let startDate = Date().addingTimeInterval(3600) // starts in 1 hour

    do {
        let activity = try Pushwoosh.LiveActivities.schedule(
            attributes: atttribute,
            contentState: initialState,
            at: startDate,
            alertTitle: "Game starting!",
            alertBody: "The match is about to begin"
        )
        self.currentActivity = activity
    } catch {
        print("Schedule Activity Error: \(error.localizedDescription)")
    }
}
```

`startDate` অবশ্যই ভবিষ্যতে হতে হবে, অন্যথায় কলটি থ্রো করবে। অ্যাপটি ফোরগ্রাউন্ডে থাকাকালীন মূল থ্রেডে `schedule` কল করুন। Pushwoosh-এ কোনো শিডিউল-টাইম অনুরোধ নেই: সার্ভার অ্যাক্টিভিটি সম্পর্কে জানতে পারে যখন এটি আসলে শুরু হয় এবং `setup()` মেথড দ্বারা ইনস্টল করা একই টোকেন পর্যবেক্ষকের মাধ্যমে তার পুশ টোকেন গ্রহণ করে (নিচে দেখুন)।

### অ্যাক্টিভিটি আইডি দ্বারা একটি লাইভ অ্যাক্টিভিটি বাতিল করা

<Aside type="note">
iOS 16.2+ প্রয়োজন।
</Aside>

`Activity` ইনস্ট্যান্সের একটি রেফারেন্স না ধরে তার অ্যাক্টিভিটি আইডি দ্বারা একটি লাইভ অ্যাক্টিভিটি বাতিল করতে `cancel(_:activityId:)` ব্যবহার করুন:

```swift
if #available(iOS 16.2, *) {
    Pushwoosh.LiveActivities.cancel(FoodDeliveryAttributes.self, activityId: "activity_id")
}
```

`cancel` ডিভাইসে অ্যাক্টিভিটিটি অবিলম্বে শেষ করে এবং Pushwoosh সার্ভারকে অবহিত করে। এটি `stopLiveActivity(activityId:)` থেকে ভিন্ন, যা শুধুমাত্র সার্ভারকে অবহিত করে এবং ডিভাইসে সরাসরি অ্যাক্টিভিটি শেষ করে না। `cancel` এমন একটি লাইভ অ্যাক্টিভিটির জন্যও কাজ করে যা `schedule` দিয়ে শিডিউল করা হয়েছিল কিন্তু এখনও শুরু হয়নি — এটি শুরু হওয়ার আগেই বাতিল হয়ে যায়।

### `Setup()` মেথড।
Pushwoosh `PushwooshLiveActivities.setup` ফাংশনটি চালু করে অ্যাক্টিভিটি আইডিগুলির স্থানান্তরকে সহজ করে, যা অ্যাপ্লিকেশনের মধ্যে একটি লাইভ অ্যাক্টিভিটির সম্পূর্ণ জীবনচক্র পরিচালনা করে। এই ফাংশনটি স্বয়ংক্রিয়ভাবে pushToStart এবং pushToUpdate উভয় টোকেন আপডেটের জন্য শোনে। এই মেথডটি ব্যবহার করে, অ্যাপ্লিকেশনটিকে আর লাইভ অ্যাক্টিভিটিগুলির সূচনা ম্যানুয়ালি ট্র্যাক করতে বা অ্যাক্টিভিটি আপডেটের জন্য টোকেন আপডেট পরিচালনা করতে হবে না।

আমরা এই মেথডটি ব্যবহার করার সুপারিশ করি কারণ এটি আমাদের দিকে সমস্ত টোকেন ব্যবস্থাপনা পরিচালনা করে, আপনার দিকে রক্ষণাবেক্ষণ করার জন্য প্রয়োজনীয় কোডের পরিমাণ হ্রাস করে। এটি ইন্টিগ্রেশনকে সহজ করে এবং আপনার অ্যাপের জন্য একটি মসৃণ, আরও কার্যকর অভিজ্ঞতা নিশ্চিত করে।

AppDelegate-এ, নিশ্চিত করুন যে আপনি `PushwooshFramework` এবং `PushwooshLiveActivities` ইম্পোর্ট করেছেন এবং `Pushwoosh.LiveActivities` মডিউল থেকে `setup` মেথডটি কল করেছেন।

**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">
 আপনি Pushwoosh API-এর /updateLiveActivity মেথড ব্যবহার করে লাইভ অ্যাক্টিভিটিস পরিচালনা করতে এবং তাদের বিষয়বস্তু আপডেট করতে পারেন। আরও তথ্যের জন্য, অনুগ্রহ করে [এই গাইডটি](/bn/developer/api-reference/ios-live-activities-api) পড়ুন।
</Aside>

## মাইগ্রেশন গাইড

Pushwoosh iOS SDK-এর 6.8.0 সংস্করণ থেকে, আমরা 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)
```