Semua yang perlu Anda ketahui tentang Ekstensi Aplikasi iOS



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 resmi
Berbagi data antara aplikasi iOS dan ekstensi aplikasi
Tip Pengembangan Ekstensi Aplikasi iOS 8

Source: https://habr.com/ru/post/id441890/


All Articles