
Ekstensi Aplikasi muncul di iOS 8 dan menjadikan sistem lebih fleksibel, kuat, dan terjangkau bagi pengguna. Aplikasi dapat ditampilkan sebagai widget di Pusat Pemberitahuan, menawarkan filter untuk foto di Foto, menampilkan keyboard sistem baru dan banyak lagi. Pada saat yang sama, keamanan data pengguna dan sistem dipertahankan. Fitur-fitur dari pekerjaan Ekstensi Aplikasi akan dibahas di bawah ini.
Apple selalu berusaha untuk mengisolasi aplikasi satu sama lain dengan hati-hati. Ini adalah cara terbaik untuk memastikan keamanan pengguna dan melindungi data mereka. Setiap aplikasi diberikan tempat terpisah dalam sistem file dengan akses terbatas. Ekstensi Aplikasi memungkinkan untuk berinteraksi dengan aplikasi tanpa meluncurkannya atau menampilkannya di layar. Dengan demikian, sebagian dari fungsinya akan tersedia bagi pengguna ketika mereka berinteraksi dengan aplikasi atau sistem lain.
Ekstensi Aplikasi adalah file yang dapat dieksekusi yang dijalankan secara independen dari aplikasi yang mengandung -
Aplikasi yang Mengandung . Dengan sendirinya, mereka tidak dapat dipublikasikan di App Store, hanya dengan App Containing. Semua Ekstensi Aplikasi melakukan satu tugas khusus dan hanya terikat pada satu area iOS, tergantung pada jenisnya. Misalnya: Ekstensi Keyboard Kustom adalah untuk mengganti keyboard standar, dan Ekstensi Edit Foto untuk mengedit foto dalam Foto. Saat ini ada
25 jenis Ekstensi Aplikasi.
Ekstensi Aplikasi Ekstensi Kehidupan
Aplikasi yang digunakan pengguna untuk meluncurkan Ekstensi Aplikasi disebut
Aplikasi Host . Aplikasi Host meluncurkan siklus hidup Ekstensi Aplikasi, mengirimkannya permintaan sebagai respons terhadap tindakan pengguna:

- Pengguna memilih Ekstensi Aplikasi melalui Aplikasi Host.
- Aplikasi Host mengirimkan permintaan Ekstensi Aplikasi.
- iOS meluncurkan Ekstensi Aplikasi dalam konteks Aplikasi Host dan membangun saluran komunikasi di antara mereka.
- Pengguna melakukan tindakan di Ekstensi Aplikasi.
- Ekstensi Aplikasi menyelesaikan permintaan dari Aplikasi Host, melakukan tugas, atau memulai proses latar belakang untuk menyelesaikannya; setelah menyelesaikan tugas, hasilnya dapat dikembalikan ke Aplikasi Host.
- Setelah Ekstensi Aplikasi mengeksekusi kodenya, sistem mengakhiri Ekstensi Aplikasi ini.
Misalnya, saat berbagi foto dari Foto menggunakan Ekstensi Berbagi Facebook, Facebook adalah Aplikasi yang Berisi dan Foto adalah Aplikasi Host. Dalam hal ini, Foto memulai siklus hidup Ekstensi Berbagi Facebook ketika pengguna memilihnya di menu Bagikan:

Interaksi dengan Ekstensi Aplikasi

- Aplikasi yang Mengandung - Aplikasi Host
Jangan berinteraksi satu sama lain.
- Ekstensi Aplikasi - Aplikasi Host
Berinteraksi menggunakan IPC .
- Ekstensi Aplikasi - Aplikasi yang Mengandung
Interaksi tidak langsung. Grup Aplikasi digunakan untuk pertukaran data, dan Kerangka Tertanam digunakan untuk kode umum. Anda dapat meluncurkan Aplikasi Pengisian dari Ekstensi Aplikasi menggunakan Skema URL .
Kode umum: kerangka kerja dinamis
Jika Aplikasi yang Berisi dan Ekstensi Aplikasi menggunakan kode yang sama, itu harus ditempatkan dalam kerangka kerja yang dinamis.
Misalnya, Ekstensi Pengeditan Foto dapat dikaitkan dengan aplikasi pengeditan foto khusus yang menggunakan beberapa filter dari Aplikasi Yang Mengandung. Solusi yang baik adalah membuat kerangka kerja dinamis untuk filter ini.
Untuk melakukan ini, tambahkan
Target baru dan pilih
Cocoa Touch Framework :

Tentukan nama (misalnya,
ImageFilters ), dan di panel navigator Anda dapat melihat folder baru dengan nama kerangka kerja yang dibuat:

