Share Extension — adalah ekstensi iOS yang menambahkan aplikasi Anda ke menu sistem “Bagikan” (Share Sheet). Pengguna dapat mengirim konten dari Safari, Foto, File, atau aplikasi lainnya langsung ke aplikasi Anda — tanpa menyalin dan berpindah antar jendela. Menurut data Apple (2024), aplikasi dengan Share Extension menerima 35% lebih banyak konten pengguna dibandingkan aplikasi tanpa kemampuan berbagi. Ekstensi memproses teks, gambar, video, URL, dan file melalui antarmuka terpadu NSExtensionItem.
Poin Utama
Share Extension — adalah jenis ekstensi iOS app extension yang muncul di menu sistem “Bagikan” saat memilih konten di aplikasi mana pun. Pengguna memilih teks di Safari, menekan “Bagikan” dan melihat aplikasi Anda dalam daftar tindakan yang tersedia. Setelah dipilih, konten dikirim ke ekstensi untuk diproses: disimpan, dipublikasikan, dikirim, atau diubah.
Tidak seperti Action Extension, Share Extension berspesialisasi dalam menerima konten dari aplikasi eksternal. Action Extension, sebaliknya, mengirim data dari aplikasi Anda ke luar. Share Extension adalah titik masuk konten pengguna, elemen kunci akuisisi pengguna: pengguna mencoba aplikasi melalui Share Extension tanpa menginstalnya sepenuhnya. App Store melarang aplikasi yang satu-satunya fungsinya menampilkan iklan melalui Share Extension (App Store Review Guideline 4.2).
Share Extension menurunkan hambatan masuk: pengguna mengirim konten ke aplikasi Anda dari konteks yang familiar — browser, galeri, manajer file. Menurut data Branch (2024), aplikasi dengan Share Extension menunjukkan retensi 28% lebih tinggi pada hari ke-7. Efek tambahan — viralitas: setiap kali pengguna melihat aplikasi Anda di Share Sheet, terjadi branding pasif tanpa biaya iklan.
Mekanisme Share Extension didasarkan pada transfer konten melalui wadah sistem NSExtensionItem. Aplikasi host (Safari, Foto) mengemas konten yang dipilih ke dalam NSExtensionItem dengan menentukan tipenya (public.image, public.url, public.plain-text). Sistem meneruskan wadah ini ke ekstensi, yang mengekstrak data melalui extensionContext.inputItems.
Share Extension dijalankan dalam proses terpisah dengan waktu eksekusi terbatas — sekitar 30 detik untuk pemrosesan. Ekstensi tidak boleh melakukan operasi panjang secara sinkron. Untuk mengunggah file besar, gunakan NSURLSession dengan konfigurasi latar belakang. SLComposeServiceViewController — kelas dasar untuk Share Extension dengan pratinjau konten dan tombol kirim.
iOS menggunakan Uniform Type Identifiers (UTI) untuk menentukan jenis konten yang ditransfer. UTI utama untuk Share Extension: public.image (foto, tangkapan layar), public.url (tautan), public.plain-text (teks), public.video (file video) dan public.file-url (file). Ekstensi mendaftarkan UTI yang didukung di Info.plist melalui kunci NSExtensionActivationRule.
Share Extension terdiri dari tiga komponen: target di Xcode, SLComposeServiceViewController, dan konfigurasi Info.plist. Arsitektur menentukan jenis konten apa yang diproses, bagaimana antarmuka ditampilkan, dan di mana data disimpan.
| Komponen | Tujuan | Fitur |
|---|---|---|
| Target | Target ekstensi di Xcode | Bundle terpisah dengan pengidentifikasi |
| ViewController | Antarmuka dan logika pemrosesan | SLComposeServiceViewController atau khusus |
| Info.plist | Konfigurasi aktivasi dan UTI | NSExtensionActivationRule dengan predikat |
| App Groups | Penyimpanan bersama dengan aplikasi | UserDefaults suite untuk transfer data |
Elemen kunci konfigurasi Share Extension — aturan aktivasi. Ini menentukan dalam kondisi apa ekstensi muncul di Share Sheet. Aturan ditentukan di Info.plist sebagai kamus dengan batasan: jumlah maksimum gambar, panjang minimum teks, keharusan adanya URL. Aturan standar mengaktifkan ekstensi untuk satu jenis konten apa pun.
// Info.plist — NSExtensionActivationRule untuk Share Extension
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsImageWithMaxCount</key>
<integer>5</integer>
<key>NSExtensionActivationSupportsText</key>
<true/>
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
<integer>1</integer>
</dict>
Mari kita lihat contoh praktis membuat Share Extension di Swift untuk aplikasi penanda. Ekstensi menerima URL dari Safari, menampilkan antarmuka dengan pratinjau, dan menyimpan tautan di App Group. SLComposeServiceViewController menyediakan UI siap pakai dengan bidang teks dan tombol Post.
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)
}
}
}
}
Setelah mengirim konten, ekstensi mengakhiri kerjanya dengan memanggil completeRequest — ini adalah langkah wajib, tanpa ini sistem tidak akan membebaskan proses ekstensi. Penting: Share Extension beroperasi di lingkungan terbatas dengan akses terbatas ke jaringan dan sistem file — gunakan sesi latar belakang untuk mengunggah konten.
Share Extension harus memproses berbagai jenis data masukan dengan benar: teks, gambar, video, URL, dan file. Untuk setiap jenis, digunakan UTI dan metode ekstraksi data sendiri. Pemrosesan universal — melalui perulangan pada attachment.attachments dengan pemeriksaan hasItemConformingToTypeIdentifier.
Gambar ditransfer sebagai public.image dengan kemungkinan diperoleh melalui UIImage atau Data. Untuk gambar besar, gunakan jpegData(compressionQuality:) sebelum menyimpan. Share Extension tidak boleh memodifikasi gambar asli tanpa izin eksplisit pengguna. Disarankan untuk menyimpan asli di App Group dan membuat pratinjau untuk ditampilkan di antarmuka.
Safari dan browser lainnya mengirimkan URL sebagai public.url, dan teks yang dipilih sebagai public.plain-text. Satu NSExtensionItem dapat berisi kedua jenis sekaligus — URL halaman dan teks yang dipilih di atasnya. Share Extension harus memeriksa semua attachment dan mengekstrak data yang relevan. Skenario kombinasi: simpan URL sebagai penanda, dan teks sebagai catatan untuknya.
Share Extension dan aplikasi utama berjalan dalam proses yang berbeda dan tidak memiliki akses bersama ke sistem file. Untuk pertukaran data, digunakan mekanisme App Groups: wadah bersama dengan pengidentifikasi group.*. Setelah menyimpan data di App Group, ekstensi memberi tahu aplikasi melalui CFNotificationCenter atau Darwin Notify.
App Groups diaktifkan di Capabilities target: pilih “App Groups” dan tambahkan pengidentifikasi (misalnya, group.com.example.myapp). Kedua target — aplikasi utama dan ekstensi — harus memiliki akses ke grup yang sama. UserDefaults suite memungkinkan membaca dan menulis data di penyimpanan bersama dengan overhead minimal.
// Menyimpan data ke App Group dari Share Extension
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()
Pertanyaan yang Sering Diajukan
Share Extension menerima konten dari aplikasi lain ke aplikasi Anda. Action Extension, sebaliknya, melakukan tindakan pada konten di dalam aplikasi host — menerjemahkan teks, mengubah gambar. Share Extension — penerimaan, Action Extension — transformasi.
Tergantung pada jenis konten aplikasi Anda. Untuk penanda — public.url. Untuk editor foto — public.image. Untuk catatan — public.plain-text. Untuk beberapa jenis, gunakan NSExtensionActivationRule dengan kombinasi predikat AND/OR.
Penyebab umum — NSExtensionActivationRule yang salah atau ketidakcocokan UTI. Periksa di Info.plist: aturan aktivasi harus sesuai dengan jenis konten yang diuji. Pastikan juga ekstensi diaktifkan di Settings → aplikasi Anda → Siri & Search. Xcode clean build sering menyelesaikan masalah.
Sistem mengalokasikan sekitar 30 detik untuk eksekusi. Setelah itu, iOS secara paksa mengakhiri proses ekstensi. Untuk operasi panjang, gunakan NSURLSession latar belakang dengan pemrosesan hasil pada peluncuran aplikasi berikutnya.
Ya, alih-alih SLComposeServiceViewController, Anda dapat menggunakan UIViewController biasa. Dalam hal ini, Anda sepenuhnya mengontrol antarmuka. Namun, tombol kirim dan batal harus diimplementasikan sendiri. UI kustom direkomendasikan untuk skenario pemrosesan konten yang tidak standar.
Kesimpulan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga