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

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

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

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

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

2. উইজেট এক্সটেনশন কনফিগারেশন
অনুগ্রহ করে একটি নাম লিখুন এবং **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. Xcode-এ আপনার প্রকল্পের ContentView ফাইলে নেভিগেট করুন এবং একটি Button তৈরি করুন

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

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

```

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

উদাহরণস্বরূপ, 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>

### `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])
```

এখন, এই মেথডগুলো অ্যাক্সেস করতে, আপনার লাইভঅ্যাক্টিভিটি মডিউল ব্যবহার করা উচিত।

```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()`-এর মাধ্যমে মেথডগুলোর জন্য সমর্থন বজায় রেখেছি, কিন্তু অনুগ্রহ করে মনে রাখবেন যে এই মেথডগুলো ভবিষ্যতের রিলিজে অবচিত (deprecated) করা হবে।

``` 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)
```