Anda perlu memastikan bahwa kerangka kerja tidak menggunakan API yang tidak tersedia untuk Ekstensi Aplikasi:
- Dibagikan dari aplikasi UIA.
- API ditandai dengan makro yang tidak dapat diakses.
- Kamera dan mikrofon (kecuali Ekstensi iMessage).
- Melakukan tugas latar belakang yang panjang (fitur pembatasan ini bervariasi tergantung pada jenis Ekstensi Aplikasi).
- Terima data menggunakan AirDrop.
Menggunakan salah satu dari daftar ini di Ekstensi Aplikasi akan mengarah pada penolakannya saat dipublikasikan ke App Store.
Dalam pengaturan kerangka kerja secara
umum, Anda perlu mencentang kotak di samping
"Izinkan API ekstensi aplikasi" :

Dalam kode kerangka kerja, semua kelas, metode, dan properti yang digunakan di Aplikasi yang Berisi dan Ekstensi Aplikasi harus bersifat
public
. Di mana pun Anda perlu menggunakan kerangka kerja, lakukan
import
:
import ImageFilters
Pertukaran Data: Grup Aplikasi
Aplikasi yang Berisi dan Ekstensi Aplikasi memiliki bagian terbatas sendiri dari sistem file, dan hanya mereka yang memiliki akses ke sana. Agar Aplikasi yang Berisi dan Ekstensi Aplikasi memiliki wadah umum dengan akses baca dan tulis, Anda perlu membuat Grup Aplikasi untuk mereka.
Grup Aplikasi dibuat di
Portal Pengembang Apple :

Di sudut kanan atas, klik "+", di jendela yang muncul, masukkan data yang diperlukan:

Selanjutnya
Lanjutkan -> Daftar -> Selesai .
Di Pengaturan Aplikasi yang Mengandung, buka tab
Kemampuan , aktifkan Grup Aplikasi dan pilih grup yang dibuat:

Demikian pula untuk Ekstensi Aplikasi:

Sekarang Aplikasi yang Berisi dan Ekstensi Aplikasi berbagi wadah. Selanjutnya, kita akan berbicara tentang cara membaca dan menulisnya.
Kerusakan Pengguna
Untuk bertukar sejumlah kecil data, mudah untuk menggunakan
UserDefaults
, Anda hanya perlu menentukan nama Grup Aplikasi:
let sharedDefaults = UserDefaults(suiteName: "group.com.maxial.onemoreapp")
NSFileCoordinator dan NSFilePresenter
Untuk data besar,
NSFileCoordinator
lebih cocok untuk memastikan konsistensi baca / tulis. Ini akan menghindari korupsi data, karena ada kemungkinan beberapa proses dapat mengaksesnya secara bersamaan.
URL wadah bersama diperoleh sebagai berikut:
let sharedUrl = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.maxial.onemoreapp")
Rekam:
fileCoordinator.coordinate(writingItemAt: sharedUrl, options: [], error: nil) { [unowned self] newUrl in do { let data = try NSKeyedArchiver.archivedData(withRootObject: self.object, requiringSecureCoding: false) try data.write(to: newUrl, options: .atomic) } catch { print(error) } }
Membaca:
fileCoordinator.coordinate(readingItemAt: sharedUrl, options: [], error: nil) { newUrl in do { let data = try Data(contentsOf: newUrl) if let object = try NSKeyedUnarchiver.unarchivedObject(ofClass: NSString.self, from: data) as String? { self.object = object } } catch { print(error) } }
Perlu dipertimbangkan bahwa
NSFileCoordinator
bekerja secara serempak. Sementara beberapa file akan ditempati oleh beberapa proses, yang lain harus menunggu untuk dirilis.
Jika Anda ingin Ekstensi Aplikasi mengetahui kapan Aplikasi yang Berisi mengubah status data,
NSFilePresenter
digunakan. Ini adalah protokol yang implementasinya mungkin terlihat seperti ini:
extension TodayViewController: NSFilePresenter { var presentedItemURL: URL? { let sharedUrl = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.maxial.onemoreapp") return sharedUrl?.appendingPathComponent("Items") } var presentedItemOperationQueue: OperationQueue { return .main } func presentedItemDidChange() { } }
Properti
presentedItemOperationQueue
mengembalikan antrian yang digunakan untuk panggilan balik saat mengubah file. Metode yang
presentedItemDidChange()
dipanggil ketika suatu proses, dalam hal ini Aplikasi yang Mengandung, mengubah isi data. Jika perubahan telah dilakukan secara langsung menggunakan panggilan tulis tingkat rendah, maka
presentedItemDidChange()
tidak dipanggil. Hanya perubahan yang menggunakan
NSFileCoordinator
.
Saat menginisialisasi objek
NSFileCoordinator
,
NSFileCoordinator
disarankan untuk melewati objek
NSFilePresenter
, terutama jika memulai operasi file apa pun:
let fileCoordinator = NSFileCoordinator(filePresenter: self)
Jika tidak, objek
NSFilePresenter
akan menerima pemberitahuan tentang operasi ini, yang dapat menyebabkan kebuntuan saat bekerja di utas yang sama.
Untuk mulai memantau keadaan data, Anda perlu memanggil metode
addFilePresenter(_:)
dengan objek yang sesuai:
NSFileCoordinator.addFilePresenter(self)
Objek
NSFileCoordinator
dibuat kemudian
NSFileCoordinator
secara otomatis mengetahui tentang objek
NSFilePresenter
ini dan memberi tahu tentang perubahan dalam direktori.
Untuk berhenti memantau status data, gunakan
removeFilePresenter(_:)
:
NSFileCoordinator.removeFilePresenter(self)
Data inti
Untuk berbagi data, Anda dapat menggunakan SQLite dan, karenanya, Core Data. Mereka dapat mengelola proses yang berfungsi dengan data bersama. Untuk mengonfigurasikan Data Inti untuk dibagikan antara Aplikasi yang Berisi dan Ekstensi Aplikasi, buat subkelas
NSPersistentContainer
dan timpa metode
defaultDirectoryURL
, yang akan mengembalikan alamat penyimpanan data:
class SharedPersistentContainer: NSPersistentContainer { override open class func defaultDirectoryURL() -> URL { var storeURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.maxial.onemoreapp") storeURL = storeURL?.appendingPathComponent("OneMoreApp.sqlite") return storeURL! } }
Di
AppDelegate
ubah properti
persistentContainer
. Secara otomatis dibuat jika, saat membuat proyek, centang kotak centang
Gunakan Data Inti . Sekarang kita akan mengembalikan objek dari kelas
SharedPersistentContainer
:
lazy var persistentContainer: NSPersistentContainer = { let container = SharedPersistentContainer(name: "OneMoreApp") container.loadPersistentStores(completionHandler: { (storeDescription, error) in if let error = error as NSError? { fatalError("Unresolved error \(error), \(error.userInfo)") } }) return container }()
Yang tersisa hanyalah menambahkan
.xcdatamodeld ke Ekstensi Aplikasi. Pilih file .xcdatododeld di panel navigator. Di
Pemeriksa File , di bawah bagian
Keanggotaan Target , centang kotak di sebelah Ekstensi Aplikasi:

Dengan demikian, Aplikasi yang Berisi dan Ekstensi Aplikasi akan dapat membaca dan menulis data ke penyimpanan yang sama dan menggunakan model yang sama.
Meluncurkan Aplikasi yang Mengandung dari Ekstensi Aplikasi
Ketika Aplikasi Host mengirim permintaan Ekstensi Aplikasi, itu menyediakan
extensionContext
. Objek ini memiliki metode
open(_:completionHandler:)
, yang dengannya Anda dapat membuka Aplikasi Yang Mengandung. Namun, metode ini tidak tersedia untuk semua jenis Ekstensi Aplikasi. Di iOS, didukung oleh Today Extension dan iMessage Extension. Ekstensi iMessage hanya dapat menggunakannya untuk membuka Aplikasi Yang Mengandung. Jika Today Extension membuka aplikasi lain dengannya, verifikasi tambahan mungkin diperlukan untuk dikirimkan ke App Store.
Untuk membuka aplikasi dari Ekstensi Aplikasi, Anda perlu menentukan Skema URL di Aplikasi yang Mengandung:

Selanjutnya, panggil metode
open(_:completionHandler:)
dengan diagram ini dari App Extension:
guard let url = URL(string: "OneMoreAppUrl://") else { return } extensionContext?.open(url, completionHandler: nil)
Untuk jenis-jenis Ekstensi Aplikasi yang memanggil metode
open(_:completionHandler:)
tidak tersedia, ada juga caranya. Tetapi ada kemungkinan bahwa aplikasi tersebut dapat ditolak saat memeriksa di App Store. Inti dari metode ini adalah melalui rantai objek
UIResponder
hingga ada aplikasi
openURL
yang menerima panggilan
openURL
:
guard let url = URL(string: "OneMoreAppUrl://") else { return } let selectorOpenURL = sel_registerName("openURL:") var responder: UIResponder? = self while responder != nil { if responder?.responds(to: selectorOpenURL) == true { responder?.perform(selectorOpenURL, with: url) } responder = responder?.next }
Ekstensi Aplikasi Masa Depan
Ekstensi Aplikasi telah membawa banyak ke pengembangan iOS. Secara bertahap, lebih banyak jenis Ekstensi Aplikasi muncul, kemampuan mereka berkembang. Misalnya, dengan rilis iOS 12 SDK, Anda sekarang dapat berinteraksi dengan area konten dalam notifikasi, yang telah lama hilang.
Dengan demikian, Apple terus mengembangkan alat ini, yang menginspirasi optimisme tentang masa depannya.
Tautan yang bermanfaat:Dokumentasi resmiBerbagi data antara aplikasi iOS dan ekstensi aplikasiTip Pengembangan Ekstensi Aplikasi iOS 8