Uygulama Uzantıları, bir mobil uygulamanın yeteneklerini ana arayüzünün ötesine genişleten ayrı yürütülebilir modüllerdir: Ana ekranda Today Widget, CallKit aracılığıyla VoIP çağrı işleme ve BroadcastReceiver aracılığıyla sistem olaylarına tepki. Sistem entegrasyonları, bir uygulamanın işletim sistemiyle derin düzeyde etkileşime girmesine olanak tanır ve normal ekranlar için kullanılamayan özellikleri açar. Apple Geliştirici Dokümantasyonu'na göre, her uzantı izole bir süreçte çalışır ve ana uygulamadan bağımsız olarak sistem tarafından yönetilir. Bir mobil uygulamadaki Uygulama Uzantıları, ana süreçte bulunmayan özellikleri uygulamaya olanak tanır.
Önemli Noktalar
iOS'taki Uygulama Uzantıları iOS 8'de ortaya çıktı ve mobil geliştirmede sistem entegrasyonlarının temeli haline geldi. Bunlar, ana uygulamayla birlikte paketlenmiş ancak izole bir süreçte başlatılan ayrı ikili dosyalardır. Her uzantının kendi Info.plist'i ve NSExtensionPrincipalClass aracılığıyla tanımlanmış bir giriş noktası vardır. Sistem, Uygulama Uzantılarının yaşam döngüsünü yönetir — bir görevi tamamladıktan sonra arka planda kalamazlar.
WidgetKit (iOS 14+), ana ekranda widget oluşturmak için modern bir framework'tür. WidgetKit, arayüz tanımı için SwiftUI'yi ve güncelleme programlarını tanımlamak için TimelineProvider'ı kullanır. Widget'lar üç boyutta gelir: küçük (2×2 hücre), orta (4×2) ve büyük (4×4). UICollectionViewController tabanlı eski Today Widget hala desteklenmektedir, ancak Apple WidgetKit'e geçiş yapılmasını önerir. WidgetKit'teki Uygulama Uzantıları animasyon, klavye girişi veya jestleri desteklemez — bunlar periyodik güncellemelerle statik veya sözde animasyonlu öğelerdir.
Share Extension, sistem paylaşım sayfası aracılığıyla herhangi bir uygulamadan sizin uygulamanıza içerik göndermeye olanak tanır. Share Extension, NSExtensionItem aracılığıyla veri alır ve arayüz için SLComposeServiceViewController kullanır. Action Extension, içeriği yerinde işler — örneğin, başka bir uygulamaya geçmeden tarayıcıda metni çevirir. Her iki tür de sınırlı bir süre içinde işi tamamlamalıdır, aksi takdirde sistem uzantıyı "öldürür". Bu, bir mobil uygulamadaki Uygulama Uzantılarının önemli bir sınırlamasıdır — arka plan görevleri uzantı düzeyinde kullanılamaz.
iOS'taki Sistem Entegrasyonları widget'ların çok ötesine geçer: CallKit, PushKit ve SiriKit, bir mobil uygulamanın sistem düzeyinde çalışmasına olanak tanır. Bu framework'ler özel yetkilendirmeler gerektirir ancak kullanıcıya kesintisiz bir deneyim sunar — CallKit aracılığıyla yapılan aramalar normal telefon aramaları gibi görünür ve Siri, uygulamayı açmadan istekleri işler.
CallKit, üçüncü taraf uygulama aramalarını kilitli ekran da dahil olmak üzere sistem çağrı ekranına entegre eder. CXProvider, uygulamayı VoIP hizmeti olarak kaydeder ve CXCallController aramaları yönetir. CallKit, yinelenen aramaları otomatik olarak engeller ve istenmeyen numaraları engellemek için Call Directory Extension'ı destekler. CallKit ile mobil geliştirmede sistem entegrasyonları, sesli iletişim uygulamaları için kritiktir — WhatsApp, Skype ve Zoom, gelen aramaları görüntülemek için bunu kullanır.
PushKit, push bildirimlerini kullanıcıya göstermeden doğrudan mobil uygulamaya iletir. PushKit, uygulamayı "öldürülmüş" bir durumdan uyandırır ve PKPushRegistryDelegate aracılığıyla veri iletir. Bu, VoIP uygulamaları için birincil mekanizmadır: PushKit çağrı bilgilerini iletir ve CallKit bunu görüntüler. PushKit, normal push bildirimlerinden daha yüksek teslim önceliğine sahiptir ve bir banner görüntüleme gerektirmez. Mobil uygulamalardaki Uygulama Uzantıları, sesli iletişim için genellikle PushKit'i CallKit ile birleştirir.
SiriKit, Siri ve Kısayollar uygulaması aracılığıyla istekleri işlemeye olanak tanır. Intents Extension, desteklenen niyetleri kaydeden ve işleyen ayrı bir Uygulama Uzantısıdır. SiriKit, 20'den fazla alanı destekler: aramalar, mesajlar, ödemeler, notlar, egzersizler. Kısayollar, kullanıcının otomasyonlar oluşturmasına olanak tanır — örneğin, "Siri aracılığıyla WhatsApp'ta mesaj gönder." SiriKit ve Kısayollarla sistem entegrasyonları, kullanıcı uygulamayı açmadan işlemleri gerçekleştirdiği için etkileşimi artırır.
BroadcastReceiver, sistem yayın mesajlarına tepki veren bir Android bileşenidir. iOS Uygulama Uzantılarının aksine, BroadcastReceiver ayrı bir ikili dosya gerektirmez — bildirim dosyasında veya Context.registerReceiver aracılığıyla kodda alıcıyı kaydetmek yeterlidir. Android'deki sistem entegrasyonları genellikle BroadcastReceiver ile başlar: cihaz başlatıldığında bir hizmet başlatmaktan ağ bağlantısına tepki vermeye kadar.
IntentFilter, BroadcastReceiver'ı belirli bir sistem olayına bağlar. Tipik olaylar: BOOT_COMPLETED (cihaz başlatma), CONNECTIVITY_ACTION (ağ değişikliği), BATTERY_LOW (düşük pil), TIME_SET (zaman değişikliği). Alıcı, AndroidManifest.xml'de veya dinamik kayıt için Context.registerReceiver aracılığıyla kaydedilir. Dinamik kayıt tercih edilir — bildirimde izin gerektirmez ve yalnızca uygulama etkin olduğunda çalışır. Android'de Uygulama Uzantıları bir kavram olarak mevcut değildir, ancak BroadcastReceiver benzer bir rol oynar — sistem entegrasyonları aracılığıyla uygulama yeteneklerini genişletir.
NotificationListenerService, tüm sistem bildirimlerini alan bir hizmettir. NotificationListenerService, BIND_NOTIFICATION_LISTENER_SERVICE izni ve erişilebilirlik ayarları aracılığıyla erişim gerektirir. AccessibilityService, sistem entegrasyonu için daha güçlü bir araçtır: ekran içeriğini okuyabilir, tıklamaları simüle edebilir ve eylemleri otomatikleştirebilir. Her iki hizmet de ayarlarda kullanıcı tarafından açıkça etkinleştirilmeyi gerektirir, bu da güvenliği artırır. AccessibilityService aracılığıyla mobil uygulamalardaki sistem entegrasyonları, otomatik doldurucular, ekran okuyucular ve erişilebilirlik araçları için kullanılır.
class BootReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == Intent.ACTION_BOOT_COMPLETED) {
WorkManager.getInstance(context)
.enqueueUniqueWork("post-boot", ...)
}
}
}
Örnek, BOOT_COMPLETED olayı için bir BroadcastReceiver kaydeder. WorkManager, cihaz başlatıldıktan sonra ertelenmiş görev yürütme için kullanılır — bu, Android uygulamaları için standart yaklaşımdır.
Android'deki App Widget Provider, widget bağlamında iOS Uygulama Uzantılarının karşılığıdır: ana ekranda etkileşimli içerik görüntüleyen bir bileşendir. WidgetKit'in aksine, Android widget'ları kullanıcı girişini — tıklamalar, anahtarlar ve jestler — kabul edebilir. App Widget Provider, boyut ve güncelleme sıklığının XML açıklaması aracılığıyla bildirimde kaydedilir.
RemoteViews, widget arayüzünü bir XML düzeni aracılığıyla tanımlar ve yalnızca sınırlı bir View kümesini destekler. RemoteViews, özel View'lara izin vermez — yalnızca standart bileşenler: TextView, ImageView, Button, ProgressBar. AppWidgetProvider, widget güncellemelerini, etkinleştirmeyi ve silmeyi yöneten temel sınıftır. onUpdate yöntemi, updatePeriodMillis aracılığıyla zamanlayıcıyla veya hassas kontrol için WorkManager aracılığıyla çağrılır. Android'de widget'larla sistem entegrasyonları dikkat gerektirir — çok sık güncellemeler pili tüketir.
Glance API, XML yerine Kotlin DSL kullanarak widget oluşturmak için bir Jetpack kitaplığıdır. Glance API, RemoteViews'a derlenir ve Compose benzeri sözdizimini destekler: GlanceComposable, Column, Row, Text. Kitaplık, karmaşık XML kodu sorununu çözer ve JUnit aracılığıyla widget testine olanak tanır. Glance API henüz tüm RemoteViews özelliklerini desteklemez — karmaşık etkileşimli widget'lar için klasik yaklaşım daha iyidir. Android'de mobil geliştirmedeki Uygulama Uzantıları, widget oluşturma ve bakımını basitleştiren Glance API'ye doğru evriliyor.
Content Provider, birleşik bir ContentResolver arayüzü aracılığıyla uygulamalar arasında yapılandırılmış veri paylaşmak için bir Android bileşenidir. iOS Uygulama Uzantılarının aksine, Content Provider ayrı bir süreç oluşturmaz — veriler, çağıran uygulamanın bağlamında eşzamanlı olarak istenir. Content Provider, Android'deki sistem entegrasyonlarının temelidir: kişiler, medya dosyaları, takvim ve standart uygulamalar veri yayınlamak için bunu kullanır.
FileProvider, uygulamalar arasında güvenli dosya aktarımı için ContentProvider'ın bir alt sınıfıdır. FileProvider, Android 7+'da yasaklanan doğrudan file:// yolları yerine geçici content:// URI'leri oluşturur. Kullanmak için XML yapılandırmasında files-path veya external-files-path belirtmeniz gerekir. Android'de mobil geliştirmede Uygulama Uzantıları ayrı bir kavram olarak mevcut değildir, ancak FileProvider onların işlevini yerine getirir — veri paylaşım yeteneklerini tek bir uygulamanın ötesine genişletir.
iOS'ta, dosya paylaşımı rolünü File Provider Extension üstlenir. File Provider Extension, NSFileProviderManager aracılığıyla uygulamanın dosyalarını Dosyalar uygulamasında yayınlar. FileProvider'ın aksine, iOS uzantısı ayrı bir ikili dosya gerektirir ve izole bir süreçte çalışır. File Provider Extension, dosya tanımı için NSFileProviderItem'ı ve klasör gezinmesi için NSFileProviderEnumerator'ı destekler. File Provider Extension aracılığıyla mobil uygulamalardaki sistem entegrasyonları, kullanıcının uygulamayı açmadan Dosyalar uygulamasından uygulama dosyalarını yönetmesine olanak tanır.
class MyFileProviderExtension: NSFileProviderExtension {
override func item(for identifier: NSFileProviderItemIdentifier) throws -> NSFileProviderItem {
return MyFileProviderItem(identifier: identifier)
}
}
Örnek, Swift'te File Provider Extension'ın minimum bir uygulamasını gösterir. item(for:) yöntemi, tanımlayıcıya göre bir NSFileProviderItem nesnesi döndürür — sistem, Dosyalar uygulamasında dosyaları görüntülerken bunu çağırır.
Sıkça Sorulan Sorular
Uygulama Uzantıları, uygulamanın işlevselliğini sürecinin ötesine genişleten ayrı ikili dosyalardır: Today Widget, Share Extension, Action Extension, Keyboard Extension ve izole bir ortamda çalışan diğer türler.
CallKit, VoIP aramalarını sistem çağrı arayüzüne entegre eder ve kilitli ekranda görüntüler. PushKit, arka plan push bildirimlerini kullanıcıya göstermeden iletir — gelen bir arama hakkındaki bilgiler gibi verileri işlemek için uygulamayı uyandırır.
BroadcastReceiver, sistem yayın mesajlarına tepki veren bir Android bileşenidir: cihaz başlatma (BOOT_COMPLETED), ağ bağlantısı (CONNECTIVITY_ACTION), uçak modu değişiklikleri ve diğer işletim sistemi olayları.
Widget arayüzü oluşturmak için AppWidgetProvider'ı RemoteViews ile veya Kotlin DSL yaklaşımı için Glance API'yi (Jetpack) kullanın. Widget, boyut ve güncelleme sıklığını belirten bir XML açıklaması aracılığıyla bildirimde kaydedilir.
Content Provider, ContentResolver aracılığıyla uygulamalar arasında veri paylaşmak için bir Android bileşenidir. Kişilere, medya dosyalarına ve diğer uygulamalardan yapılandırılmış verilere erişmek için kullanılır.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.