Live Activity হল iPhone লক স্ক্রিন এবং Dynamic Island-এ একটি ডায়নামিক উইজেট যা রিয়েল-টাইম তথ্য দেখায়: ডেলিভারি স্ট্যাটাস, খেলার স্কোর, টাইমার এবং মিউজিক প্লেব্যাক। এটি WidgetKit-এর সাথে ActivityKit (Swift, iOS 16.1+) এর মাধ্যমে বাস্তবায়িত হয়। Live Activity স্থানীয়ভাবে বা push বিজ্ঞপ্তির মাধ্যমে আপডেট হয়, একাধিক অবস্থা সমর্থন করে এবং ইভেন্ট শেষ হওয়ার পরে সিস্টেম দ্বারা শেষ করা হয়। আরও জানতে — ActivityKit Documentation দেখুন।
মুখ্য বিষয়
Live Activity হল WidgetKit-এর একটি এক্সটেনশন যা iPhone লক স্ক্রিন এবং Dynamic Island-এ ডায়নামিক কন্টেন্ট প্রদর্শন করে। স্ট্যাটিক উইজেটের বিপরীতে যা সিস্টেম টাইমারে আপডেট হয়, Live Activity অ্যাপ দ্বারা শুরু হয় এবং সীমিত সময় ধরে চলে — সক্রিয় Activity-র জন্য ৮ ঘণ্টা পর্যন্ত এবং শেষ হওয়ার পরে ৪ ঘণ্টা পর্যন্ত। ব্যবহারকারী ডিভাইস আনলক না করেই আপ-টু-ডেট ডেটা দেখেন: ডেলিভারি অর্ডারের অবস্থা, ট্যাক্সিতে গন্তব্যের দূরত্ব, ম্যাচের ফলাফল বা ওয়ার্কআউটের অগ্রগতি।
ActivityKit হল Live Activities নিয়ে কাজ করার ফ্রেমওয়ার্ক, যা iOS 16.1-এ উপস্থাপিত হয়েছে। এটি Activities অনুরোধ, আপডেট এবং শেষ করার জন্য API প্রদান করে। Activity হল কন্টেন্ট এবং অবস্থা সহ একটি অবজেক্ট। কন্টেন্ট (ActivityContent) স্ট্যাটিক ডেটা সংজ্ঞায়িত করে, যখন অবস্থা (ActivityState) সময়ের সাথে পরিবর্তনশীল ডায়নামিক ডেটা সংজ্ঞায়িত করে। সিস্টেম নিজেই সিদ্ধান্ত নেয় কখন নতুন অবস্থা রেন্ডার করবে — এটি ব্যাটারি বাঁচায় এবং মসৃণ অ্যানিমেশন নিশ্চিত করে।
প্রতিটি Live Activity ActivityID দ্বারা স্বতন্ত্রভাবে চিহ্নিত হয় এবং একটি প্রক্রিয়ার সাথে আবদ্ধ — যে অ্যাপ এটি তৈরি করেছে। সিস্টেম মেমরি কম থাকলে বা ব্যাটারি চার্জ কম হলে Activity শেষ করতে পারে। ডেভেলপার ActivityKit ডেলিগেটের মাধ্যমে জোরপূর্বক সমাপ্তির বিজ্ঞপ্তি পান এবং পুনরুদ্ধারের জন্য শেষ অবস্থা সংরক্ষণ করতে পারেন।
Live Activity আর্কিটেকচার দুটি ফ্রেমওয়ার্কের উপর নির্মিত: WidgetKit SwiftUI ভিউ রেন্ডারিং-এর জন্য দায়ী, ActivityKit Activity লাইফসাইকেলের জন্য দায়ী। ডেভেলপার LiveActivityConfiguration সমর্থন সহ WidgetBundle তৈরি করেন। প্রতিটি কনফিগারেশন ডেটা টাইপ (Attributes এবং State) এবং একটি SwiftUI ভিউ সংজ্ঞায়িত করে যা সিস্টেম লক স্ক্রিন এবং Dynamic Island-এ রেন্ডার করে। ডেটা ActivityAttributes-এর মাধ্যমে পাস করা হয় — কন্টেন্টের জন্য let ফিল্ড এবং অবস্থার জন্য var ফিল্ড সহ একটি স্ট্রাক্ট।
| কম্পোনেন্ট | উদ্দেশ্য | API |
|---|---|---|
| Attributes | সম্পূর্ণ Activity-র স্ট্যাটিক ডেটা | let name: String, let icon: String |
| ContentState | ডায়নামিক অবস্থা, আপডেটে পরিবর্তনযোগ্য | var progress: Double, var status: Status |
| Activity | Activity অনুরোধ এবং পরিচালনার অবজেক্ট | Activity.request(attributes:content:) |
| PushToken | সার্ভার push আপডেটের জন্য টোকেন | activity.pushToken publisher |
| ActivityUI | লক স্ক্রিন এবং Dynamic Island-এর জন্য SwiftUI ভিউ | LockScreenView, ExpandedView, CompactView |
Activity লাইফসাইকেল তিনটি পর্যায় অন্তর্ভুক্ত করে: সক্রিয় (সিস্টেম প্রদর্শন ও আপডেট করে), চূড়ান্ত (Activity শেষ কিন্তু UI এখনও ৪ ঘণ্টা দৃশ্যমান), সরানো (সিস্টেম UI সরিয়ে দেয়)। অ্যাপ যেকোনো সময় Activity শেষ করতে পারে। সিস্টেমও Activities জোরপূর্বক শেষ করে — উদাহরণস্বরূপ, ডিভাইস রিস্টার্ট বা ৮ ঘণ্টার সীমা শেষ হলে।
import ActivityKit
struct DeliveryAttributes: ActivityAttributes {
public struct ContentState: Codable & Hashable {
var status: DeliveryStatus
var estimatedMinutes: Int
}
var orderNumber: String
var restaurantName: String
}
WidgetBundle @main ম্যাক্রোর মাধ্যমে Live Activity নিবন্ধন করে: উইজেট LiveActivityConfiguration সহ কনফিগারেশনের একটি তালিকা ফেরত দেয়। এই কনফিগারেশনের ভিত্তিতে, সিস্টেম জানে কী ডেটা টাইপ আশা করতে হবে এবং বিভিন্ন অবস্থায় UI কীভাবে রেন্ডার করতে হবে — Dynamic Island-এর জন্য কম্প্যাক্ট, ন্যূনতম এবং সম্প্রসারিত।
Activity তৈরি ActivityKit-এ অনুরোধ দিয়ে শুরু হয়। অ্যাপ প্রাথমিক ডেটা সহ Activity.request(attributes:content:pushType:) কল করে। সিস্টেম চেক করে ডিভাইসে Dynamic Island উপলব্ধ কিনা এবং একটি Activity অবজেক্ট ফেরত দেয়। সক্রিয় Activity-র সীমা অতিক্রম করলে অনুরোধ ব্যর্থ হতে পারে — সাধারণত একসাথে ৫-এর বেশি নয়। সফল অনুরোধের পর, সিস্টেম লক স্ক্রিনে এবং যদি উপলব্ধ থাকে তাহলে Dynamic Island-এ উইজেট প্রদর্শন করে।
let attributes = DeliveryAttributes(
orderNumber: "A-1234",
restaurantName: "Pizza House"
)
let initialState = DeliveryAttributes.ContentState(
status: DeliveryStatus.preparing,
estimatedMinutes: 30
)
do {
let activity = try await Activity<DeliveryAttributes>.request(
attributes: attributes,
content: ActivityContent(state: initialState, staleDate: nil),
pushType: .token
)
print("Activity started: \(activity.id)")
} catch {
print("Failed: \(error)")
}
Live Activity-র জন্য SwiftUI ভিউ WidgetKit থেকে LockScreenView, ExpandedView এবং CompactView স্ট্রাকচার ব্যবহার করে। ভিউ বর্তমান অ্যাট্রিবিউট এবং অবস্থা সহ প্রসঙ্গ (ActivityViewContext) গ্রহণ করে। সিস্টেম থেকে নতুন অবস্থা আসলে ভিউ স্বয়ংক্রিয়ভাবে আপডেট হয়। Live Activity শুধুমাত্র সীমিত SwiftUI কম্পোনেন্ট সমর্থন করে — Text, Image, HStack, VStack এবং কয়েকটি মডিফায়ার।
প্রতিটি Live Activity ভিউ হালকা এবং দ্রুত হতে হবে — সিস্টেম ভারী ভিউ রেন্ডার করতে অস্বীকার করে। রেন্ডারিং সময়সীমা প্রতি ফ্রেমে ৩০ ms। অ্যানিমেশন অবস্থার মধ্যে সিস্টেম ট্রানজিশনের মধ্যে সীমাবদ্ধ — Live Activity-তে কাস্টম অ্যানিমেশন উপলব্ধ নয়। রেন্ডারিং লক স্ক্রিন প্রতিক্রিয়াশীলতা অগ্রাধিকার সহ WidgetKit-এর ব্যাকগ্রাউন্ড প্রক্রিয়ায় সম্পাদিত হয়।
স্থানীয় আপডেট — অ্যাপ activity.update(using:) কল করে Activity অবস্থা আপডেট করে। পদ্ধতিটি নতুন ContentState এবং আপডেটে বিজ্ঞপ্তি দেখানোর জন্য ঐচ্ছিক AlertConfiguration গ্রহণ করে। স্থানীয় আপডেট দ্রুত — সিস্টেম পরবর্তী রেন্ডার চক্রে ভিউ পুনরায় আঁকে, সাধারণত ১-২ সেকেন্ডের মধ্যে। ঘন ঘন আপডেটের জন্য (টাইমার, স্টপওয়াচ) স্থানীয় মোড ব্যবহার করুন — এটি push-এর চেয়ে বেশি নির্ভরযোগ্য এবং দ্রুত।
let updatedState = DeliveryAttributes.ContentState(
status: DeliveryStatus.outForDelivery,
estimatedMinutes: 10
)
await activity.update(
ActivityContent<DeliveryAttributes.ContentState>(
state: updatedState,
staleDate: Date().addingTimeInterval(60)
),
alertConfiguration: AlertConfiguration(
title: "Order out for delivery",
body: "Arriving in 10 min"
)
)
Push আপডেট — সার্ভার JSON ফর্ম্যাটে নতুন অবস্থা সহ একটি ActivityKit push বিজ্ঞপ্তি পাঠায়। এর জন্য, অ্যাপ activity.pushToken পাবলিশার থেকে pushToken গ্রহণ করে এবং সার্ভারে পাঠায়। সার্ভার নতুন ContentState সম্বলিত payload সহ APNs-এ POST অনুরোধ পাঠায়। সিস্টেম push গ্রহণ করে, অবস্থা ডিকোড করে এবং অ্যাপের অংশগ্রহণ ছাড়াই Live Activity আপডেট করে — এটি অ্যাপ বন্ধ থাকলেও Activity আপডেট করার অনুমতি দেয়।
Push আপডেটগুলি বিরল আপডেটের জন্য আরও কার্যকর (প্রতি ৫-১০ মিনিটে ডেলিভারি অবস্থা) — অ্যাপের নেটওয়ার্ক সংযোগ বজায় রাখার প্রয়োজন নেই। প্রতি ১-২ সেকেন্ডে ঘন ঘন আপডেটের জন্য স্থানীয় পদ্ধতি ব্যবহার করুন। সার্ভার payload শুধুমাত্র ContentState-এর পরিবর্তনযোগ্য ফিল্ড অন্তর্ভুক্ত করে — স্ট্যাটিক Attributes ডেটা শুধুমাত্র Activity তৈরি করার সময় পাঠানো হয়।
Dynamic Island হল iPhone 14 Pro, 15 Pro এবং নতুনতে একটি হার্ডওয়্যার-সফটওয়্যার এলাকা যা Live Activity কন্টেন্টের সাথে খাপ খায়। সিস্টেম স্বয়ংক্রিয়ভাবে Activity তিনটি মোডে প্রদর্শন করে: কম্প্যাক্ট (কাটআউটের বামে আইকন + ছোট টেক্সট), ন্যূনতম (শুধু আইকন) এবং সম্প্রসারিত (তথ্য সহ 300pt আয়তক্ষেত্র)। ডেভেলপার এই মোডগুলি সরাসরি নিয়ন্ত্রণ করেন না — সিস্টেম অগ্রাধিকার এবং উপলব্ধ স্থানের ভিত্তিতে মোড নির্বাচন করে।
struct DeliveryLiveActivity: Widget {
var body: some WidgetConfiguration {
ActivityConfiguration(for: DeliveryAttributes.self) { context in
LockScreenView(context: context)
} dynamicIsland: { context in
DynamicIsland {
DynamicIslandExpandedContent {
ExpandedView(context: context)
}
} compactLeading: {
CompactLeadingView(context: context)
} compactTrailing: {
CompactTrailingView(context: context)
} minimal: {
MinimalView(context: context)
}
}
}
}
Dynamic Island ইন্টারঅ্যাকটিভিটি সমর্থন করে — ব্যবহারকারী এলাকাটি ট্যাপ করে এবং অ্যাপে প্রবেশ করে বা সম্প্রসারিত ভিউ খোলে। কম্প্যাক্ট মোডে ট্যাপ করলে সম্প্রসারিত মোডে যায় এবং বামে সোয়াইপ করলে Activity ন্যূনতম মোডে চলে যায়। সম্প্রসারিত মোডের বোতামগুলি (pause/cancel) SwiftUI থেকে Link-এর মাধ্যমে পরিচালিত হয় — সিস্টেম একটি ডিপ লিঙ্ক URL সহ অ্যাপ চালু করে, UIApplicationDelegate-এ প্রক্রিয়াকরণ সম্পাদিত হয়।
Dynamic Island সীমাবদ্ধতা: সম্প্রসারিত মোডের প্রস্থ 300pt পর্যন্ত, কম্প্যাক্ট টেক্সট ৩০ অক্ষর পর্যন্ত। রঙ এবং ফন্ট সিস্টেম থিমের সাথে মেলে — কাস্টমাইজেশন সীমিত। মোডের মধ্যে ট্রানজিশন অ্যানিমেশন সিস্টেম-সংজ্ঞায়িত এবং কাস্টমাইজ করা যায় না। যদি একাধিক অ্যাপের সক্রিয় Activities থাকে, Dynamic Island সেগুলি লঞ্চ সময় এবং কন্টেন্ট টাইপের ভিত্তিতে অগ্রাধিকার সহ প্রদর্শন করে।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
WidgetKit-এর সাধারণ উইজেট স্ট্যাটিক তথ্য প্রদর্শন করে এবং ন্যূনতম ১৫-৩০ মিনিট ব্যবধানে সিস্টেম টাইমারে আপডেট হয়। Live Activity লক স্ক্রিন এবং Dynamic Island-এ রিয়েল টাইমে ডায়নামিক ডেটা দেখায়। Live Activity অ্যাপ দ্বারা শুরু হয়, ৮ ঘণ্টা পর্যন্ত বেঁচে থাকে এবং ইভেন্ট শেষ হওয়ার পরে সিস্টেম দ্বারা শেষ করা হয়, স্থায়ীভাবে বিদ্যমান উইজেটের বিপরীতে।
Live Activity দুটি আপডেট মোড সমর্থন করে: স্থানীয় — অ্যাপ যেকোনো সময় ActivityKit API-এর মাধ্যমে অবস্থা আপডেট করে, এবং push আপডেট — সার্ভার একটি ActivityKit push বিজ্ঞপ্তি পাঠায় যা সিস্টেম উইজেটের নতুন অবস্থায় রূপান্তর করে। ব্যাটারি কম থাকলে, সিস্টেম চার্জিং সংযুক্ত না হওয়া পর্যন্ত Live Activity ফ্রিজ করতে পারে।
Live Activities iOS 16.1 এবং নতুন iPhone-এ উপলব্ধ। iPhone 14 Pro এবং নতুনতে, Live Activity Dynamic Island-এও প্রদর্শিত হয়। iPad-এ, Live Activity শুধুমাত্র লক স্ক্রিনে সমর্থিত — iPad-এ Dynamic Island উপলব্ধ নয়। Apple Watch সরাসরি Live Activities সমর্থন করে না, কিন্তু সমাপ্তি বিজ্ঞপ্তি প্রদর্শন করতে পারে।
সিস্টেম সক্রিয় Live Activities-এর সংখ্যা সীমাবদ্ধ করে — সাধারণত সমস্ত অ্যাপের জন্য একসাথে ৫-এর বেশি নয়। সীমার বেশি শুরু করার চেষ্টা করলে ActivityKit ত্রুটি ফেরত দেয়। প্রতিটি Live Activity-র একাধিক অবস্থা থাকতে পারে — উদাহরণস্বরূপ, অপেক্ষমান, পথে, খাদ্য অর্ডারের জন্য ডেলিভারি সম্পন্ন। সমাপ্তির পর, Activity UI-তে আরও ৪ ঘণ্টা থাকে।
হ্যাঁ, অ্যাপকে বিজ্ঞপ্তি পাঠানোর অনুমতি চাইতে হবে — Live Activity সিস্টেম বিজ্ঞপ্তি চ্যানেল ব্যবহার করে। ব্যবহারকারী সেটিংসে একটি নির্দিষ্ট অ্যাপের জন্য Live Activity নিষ্ক্রিয় করতে পারেন। প্রথম লঞ্চে, ActivityKit অনুমতি চাওয়ার একটি ডায়ালগ দেখায়। অনুমতি ছাড়া, Activity অনুরোধ ব্যর্থ হয়।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন