Widget iOS یا Android کی ہوم اسکرین پر ایک کمپیکٹ یوزر انٹرفیس عنصر ہے جو ایپ کھولے بغیر متعلقہ معلومات دکھاتا ہے۔ ویجٹ iOS 14 (2020) میں SwiftUI پر WidgetKit فریم ورک کے ساتھ ظاہر ہوئے اور Android میں ورژن 1.5 سے Kotlin یا Java پر AppWidgetProvider کے ذریعے موجود ہیں۔ یہ صارف کو براہ راست ہوم اسکرین پر موسم، زر مبادلہ کی شرح، کیلنڈر، نوٹس یا کاموں کی حیثیت دیکھنے کی اجازت دیتے ہیں، وقت بچاتے ہیں اور تعامل کو آسان بناتے ہیں۔ Apple کے مطابق، صارفین اوسطاً دن میں 4–6 بار ویجٹ کے ساتھ تعامل کرتے ہیں، اور ہوم اسکرین پر ویجٹ رکھنے سے ایپ کی مصروفیت 20–30% بڑھ جاتی ہے۔ Android کے لیے یہ اعداد و شمار مقابلatable ہیں۔ آئیے کوڈ مثالوں کے ساتھ دیکھتے ہیں کہ دونوں پلیٹ فارمز پر ویجٹ کیسے کام کرتے ہیں۔
اہم نکات
Widget ایک کمپیکٹ یوزر انٹرفیس عنصر ہے جو موبائل ڈیوائس کی ہوم اسکرین پر رکھا جاتا ہے تاکہ کسی ایپ سے متعلقہ معلومات دکھائی جا سکے۔ مکمل ایپلیکیشن کے برعکس، ویجٹ کو لانچ کرنے کی ضرورت نہیں ہوتی — صارف اسکرین انلاک کرنے کے فوراً بعد ڈیٹا دیکھتا ہے۔ یہ تصور ڈیسک ٹاپ OS (macOS Dashboard، Windows Sidebar) سے آیا ہے، اور موبائل ماحول میں، Android نے اپنی پہلی ریلیز (Android 1.5 Cupcake، 2009) سے ویجٹ سپورٹ متعارف کرایا، جبکہ Apple نے صرف iOS 14 میں انہیں شامل کیا۔
تکنیکی نفاذ پلیٹ فارم کے مطابق مختلف ہوتا ہے۔ iOS ویجٹ Xcode میں ایک علیحدہ target ہے، جو Widget Extension کے طور پر compile ہوتا ہے اور اپنے عمل میں چلتا ہے۔ Android ویجٹ ایک BroadcastReceiver ہے جو AppWidgetProvider کو بڑھاتا ہے اور RemoteViews کے ذریعے لے آؤٹ پیش کرتا ہے۔ دونوں پلیٹ فارم کارکردگی اور میموری پر سخت پابندیاں لگاتے ہیں: حدود سے تجاوز کرنے پر سسٹم ویجٹ کو ہٹا سکتا ہے۔ iOS ویجٹ کو 30–50 MB اور timeline بنانے کے وقت کو 10 سیکنڈ تک محدود کرتا ہے۔ Android — updatePeriodMillis کے ذریعے 30 منٹ سے زیادہ کا وقفہ نہیں اور onUpdate پھنسنے پر جبری خاتمہ۔
Smart Stack iOS پر اور Android پر اسٹیک صارف کو ہوم اسکرین سلاٹ میں متعدد ویجٹ گروپ کرنے کی اجازت دیتے ہیں۔ ڈیوائس دن کے وقت، مقام یا صارف کی سرگرمی کی بنیاد پر دکھائے جانے والے ویجٹ کو خود بخود تبدیل کرتی ہے۔ مثال کے طور پر، صبح کیلنڈر دکھایا جاتا ہے، دن میں — موسم، شام کو — نوٹس۔ ڈویلپرز کے لیے، اس کا مطلب ہے کہ ویجٹ کو اسٹیک کے حصے کے طور پر صحیح طریقے سے کام کرنا چاہیے اور مسلسل ڈسپلے پر انحصار نہیں کرنا چاہیے۔
WidgetKit iOS 14+، iPadOS 14+ اور macOS 11+ پر ویجٹ بنانے کے لیے Apple کا فریم ورک ہے۔ ویجٹ SwiftUI اور مواد کی اپ ڈیٹ کے لیے TimelineProvider میکانزم کا استعمال کرتے ہوئے Swift میں لکھے جاتے ہیں۔ WidgetKit آرکیٹیکچر میں تین اجزاء شامل ہیں: TimelineProvider — ایک ڈیٹا ماخذ جو اندراجات کے ساتھ ٹائم لائن بناتا ہے؛ Widget Entry View — ایک SwiftUI View جو اندراج کی بنیاد پر مواد دکھاتی ہے؛ Widget Configuration — ویجٹ کی قسم، سائز اور خاندانوں کی تفصیل۔
WidgetKit اپ ڈیٹس کو خود بخود منظم کرتا ہے — ڈویلپر سسٹم کی اجازت سے زیادہ بار ویجٹ اپ ڈیٹ کرنے پر مجبور نہیں کر سکتا۔ Apple ڈیوائس پر تمام ویجٹ کے درمیان تقسیم کردہ اپ ڈیٹ بجٹ استعمال کرتا ہے۔ کم از کم وقفہ 15–30 منٹ ہے۔ اہم ڈیٹا (مثلاً ترسیل کی حیثیت) کے لیے، push-to-refresh استعمال کیا جاتا ہے — متعلقہ مستقبل کی تاریخ کے ساتھ ایک push اطلاع بھیجنا، جس کے بعد WidgetKit ایک نئی ٹائم لائن کی درخواست کرتا ہے۔ iOS 17 سے، ویجٹ App Intents کے ذریعے انٹرایکٹیویٹی کو سپورٹ کرتے ہیں — صارف ایپ کھولے بغیر ویجٹ کے اندر بٹن دبا سکتے ہیں۔
| سائز | iOS (pt) | مواد |
|---|---|---|
| Small | 170 × 170 | 1–2 میٹرکس: درجہ حرارت، زر مبادلہ کی شرح |
| Medium | 360 × 170 | 2–4 میٹرکس: 5 دن کی پیشن گوئی، فہرست |
| Large | 360 × 380 | 5–10 میٹرکس: کیلنڈر، خبروں کی فیڈ |
AppWidgetProvider Android پر ویجٹ بنانے کے لیے بنیادی کلاس ہے، جو API level 3 سے Android SDK کا حصہ ہے۔ Android ویجٹ ایک BroadcastReceiver ہے جو سسٹم سے اپ ڈیٹ، فعال اور غیر فعال کرنے کے واقعات وصول کرتا ہے۔ iOS کے برعکس، جہاں ویجٹ اپنے انجن پر SwiftUI کے ساتھ پیش کیا جاتا ہے، Android RemoteViews استعمال کرتا ہے — سسٹم کے عمل (لانچر) میں پیش کردہ View اجزاء کا محدود سیٹ۔ کسٹم Views، پیچیدہ اینیمیشنز یا UI لائبریریاں استعمال نہیں کی جا سکتیں۔
Android ویجٹ کا ورک فلو چار مراحل پر مشتمل ہے۔ کنفیگریشن — اسکرین پر ویجٹ شامل کرتے وقت، سسٹم ایک کنفیگریشن Activity شروع کر سکتا ہے جہاں صارف ترتیبات منتخب کرتا ہے۔ اپ ڈیٹ — سسٹم ایک مقررہ وقفے (کم از کم 30 منٹ) پر یا WorkManager کے ذریعے ایپ سے سگنل پر onUpdate() کال کرتا ہے۔ رینڈرنگ — فراہم کنندہ موجودہ ڈیٹا کے ساتھ RemoteViews بناتا ہے اور انہیں AppWidgetManager کے ذریعے منتقل کرتا ہے۔ ٹچ ہینڈلنگ — ویجٹ بٹن کے لیے PendingIntent کو سپورٹ کرتا ہے: کلک کرنے سے Activity کھلتی ہے یا کارروائی ہوتی ہے۔ Android 12 سے، ویجٹ کو گول کونوں، انکولی Material You رنگوں اور متحرک سائز کی تبدیلی کی سپورٹ ملی۔
آئیے WidgetKit اور SwiftUI کا استعمال کرتے ہوئے Swift میں موسم کا ویجٹ بناتے ہیں۔ پروجیکٹ میں Widget Extension target شامل ہونا چاہیے، جو Xcode میں File → New → Target → Widget Extension کے ذریعے شامل کیا جاتا ہے۔
import WidgetKit
import SwiftUI
// 1. ویجٹ کے لیے ڈیٹا ماڈل
struct WeatherEntry: TimelineEntry {
let date: Date
let temperature: Int
let condition: String
}
// 2. TimelineProvider — ڈیٹا فراہم کنندہ
struct Provider: TimelineProvider {
func placeholder(in context: Context) -> WeatherEntry {
WeatherEntry(date: Date(), temperature: 22, condition: "دھوپ")
}
func getSnapshot(in context: Context, completion: @escaping (WeatherEntry) -> Void) {
let entry = WeatherEntry(date: Date(), temperature: 22, condition: "دھوپ")
completion(entry)
}
func getTimeline(in context: Context, completion: @escaping (Timeline<WeatherEntry>) -> Void) {
let now = Date()
let entry = WeatherEntry(date: now, temperature: 20, condition: "ابر آلود")
let nextUpdate = Calendar.current.date(byAdding: .hour, value: 3, to: now)!
let timeline = Timeline(entries: [entry], policy: .after(nextUpdate))
completion(timeline)
}
}
// 3. ڈسپلے کے لیے SwiftUI View
struct WeatherWidgetEntryView: View {
var entry: WeatherEntry
var body: some View {
VStack(alignment: .leading) {
Text("موسم").font(.caption).foregroundColor(.secondary)
HStack {
Text("\(entry.temperature)°").font(.largeTitle).fontWeight(.bold)
Spacer()
Text(entry.condition).font(.body)
}
}.padding()
}
}
// 4. ویجٹ کنفیگریشن
@main
struct WeatherWidget: Widget {
var body: some WidgetConfiguration {
StaticConfiguration(kind: "WeatherWidget", provider: Provider()) { entry in
WeatherWidgetEntryView(entry: entry)
}
.configurationDisplayName("موسم")
.description("موجودہ درجہ حرارت دکھاتا ہے")
.supportedFamilies([.systemSmall, .systemMedium])
}
}
اہم نکات: TimelineProvider یہ طے کرتا ہے کہ کب اور کون سا ڈیٹا دکھانا ہے؛ getTimeline .after(nextUpdate) اپ ڈیٹ پالیسی کے ساتھ ٹائم لائن بناتا ہے؛ StaticConfiguration فراہم کنندہ کو View سے جوڑتا ہے۔ متحرک ڈیٹا کے لیے، کسٹم پیرامیٹرز کے ساتھ IntentConfiguration استعمال کیا جاتا ہے۔
آئیے AppWidgetProvider اور RemoteViews کے ساتھ Kotlin میں اسی طرح کا موسمی ویجٹ نافذ کرتے ہیں۔
// WeatherWidgetProvider.kt
class WeatherWidgetProvider : AppWidgetProvider() {
override fun onUpdate(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetIds: IntArray
) {
for (appWidgetId in appWidgetIds) {
updateAppWidget(context, appWidgetManager, appWidgetId)
}
}
override fun onAppWidgetOptionsChanged(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetId: Int,
newOptions: Bundle
) {
updateAppWidget(context, appWidgetManager, appWidgetId)
}
companion object {
fun updateAppWidget(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetId: Int
) {
val temperature = 20
val condition = "ابر آلود"
val views = RemoteViews(
context.packageName, R.layout.widget_weather
).apply {
setTextViewText(R.id.tv_temperature, "$temperature°")
setTextViewText(R.id.tv_condition, condition)
setOnClickPendingIntent(
R.id.widget_root, PendingIntent.getActivity(
context, 0,
Intent(context, MainActivity::class.java),
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
)
}
appWidgetManager.updateAppWidget(appWidgetId, views)
}
}
}
// AndroidManifest — فراہم کنندہ رجسٹریشن
<receiver android:name=".WeatherWidgetProvider" android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_weather_info" />
</receiver>
widget_weather_info.xml فائل کم از کم سائز، وقفہ اور لے آؤٹ سیٹ کرتی ہے: minWidth 160dp، minHeight 80dp، updatePeriodMillis 3600000 (1 گھنٹہ)۔ RemoteViews صرف معاون اجزاء استعمال کرتا ہے: LinearLayout، TextView، ImageView۔ کسٹم Views اور ConstraintLayout Android 5.0 سے دستیاب ہیں۔ GlanceLayout — RemoteViews کے لیے ایک تجرباتی Compose-based طریقہ — Android 15 میں ظاہر ہوا۔
اکثر پوچھے گئے سوالات
iOS WidgetKit تین مقررہ سائز (small، medium، large) اور سسٹم بجٹ کے ساتھ TimelineProvider کے ذریعے اپ ڈیٹ پیش کرتا ہے۔ Android AppWidgetProvider لچکدار سیل پر مبنی سائز، رینڈرنگ کے لیے RemoteViews اور updatePeriodMillis یا WorkManager کے ذریعے اپ ڈیٹ استعمال کرتا ہے۔
iOS پر، سسٹم اپ ڈیٹس کو کنٹرول کرتا ہے — کم از کم وقفہ 15–30 منٹ ہے، اہم ڈیٹا کے لیے push-to-refresh استعمال کیا جاتا ہے۔ Android پر، وقفہ updatePeriodMillis (کم از کم 30 منٹ) میں یا پس منظر کے کاموں کے لیے WorkManager کے ذریعے سیٹ کیا جاتا ہے۔
iOS small (170x170pt)، medium (360x170pt) اور large (360x380pt) کو سپورٹ کرتا ہے۔ Android ایک لچکدار سیل گرڈ استعمال کرتا ہے: 2x1 سے 5x5 تک، سائز لانچر اور OS ورژن پر منحصر ہے۔
iOS پر، ویجٹ کے اندر اینیمیشنز دستیاب نہیں ہیں — یہ جامد عناصر ہیں۔ Android RemoteViews setFloat() اور ViewPropertyAnimator کے ذریعے بنیادی اینیمیشنز کو سپورٹ کرتا ہے، لیکن پیچیدہ اینیمیشنز دستیاب نہیں ہیں۔
صحیح نفاذ کے ساتھ — نہیں۔ سسٹم ویجٹ وسائل کو سختی سے محدود کرتا ہے: iOS پر — اپ ڈیٹ اور میموری بجٹ (30–50 MB)، Android پر — کم از کم اپ ڈیٹ وقفہ۔ مسئلہ والے ویجٹ سسٹم کے ذریعے جبری طور پر ختم کر دیے جاتے ہیں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں