Share Extension, uygulamanızı sistem Paylaşım sayfasına ekleyen bir iOS uzantısıdır. Kullanıcı, Safari, Fotoğraflar, Dosyalar veya herhangi bir uygulamadan içeriği kopyalamadan ve pencereler arasında geçiş yapmadan doğrudan uygulamanıza gönderebilir. Apple (2024)'a göre, Share Extension'a sahip uygulamalar, paylaşım özelliği olmayan uygulamalara kıyasla %35 daha fazla kullanıcı içeriği alır. Uzantı, birleşik NSExtensionItem arayüzü aracılığıyla metin, görsel, video, URL ve dosyaları işler.
Önemli Noktalar
Share Extension, herhangi bir uygulamada içerik seçildiğinde sistem Paylaşım sayfasında görünen bir iOS uygulama uzantısı türüdür. Kullanıcı Safari'de metni vurgular, Paylaş'a dokunur ve uygulamanızı mevcut eylemler listesinde görür. Seçimden sonra içerik, işlenmek üzere uzantıya iletilir: kaydetme, yayınlama, gönderme veya dönüştürme.
Action Extension'ın aksine, Share Extension harici uygulamalardan içerik almada uzmanlaşmıştır. Action Extension ise uygulamanızdan dışarıya veri gönderir. Share Extension, kullanıcı içeriği için bir giriş noktası, kullanıcı ediniminin önemli bir unsurudur: kullanıcılar uygulamanızı tamamen yüklemeden Share Extension aracılığıyla dener. App Store, tek işlevi Share Extension aracılığıyla reklam göstermek olan uygulamaları yasaklar (App Store Review Guideline 4.2).
Share Extension giriş engelini azaltır: kullanıcılar tanıdık bir bağlamdan — tarayıcı, galeri, dosya yöneticisi — uygulamanıza içerik gönderir. Branch (2024)'e göre, Share Extension'a sahip uygulamalar 7. günde %28 daha yüksek kullanıcı tutma oranı gösterir. Ek bir etki de viralliktir: bir kullanıcı Paylaşım sayfasında uygulamanızı her gördüğünde, reklam harcaması olmadan pasif markalama gerçekleşir.
Share Extension mekanizması, sistem NSExtensionItem kapsayıcıları aracılığıyla içerik aktarımına dayanır. Ana uygulama (Safari, Fotoğraflar) seçilen içeriği belirtilen bir türle (public.image, public.url, public.plain-text) NSExtensionItem'a paketler. Sistem bu kapsayıcıyı uzantıya iletir ve uzantı, verileri extensionContext.inputItems aracılığıyla çıkarır.
Share Extension, sınırlı yürütme süresiyle (işleme için yaklaşık 30 saniye) ayrı bir işlemde çalışır. Uzantı uzun senkron işlemler gerçekleştirmemelidir. Büyük dosyaları yüklemek için arka plan yapılandırmasıyla NSURLSession kullanın. SLComposeServiceViewController, içerik önizlemesi ve gönder düğmesiyle Share Extension için temel sınıftır.
iOS, aktarılan içeriğin türünü belirlemek için Uniform Type Identifiers (UTI) kullanır. Share Extension için ana UTI'ler: public.image (fotoğraflar, ekran görüntüleri), public.url (bağlantılar), public.plain-text (metin), public.video (video dosyaları) ve public.file-url (dosyalar). Uzantı, desteklenen UTI'leri NSExtensionActivationRule anahtarı aracılığıyla Info.plist'e kaydeder.
Share Extension üç bileşenden oluşur: Xcode'daki hedef, SLComposeServiceViewController ve Info.plist yapılandırması. Mimari, hangi içerik türlerinin işleneceğini, arayüzün nasıl görüntüleneceğini ve verilerin nereye kaydedileceğini belirler.
| Bileşen | Amaç | Özellikler |
|---|---|---|
| Target | Xcode'ta uzantı hedefi | Tanımlayıcılı ayrı paket |
| ViewController | Arayüz ve işleme mantığı | SLComposeServiceViewController veya özel |
| Info.plist | Etkinleştirme ve UTI yapılandırması | Predicate'lerle NSExtensionActivationRule |
| App Groups | Uygulamayla paylaşımlı depolama | Veri aktarımı için UserDefaults paketi |
Share Extension yapılandırmasının temel öğesi etkinleştirme kuralıdır. Uzantının Paylaşım sayfasında hangi koşullarda görüneceğini belirler. Kural, Info.plist'te kısıtlamaları olan bir sözlük olarak ayarlanır: maksimum görsel sayısı, minimum metin uzunluğu, zorunlu URL varlığı. Standart kural, uzantıyı herhangi bir tek içerik türü için etkinleştirir.
// Info.plist — Share Extension için NSExtensionActivationRule
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsImageWithMaxCount</key>
<integer>5</integer>
<key>NSExtensionActivationSupportsText</key>
<true/>
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
<integer>1</integer>
</dict>
Bir yer imi uygulaması için Swift'te Share Extension oluşturmanın pratik bir örneğine bakalım. Uzantı, Safari'den bir URL alır, bir önizleme arayüzü görüntüler ve bağlantıyı App Group'a kaydeder. SLComposeServiceViewController, bir metin alanı ve Gönder düğmesiyle hazır bir kullanıcı arayüzü sağlar.
import Social
import MobileCoreServices
class ShareViewController: SLComposeServiceViewController {
override func isContentValid() -> Bool {
return !(contentText?.isEmpty() ?? true)
}
override func didSelectPost() {
guard let item = extensionContext?.inputItems.first as? NSExtensionItem
else { return }
for attachment in item.attachments ?? [] {
attachment.loadItem(forTypeIdentifier: kUTTypeURL as String) {
[weak self] (item, error) in
if let url = item as? URL {
BookmarkService().save(url, title: self?.contentText)
}
self?.extensionContext?.completeRequest(
returningItems: [], completionHandler: nil)
}
}
}
}
İçerik gönderildikten sonra uzantı, completeRequest çağrısı yaparak sonlanır — bu zorunlu bir adımdır; aksi takdirde sistem uzantı sürecini serbest bırakmaz. Önemli: Share Extension, sınırlı ağ ve dosya sistemi erişimi olan kısıtlı bir ortamda çalışır — içerik yüklemeleri için arka plan oturumları kullanın.
Share Extension, farklı giriş verisi türlerini (metin, görseller, video, URL ve dosyalar) doğru şekilde işlemelidir. Her tür, kendi UTI'sini ve çıkarma yöntemini kullanır. Evrensel işleme — hasItemConformingToTypeIdentifier kontrolleriyle attachment.attachments üzerinde döngü yaparak.
Görseller, UIImage veya Data aracılığıyla alınabilme özelliğiyle public.image olarak iletilir. Büyük görseller için kaydetmeden önce jpegData(compressionQuality:) kullanın. Share Extension, kullanıcının açık izni olmadan orijinal görseli değiştirmemelidir. Orijinali App Group'da kaydetmeniz ve arayüzde görüntülemek için bir önizleme oluşturmanız önerilir.
Safari ve diğer tarayıcılar, URL'leri public.url olarak ve seçilen metni public.plain-text olarak iletir. Tek bir NSExtensionItem, aynı anda her iki türü de içerebilir — sayfanın URL'si ve üzerinde seçilen metin. Share Extension tüm ekleri kontrol etmeli ve ilgili verileri çıkarmalıdır. Birleşik senaryo: URL'yi yer imi olarak ve metni ona ekli not olarak kaydedin.
Share Extension ve ana uygulama farklı işlemlerde çalışır ve dosya sistemine ortak erişimleri yoktur. Veri alışverişi, group.* tanımlayıcısına sahip paylaşımlı bir kapsayıcı olan App Groups mekanizmasını kullanır. App Group'a veri kaydettikten sonra uzantı, CFNotificationCenter veya Darwin Notify aracılığıyla uygulamayı bilgilendirir.
App Groups, hedefin Yeteneklerinde etkinleştirilir: App Groups'u seçin ve bir tanımlayıcı ekleyin (örneğin, group.com.example.myapp). Ana uygulama ve uzantı olmak üzere her iki hedef de aynı gruba erişebilmelidir. UserDefaults paketi, minimum ek yük ile paylaşımlı depolamada veri okuma ve yazma olanağı sağlar.
// Share Extension'dan App Group'a veri kaydetme
let sharedDefaults = UserDefaults(suiteName: "group.com.example.myapp")
let bookmark: [String: Any] = [
"url": url.absoluteString,
"title": contentText ?? "",
"date": Date().timeIntervalSince1970
]
sharedDefaults?.set(bookmark, forKey: "bookmark_\(Date().timeIntervalSince1970)")
sharedDefaults?.synchronize()
Sıkça Sorulan Sorular
Share Extension, diğer uygulamalardan sizin uygulamanıza içerik alır. Action Extension ise ana uygulama içinde içerik üzerinde işlem yapar — metin çevirme, görsel düzenleme. Share Extension almadır, Action Extension dönüşümdür.
Uygulamanızın işlediği içerik türüne bağlıdır. Yer imleri için — public.url. Fotoğraf düzenleyici için — public.image. Notlar için — public.plain-text. Birden çok tür için, AND/OR predicate'lerinin birleşimiyle NSExtensionActivationRule kullanın.
Yaygın bir neden, hatalı NSExtensionActivationRule veya UTI uyuşmazlığıdır. Info.plist'te kontrol edin: etkinleştirme kuralı test edilen içerik türüyle eşleşmelidir. Ayrıca uzantının Ayarlar → uygulamanız → Siri ve Arama'da etkinleştirildiğinden emin olun. Xcode clean build genellikle sorunu çözer.
Sistem, yürütme için yaklaşık 30 saniye ayırır. Bundan sonra iOS, uzantı işlemini zorla sonlandırır. Uzun süren işlemler için arka plan NSURLSession kullanın ve sonucu bir sonraki uygulama başlatılışında işleyin.
Evet, SLComposeServiceViewController yerine normal bir UIViewController kullanabilirsiniz. Bu durumda, arayüzü tamamen kontrol edersiniz. Ancak, gönder ve iptal düğmelerini kendiniz uygulamanız gerekir. Özel arayüz, standart olmayan içerik işleme senaryoları için önerilir.
Ö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.
Ayrıca okuyun