WidgetKit হল একটি Apple ফ্রেমওয়ার্ক যা iOS 14-এ চালু করা হয়েছে, যা ডেভেলপারদের iPhone এবং iPad-এর হোম স্ক্রিন, Mac ডেস্কটপ এবং Apple Watch ফেসে ডায়নামিক উইজেট রাখতে দেয়। উইজেটগুলি অ্যাপ না খুলেই মূল তথ্য প্রদর্শন করে — আবহাওয়ার পূর্বাভাস, মুদ্রার হার, ক্যালেন্ডার, পদক্ষেপ। Apple Developer Documentation, 2026 অনুসারে, WidgetKit Apple ইকোসিস্টেমে প্রতিদিন 2 বিলিয়ন পর্যন্ত উইজেট আপডেট প্রক্রিয়া করে, যা এটিকে সিস্টেম স্ক্রিনে তথ্য প্রদর্শনের জন্য সবচেয়ে বেশি ব্যবহৃত ফ্রেমওয়ার্কগুলির মধ্যে একটি করে তোলে।
মূল বিষয়
WidgetKit হল একটি Apple ফ্রেমওয়ার্ক যা Apple ডিভাইসের সিস্টেম স্ক্রিনে বিষয়বস্তু প্রদর্শনকারী উইজেট তৈরি করার জন্য। একটি উইজেট হল আপনার অ্যাপের একটি ক্ষুদ্র উপস্থাপনা যা ব্যবহারকারী জিগল মোডে হোম স্ক্রিনে রাখে। WidgetKit-এর আগে বিদ্যমান watchOS কমপ্লিকেশনের বিপরীতে, নতুন ফ্রেমওয়ার্কটি একটি একক SwiftUI API-এর মাধ্যমে সমস্ত Apple প্ল্যাটফর্মের জন্য উইজেট তৈরি একীভূত করেছে।
WidgetKit-এর কার্যনির্বাহী নীতি TimelineProvider-এর উপর ভিত্তি করে — একটি অবজেক্ট যা TimelineEntry-এর একটি ক্রমবদ্ধ অ্যারে তৈরি করে, যেখানে প্রতিটি এন্ট্রিতে একটি Snapshot (একটি নির্দিষ্ট সময়ে উইজেটের নির্দিষ্ট অবস্থা) থাকে। সিস্টেম ক্রমান্বয়ে এন্ট্রিগুলি প্রদর্শন করে, টাইমলাইনে পরবর্তী এন্ট্রিতে যাওয়ার সময় উইজেট আপডেট করে। এন্ট্রিগুলির মধ্যে, WidgetKit অ্যাপ কোড কল করে না — শুধুমাত্র একটি নতুন Timeline তৈরি করার সময় CPU সময় ব্যয় হয়।
WWDC 2024 সেশন “WidgetKit: What’s new” অনুসারে, গড় iOS ব্যবহারকারীর হোম স্ক্রিনে 8–12টি উইজেট থাকে এবং সবচেয়ে জনপ্রিয় বিভাগগুলি হল আবহাওয়া, সময়, ক্যালেন্ডার, ফিটনেস এবং অর্থ। WidgetKit রিয়েল-টাইম আপডেটের পরিবর্তে নির্ধারিত আপডেটের কারণে সাধারণ ব্যবহারে প্রতিদিন 1% এরও কম ব্যাটারি চার্জ খরচ করে।
iOS 14-এর আগে, উইজেটগুলি কেবল Today View হিসাবে বিদ্যমান ছিল — একটি প্যানেল যা প্রথম স্ক্রিন থেকে বামে সোয়াইপ করে অ্যাক্সেসযোগ্য। Today Extensions-এর গুরুতর সীমাবদ্ধতা ছিল: এগুলি কেবল “Today” স্ক্রিনে উপলব্ধ ছিল, বিষয়বস্তু আপডেট করার জন্য অ্যাপ খোলার প্রয়োজন ছিল এবং আকার সমর্থন সীমিত ছিল। WidgetKit সম্পূর্ণরূপে Today Extensions প্রতিস্থাপন করেছে, হোম স্ক্রিন, লক স্ক্রিন (iOS 16+) এবং Mac ডেস্কটপে উইজেট প্রদান করেছে।
WidgetKit আর্কিটেকচার তিনটি মূল প্রোটোকলের উপর নির্মিত: TimelineProvider, TimelineEntry, এবং Widget। TimelineEntry হল একটি ডেটা মডেল যা একটি নির্দিষ্ট সময়ে উইজেটের অবস্থা উপস্থাপন করে। TimelineProvider এই ধরনের এন্ট্রিগুলির একটি অ্যারে (Timeline) তৈরি করে, প্রতিটির জন্য সক্রিয়করণ তারিখ নির্দিষ্ট করে। Widget হল এন্ট্রি পয়েন্ট যা প্রদানকারীকে SwiftUI ভিউ-এর সাথে সংযুক্ত করে।
Timeline পদ্ধতি getTimeline প্রথমবার উইজেট যোগ করার সময় সিস্টেম দ্বারা কল করা হয় এবং তারপর পর্যায়ক্রমে — সাধারণত প্রদানকারীর প্রকারের উপর নির্ভর করে প্রতি 1–6 ঘন্টায়। একটি Timeline ঘন্টা বা দিন আগের এন্ট্রি ধারণ করতে পারে, যা উইজেটকে আপডেটের মধ্যে অ্যাপ কোড কল না করেই কাজ করতে দেয়। যদি জরুরি উইজেট আপডেটের প্রয়োজন হয় (যেমন, মুদ্রার হার পরিবর্তিত হয়েছে), অ্যাপ জোর করে WidgetCenter.shared.reloadAllTimelines() কল করতে পারে।
struct SimpleEntry: TimelineEntry {
let date: Date
let value: Double
}
struct Provider: TimelineProvider {
typealias Entry = SimpleEntry
func placeholder(in context: Context) -> Entry {
Entry(date: Date(), value: 0)
}
func getSnapshot(
in context: Context,
completion: @escaping (Entry) -> Void
) {
Entry(date: Date(), value: 42.5)
}
func getTimeline(
in context: Context,
completion: @escaping (Timeline<Entry>, Error?) -> Void
) {
let entry = Entry(date: Date(), value: fetchLatestValue())
let nextUpdate = Calendar.current
.date(byAdding: .hour, value: 1, to: Date())!
let timeline = Timeline(entries: [entry], policy: .after(nextUpdate))
completion(timeline, nil)
}
}
WidgetKit তিনটি উইজেট আকার সমর্থন করে, প্রতিটি নির্দিষ্ট অনুপাত সহ। Small (iPhone-এ 170×170 pt) কম্প্যাক্ট তথ্য প্রদর্শন করে — একটি মান, আইকন বা ছোট টেক্সট। Medium (364×170 pt) small-এর থেকে দ্বিগুণ চওড়া এবং মানের জোড়া বা মিনি-চার্ট প্রদর্শনের জন্য উপযুক্ত। Large (364×382 pt) উল্লম্বভাবে প্রায় অর্ধেক স্ক্রিন নেয় এবং টেবিল, তালিকা বা বিস্তারিত ডেটা প্রদর্শনের অনুমতি দেয়।
ডেভেলপারকে কমপক্ষে দুটি আকার সমর্থন করতে হবে — Apple small + medium সুপারিশ করে। Large উইজেট কেবল তখনই প্রয়োজন যদি অ্যাপে সেই ভলিউম পূরণ করার মতো পর্যাপ্ত বিষয়বস্তু থাকে। প্রতিটি আকার তার নিজস্ব SwiftUI View পায়, যা WidgetKit সিস্টেম স্ক্রিনে রেন্ডার করে। গুরুত্বপূর্ণভাবে, WidgetKit কাস্টম আকার সমর্থন করে না — কেবল তিনটি নির্দিষ্ট আকার, যা ইন্টারফেসের সামঞ্জস্য নিশ্চিত করে।
struct WeatherWidget: Widget {
let kind: String = "WeatherWidget"
var body: some WidgetConfiguration {
StaticConfiguration(kind: kind, provider: Provider()) { entry in
WeatherWidgetView(entry: entry)
}
.configurationDisplayName("Weather")
.description("Current temperature and forecast")
.supportedFamilies([.systemSmall, .systemMedium])
}
}
WidgetKit দুটি কনফিগারেশন প্রকার অফার করে — StaticConfiguration এবং IntentConfiguration। StaticConfiguration সেই উইজেটগুলির জন্য উপযুক্ত যা সমস্ত ব্যবহারকারীর জন্য একই বিষয়বস্তু প্রদর্শন করে: মুদ্রার হার, আবহাওয়া, ক্যালেন্ডার। IntentConfiguration ব্যবহারকারীকে Siri ইন্টেন্ট সিস্টেমের মাধ্যমে উইজেন্ট যোগ করার সময় এটি কাস্টমাইজ করতে দেয় — উদাহরণস্বরূপ, আবহাওয়ার জন্য একটি নির্দিষ্ট শহর বা স্টক মূল্যের জন্য একটি নির্দিষ্ট টিকার নির্বাচন করা।
IntentConfiguration INWidgetIntent ব্যবহার করে — SiriKit থেকে INIntent-এর একটি উপশ্রেণী। যখন ব্যবহারকারী একটি উইজেট যোগ করে এবং প্যারামিটার নির্বাচন করে (যেমন, শহর), সিস্টেম এই ইন্টেন্টটি সংরক্ষণ করে এবং প্রতিটি আপডেটে এটি TimelineProvider-এ পাস করে। প্রদানকারী getTimeline পদ্ধতিতে ইন্টেন্টটি গ্রহণ করে এবং বিষয়বস্তু গঠনের জন্য এর প্যারামিটার ব্যবহার করে। IntentConfiguration ব্যক্তিগতকৃত উইজেটগুলির জন্য পছন্দের পদ্ধতি কারণ এটি Siri এবং Shortcuts-এর সাথে একীভূত হয়।
struct WeatherWidgetEntryView: View {
var entry: WeatherEntry
var body: some View {
VStack(alignment: .leading) {
Text(entry.cityName)
.font(.caption)
.foregroundColor(.secondary)
Text("\(entry.temperature)°C")
.font(.largeTitle)
}
}
}
struct WeatherWidget: Widget {
var body: some WidgetConfiguration {
IntentConfiguration(
kind: "WeatherWidget",
intent: WeatherConfigIntent.self,
provider: WeatherTimelineProvider()
) { entry in
WeatherWidgetEntryView(entry: entry)
}
}
}
একটি উইজেট তৈরি শুরু হয় Xcode-এ Widget Extension Target যোগ করার মাধ্যমে: File → New → Target → Widget Extension। Xcode স্বয়ংক্রিয়ভাবে TimelineEntry, TimelineProvider এবং WidgetConfiguration সহ একটি কাঠামো তৈরি করে। ডেভেলপারকে কেবল ডেটা প্রদর্শনের জন্য SwiftUI View বাস্তবায়ন করতে হবে এবং সঠিক আপডেট সময়সূচীর জন্য প্রদানকারীকে কনফিগার করতে হবে।
নীচে বর্তমান Bitcoin মূল্য প্রদর্শনের জন্য একটি সাধারণ উইজেটের সম্পূর্ণ উদাহরণ দেওয়া হল: Provider URLSession-এর মাধ্যমে হার লোড করে এবং প্রতি ঘন্টায় আপডেট সহ একটি Timeline তৈরি করে। WidgetSwiftUIView বড় ফন্টে হার এবং ছোট ফন্টে শেষ আপডেটের সময় প্রদর্শন করে।
struct BTCPriceEntry: TimelineEntry {
let date: Date
let price: Double
let change24h: Double
}
struct BTCWidgetEntryView: View {
var entry: BTCPriceEntry
var body: some View {
VStack {
Text("BTC/USD").font(.caption)
Text("$\(entry.price, specifier: "%.0f")")
.font(.title2).fontWeight(.bold)
Text(entry.change24h > 0 ? "+" : "")
}
}
}
iOS 16-এর সাথে, WidgetKit লক স্ক্রিন — iPhone লক স্ক্রিন —-তে সমর্থন বাড়িয়েছে। লক স্ক্রিন উইজেট দুই ধরনের হয়: inline (ঘড়ির নীচে টেক্সটের এক লাইন) এবং rectangular (একটি আয়তক্ষেত্রাকার ক্ষেত্র)। হোম স্ক্রিন উইজেটের বিপরীতে, লক স্ক্রিন উইজেট আরও ঘন ঘন আপডেট হয় — সিস্টেম ট্রিগার ফোন আনলক না করেই বর্তমান তথ্য প্রদর্শনের জন্য প্রতি 15–30 মিনিটে আপডেটের অনুমতি দেয়।
লক স্ক্রিন উইজেটগুলির accessoryFamilies সহ WidgetConfiguration-এর মাধ্যমে পৃথক কনফিগারেশন প্রয়োজন: accessoryCircular, accessoryRectangular, accessoryInline। এই পরিবারগুলির কঠোর আকার এবং বিষয়বস্তুর সীমাবদ্ধতা রয়েছে — তারা ছবি, অ্যানিমেশন বা কাস্টম ফন্ট সমর্থন করে না। Apple লক স্ক্রিন উইজেটের জন্য শুধুমাত্র টেক্সট তথ্য এবং SF Symbols সিস্টেম আইকন ব্যবহার করার পরামর্শ দেয়।
উইজেট ডেভেলপ করার সময়, WidgetKit-এর সীমাবদ্ধতা বিবেচনা করা গুরুত্বপূর্ণ। উইজেটগুলি শুধুমাত্র-পঠনযোগ্য ভিউ: তারা টাচ ইভেন্ট পরিচালনা করে না (ট্যাপ ছাড়া যা অ্যাপ খোলে)। উইজেটগুলি অ্যানিমেশন, ভিডিও, কীবোর্ড ইনপুট, স্ক্রোলিং বা ইন্টারেক্টিভ উপাদান সমর্থন করে না। প্রতিটি উইজেট একটি নির্দিষ্ট সময়ে ডেটার একটি স্থির স্ন্যাপশট, এবং ইন্টারঅ্যাকটিভিটি যোগ করার চেষ্টা করলে App Store থেকে অ্যাপ প্রত্যাখ্যান হবে।
সেরা অনুশীলনের মধ্যে রয়েছে জোরপূর্বক আপডেটের জন্য Widget Center ব্যবহার করা, দ্রুত প্রতিক্রিয়ার জন্য TimelineProvider স্তরে ডেটা ক্যাশিং করা এবং প্রাথমিক অবস্থার জন্য placeholder ব্যবহার করা। একাধিক আকার সমর্থন করাও গুরুত্বপূর্ণ — ব্যবহারকারীরা আশা করেন যে উইজেটটি small এবং medium উভয় ভেরিয়েন্টেই উপলব্ধ হবে। ভুল বা পুরানো ডেটা প্রদর্শন করা কঠোরভাবে এড়িয়ে চলুন — ব্যবহারকারীরা উইজেট থেকে ভুল তথ্য দীর্ঘ সময় ধরে মনে রাখে।
| কী অনুমোদিত নয় | কেন |
|---|---|
| অ্যানিমেশন এবং ভিডিও | উইজেটগুলি স্থির স্ন্যাপশট; অ্যানিমেশন ব্যাটারি নিষ্কাশন করে |
| ইন্টারঅ্যাকটিভিটি | WidgetKit অ্যাপ লিঙ্ক ছাড়া UI উপাদান সমর্থন করে না |
| স্ক্রোলিং | স্ক্রোলিং ছাড়া নির্দিষ্ট আকার |
| কীবোর্ড | উইজেটে টেক্সট ইনপুট সম্ভব নয় |
| লাইভ ডেটা | ডেটা Timeline সময়সূচীতে আপডেট হয়, রিয়েল টাইমে নয় |
| কাস্টম আকার | শুধুমাত্র small, medium, large, accessory* নির্দিষ্ট আকার |
সচরাচর জিজ্ঞাসিত প্রশ্ন
হ্যাঁ, WidgetKit ক্রস-প্ল্যাটফর্ম। একই Widget Extension একটি একক SwiftUI কোডবেস সহ iOS, iPadOS এবং macOS টার্গেটে অন্তর্ভুক্ত করা যেতে পারে। পার্থক্য শুধুমাত্র সমর্থিত Families-এ দেখা যায় — Mac-এ accessoryRectangular নেই।
Timeline সময়সূচী অনুসারে। ডেভেলপার নির্ধারণ করে কখন পরবর্তী আপডেট হবে — এক মিনিটে বা এক দিনে। সিস্টেম ঘন ঘন ব্যবহৃত উইজেটগুলির জন্য আপডেট ত্বরান্বিত করতে পারে।
না, WidgetKit UIButton বা কোনো ইন্টারেক্টিভ উপাদান সমর্থন করে না। একমাত্র ক্রিয়া হল উইজেটে ট্যাপ করা, যা ডিপ লিঙ্কের মাধ্যমে অ্যাপ খোলে।
WidgetCenter.shared.reloadAllTimelines() বা একটি নির্দিষ্ট উইজেটের জন্য reloadTimelines(ofKind:) ব্যবহার করুন। অ্যাপ থেকে কল তাত্ক্ষণিকভাবে প্রদানকারীর কাছে একটি নতুন Timeline অনুরোধ করে।
সর্বনিম্ন — সাধারণ ব্যবহারে প্রতিদিন 1% এরও কম চার্জ। WidgetKit ব্যাকগ্রাউন্ড আপডেট সীমিত করে এবং অ্যাপকে সক্রিয় রাখে না। প্রধান খরচ হল প্রথম যোগ করার সময় Timeline তৈরি করা।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন