Tutorial tentang Ekstensi Aplikasi iOS 8

Diterbitkan: 2022-03-11

Beberapa telah mencoba sebelumnya (lihat ini), tetapi Apple dengan iPhone pertama yang menentukan bagaimana seharusnya tampilan Smartphone dan OS seluler. Apple membuat terobosan luar biasa dalam perangkat keras dan pengalaman pengguna. Namun, kita sering lupa bahwa mereka juga menetapkan standar tentang cara kerja OS seluler, dan bagaimana aplikasi Smartphone harus dibuat.

Membangun dinding beton di antara aplikasi, membuatnya benar-benar terisolasi dan tidak menyadari satu sama lain, adalah metode terbaik untuk menjaganya tetap aman dan melindungi datanya. Semua aktivitas dipantau secara ketat oleh iOS, dan hanya ada beberapa tindakan yang dapat dilakukan aplikasi di luar cakupannya.

“Pantang adalah perlindungan terbaik!” - tapi di mana kesenangannya?

Mereka butuh beberapa saat; terlalu lama jika Anda bertanya kepada saya, tetapi dengan iOS 8 Apple memutuskan untuk bersenang-senang. iOS 8 memperkenalkan konsep baru yang disebut Ekstensi Aplikasi. Fitur baru ini tidak meruntuhkan dinding antara aplikasi, tetapi membuka beberapa pintu yang memberikan kontak lembut namun nyata antara beberapa aplikasi. Pembaruan terbaru memberi pengembang iOS opsi untuk menyesuaikan ekosistem iOS, dan kami juga ingin melihat jalur ini terbuka.

ekstensi aplikasi ios 8

Apa Itu Ekstensi Aplikasi iOS 8 dan Bagaimana Cara Kerjanya?

Secara sederhana, Ekstensi Aplikasi iOS 8 menyediakan metode baru untuk berinteraksi dengan aplikasi Anda, tanpa memulai atau menampilkannya di layar.

Seperti yang diharapkan, Apple memastikan mereka tetap di atas segalanya, jadi hanya ada beberapa titik masuk baru yang dapat diberikan aplikasi Anda:

  • Today (juga disebut widget) - ekstensi yang ditampilkan di tampilan Today dari Notification Center menunjukkan informasi singkat dan memungkinkan kinerja tugas cepat.
  • Bagikan - ekstensi yang memungkinkan aplikasi Anda berbagi konten dengan pengguna di jejaring sosial dan layanan berbagi lainnya.
  • Tindakan - ekstensi yang memungkinkan pembuatan tombol tindakan khusus di lembar Tindakan untuk memungkinkan pengguna melihat atau mengubah konten yang berasal dari aplikasi host.
  • Pengeditan Foto - ekstensi yang memungkinkan pengguna mengedit foto atau video dalam aplikasi Foto.
  • Penyedia Dokumen - ekstensi yang digunakan untuk mengizinkan aplikasi lain mengakses dokumen yang dikelola oleh aplikasi Anda.
  • Keyboard Kustom - ekstensi yang menggantikan keyboard sistem.

Ekstensi aplikasi bukan aplikasi yang berdiri sendiri. Mereka menyediakan fungsionalitas aplikasi yang diperluas (yang dapat diakses dari aplikasi lain, yang disebut aplikasi host) yang dimaksudkan agar efisien dan fokus pada satu tugas. Mereka memiliki biner sendiri, tanda tangan kode sendiri, dan kumpulan elemen sendiri, tetapi dikirimkan melalui App Store sebagai bagian dari biner aplikasi yang memuatnya. Satu (berisi) aplikasi dapat memiliki lebih dari satu ekstensi. Setelah pengguna memasang aplikasi yang memiliki ekstensi, ekstensi tersebut akan tersedia di iOS.

Mari kita lihat sebuah contoh: Seorang pengguna menemukan gambar menggunakan Safari, menekan tombol bagikan dan memilih ekstensi aplikasi Anda untuk berbagi. Safari "berbicara" dengan kerangka kerja Sosial iOS, yang memuat dan menyajikan ekstensi. Kode ekstensi berjalan, meneruskan data menggunakan saluran komunikasi yang dipakai sistem, dan setelah tugas selesai - Safari meruntuhkan tampilan ekstensi. Segera setelah ini, sistem menghentikan proses, dan aplikasi Anda tidak pernah ditampilkan di layar. Namun itu menyelesaikan fungsi berbagi gambar.

iOS, menggunakan komunikasi antar proses, adalah pihak yang bertanggung jawab untuk memastikan bahwa aplikasi host dan ekstensi aplikasi dapat bekerja sama. Pengembang menggunakan API tingkat tinggi yang disediakan oleh titik ekstensi dan sistem, sehingga mereka tidak perlu khawatir tentang mekanisme komunikasi yang mendasarinya.

Lingkaran kehidupan

Siklus hidup ekstensi aplikasi

Ekstensi Aplikasi memiliki siklus hidup yang berbeda dari aplikasi iOS. Aplikasi host memulai siklus hidup ekstensi sebagai respons terhadap tindakan pengguna. Kemudian sistem membuat instance ekstensi aplikasi dan menyiapkan saluran komunikasi di antara mereka. Tampilan ekstensi ditampilkan dalam konteks aplikasi host menggunakan item yang diterima dalam permintaan aplikasi host. Setelah tampilan ekstensi ditampilkan, pengguna dapat berinteraksi dengannya. Menanggapi tindakan pengguna, ekstensi menyelesaikan permintaan aplikasi host dengan segera melakukan/membatalkan tugas atau, jika perlu, memulai proses latar belakang untuk melakukannya. Tepat setelah itu, aplikasi host meruntuhkan tampilan ekstensi dan pengguna kembali ke konteks sebelumnya dalam aplikasi host. Hasil dari melakukan proses ini dapat dikembalikan ke aplikasi host setelah proses selesai. Ekstensi biasanya dihentikan segera setelah menyelesaikan permintaan yang diterima dari aplikasi host (atau memulai proses latar belakang untuk melakukannya).

Sistem membuka ekstensi tindakan pengguna dari aplikasi host, ekstensi menampilkan UI, melakukan beberapa pekerjaan, dan mengembalikan data ke aplikasi host (jika itu sesuai dengan jenis ekstensi). Aplikasi yang memuatnya bahkan tidak berjalan saat ekstensinya berjalan.

Membuat Ekstensi Aplikasi - Contoh Praktis Menggunakan Ekstensi Hari Ini

Ekstensi Hari Ini, juga disebut widget , terletak di tampilan Hari Ini di pusat Pemberitahuan. Mereka adalah cara yang bagus untuk menyajikan konten terkini bagi pengguna (seperti menunjukkan kondisi cuaca) atau melakukan tugas cepat (seperti menandai hal-hal yang dilakukan di widget aplikasi daftar tugas). Saya harus menunjukkan di sini bahwa entri keyboard tidak didukung .

cara kerja ekstensi aplikasi

Mari buat ekstensi Today yang akan menampilkan informasi terbaru dari aplikasi kita (kode di GitHub). Untuk menjalankan kode ini, harap pastikan bahwa Anda telah (kembali) mengonfigurasi Grup Aplikasi untuk proyek (pilih Tim Pengembangan Anda, ingatlah bahwa nama Grup Aplikasi harus unik dan ikuti instruksi Xcode).

ekstensi aplikasi ios 8

ekstensi aplikasi hari ini

ekstensi aplikasi menggunakan hari ini

Membuat Widget Baru

Seperti yang kami katakan sebelumnya, ekstensi aplikasi bukanlah aplikasi yang berdiri sendiri. Kami membutuhkan aplikasi yang berisi tempat kami akan membangun ekstensi aplikasi. Setelah kami memiliki aplikasi yang berisi kami, kami memilih untuk menambahkan target baru dengan menavigasi ke File -> New -> Target ke Xcode. Dari sini kami memilih template untuk target baru kami untuk menambahkan Ekstensi Hari Ini.

membuat template widget

Pada langkah selanjutnya kita dapat memilih Nama Produk kita. Itulah nama yang akan muncul di tampilan Today di Notification Center. Ada opsi untuk memilih bahasa antara Swift dan Objective-C di langkah ini juga. Dengan menyelesaikan langkah-langkah ini, Xcode membuat template Today, yang menyediakan file header dan implementasi default untuk kelas utama (bernama TodayViewController ) dengan file Info.plist dan file antarmuka (file storyboard atau .xib). File Info.plist , secara default, terlihat seperti ini:

 <key>NSExtension</key> <dict> <key>NSExtensionMainStoryboard</key> <string>MainInterface</string> <key>NSExtensionPointIdentifier</key> <string>com.apple.widget-extension</string> </dict>

Jika Anda tidak ingin menggunakan storyboard yang disediakan oleh template, hapus kunci NSExtensionMainStoryboard dan tambahkan kunci NSExtensionPrincipalClass dengan nama pengontrol tampilan Anda sebagai nilai.

Widget Hari Ini harus:

  • pastikan konten selalu terlihat up to date
  • merespons dengan tepat interaksi pengguna
  • berkinerja baik (widget iOS harus menggunakan memori dengan bijak atau mereka akan dihentikan oleh sistem)

Berbagi Data dan Wadah Bersama

Ekstensi aplikasi dan aplikasi yang berisi keduanya memiliki akses ke data bersama dalam wadah bersama yang ditentukan secara pribadi - yang merupakan cara komunikasi tidak langsung antara aplikasi yang memuat dan ekstensi.

Tidakkah Anda menyukai bagaimana Apple membuat hal-hal ini begitu "sederhana"? :)

Berbagi data melalui NSUserDefaults sederhana dan merupakan kasus penggunaan yang umum. Secara default, ekstensi dan aplikasi yang memuatnya menggunakan kumpulan data NSUserDefaults yang terpisah, dan tidak dapat mengakses wadah satu sama lain. Untuk mengubah perilaku ini, iOS memperkenalkan Grup Aplikasi . Setelah mengaktifkan grup aplikasi pada aplikasi yang memuat dan ekstensi, alih-alih menggunakan [NSUserDefaults standardUserDefaults] gunakan [[NSUserDefaults alloc] initWithSuiteName:@"group.yourAppGroupName"] untuk mengakses wadah bersama yang sama.

Memperbarui Widget

Untuk memastikan bahwa konten selalu terbarui, ekstensi Today menyediakan API untuk mengelola status widget dan menangani pembaruan konten. Sistem terkadang mengambil snapshot dari tampilan widget, jadi ketika widget menjadi terlihat, snapshot terbaru akan ditampilkan hingga diganti dengan versi live dari tampilan tersebut. Konformasi ke protokol NCWidgetProviding penting untuk memperbarui status widget sebelum snapshot diambil. Setelah widget menerima panggilan widgetPerformUpdateWithCompletionHandler: tampilan widget harus diperbarui dengan konten terbaru dan handler penyelesaian harus dipanggil dengan salah satu konstanta berikut untuk menjelaskan hasil pembaruan:

  • NCUpdateResultNewData - Konten baru memerlukan gambar ulang tampilan
  • NCUpdateResultNoDate - Widget tidak perlu diperbarui
  • NCUpdateResultFailed - Terjadi kesalahan selama proses pembaruan
 - (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler { // Perform any setup necessary in order to update the view. // If an error is encountered, use NCUpdateResultFailed // If there's no update required, use NCUpdateResultNoData // If there's an update, use NCUpdateResultNewData [self updateTableView]; completionHandler(NCUpdateResultNewData); }

Mengontrol Kapan Widget Dapat Dilihat

Untuk mengontrol kapan widget ditampilkan, gunakan metode setHasContent:forWidgetWithBundleIdentifier: dari kelas NCWidgetController . Metode ini memungkinkan Anda menentukan status konten widget. Itu dapat dipanggil dari widget atau dari aplikasi yang memuatnya (jika aktif). Anda dapat memberikan tanda NO atau YES ke metode ini, yang menentukan bahwa konten widget sudah siap atau belum. Jika konten belum siap, iOS tidak akan menampilkan widget Anda saat tampilan Hari Ini dibuka.

 NCWidgetController *widgetController = [[NCWidgetController alloc] init]; [widgetController setHasContent:YES forWidgetWithBundleIdentifier:@"com.your-company.your-app.your-widget"];

Membuka Aplikasi yang Mengandung dari Widget

Widget Hari Ini adalah satu-satunya ekstensi yang dapat meminta pembukaan aplikasi yang memuatnya dengan memanggil metode openURL:completionHandler: Untuk memastikan bahwa aplikasi yang memuatnya terbuka dengan cara yang masuk akal dalam konteks tugas pengguna saat ini, skema URL khusus (yang dapat digunakan oleh widget dan aplikasi yang memuatnya) harus ditentukan.

 [self.extensionContext openURL:[NSURL URLWithString:@"customURLsheme://URLpath"] completionHandler:nil];

Pertimbangan UI

Saat mendesain widget Anda, manfaatkan kelas UIVisualEffectView , dengan mengingat bahwa tampilan yang harus diburamkan/hidup harus ditambahkan ke contentView dan bukan ke UIVisualEffectView secara langsung. Widget (sesuai dengan protokol NCWidgetProviding ) harus memuat status yang di-cache di viewWillAppear: untuk mencocokkan status tampilan dari tampilan terakhirWillDisappear viewWillDisappear: dan kemudian bertransisi dengan lancar ke data baru saat tiba, yang bukan merupakan kasus dengan tampilan normal controller (UI diatur di viewDidLoad dan menangani animasi dan memuat data di viewWillAppear ). Widget harus dirancang untuk melakukan tugas, atau membuka aplikasi yang berisi dengan satu ketukan. Entri keyboard tidak tersedia dalam widget. Ini berarti bahwa setiap UI yang memerlukan entri teks tidak boleh digunakan.

Menambahkan gulungan ke dalam widget, baik vertikal maupun horizontal, tidak dimungkinkan. Atau lebih tepatnya, menambahkan tampilan gulir dimungkinkan tetapi menggulir tidak akan berfungsi. Gerakan pengguliran horizontal dalam tampilan gulir di ekstensi Hari Ini akan dicegat oleh pusat notifikasi yang akan menyebabkan pengguliran dari Hari Ini ke pusat Pemberitahuan. Menggulir secara vertikal tampilan gulir di dalam ekstensi Hari Ini akan terganggu dengan menggulir Tampilan Hari Ini.

Catatan Teknis

Di sini saya akan menunjukkan beberapa hal penting yang perlu diingat saat membuat Ekstensi Aplikasi.

Fitur Umum untuk Semua Ekstensi

Item berikut ini berlaku untuk semua ekstensi:

  • objek sharedApplication terlarang : Ekstensi aplikasi tidak dapat mengakses objek sharedApplication, atau menggunakan metode apa pun yang terkait dengan objek tersebut.

  • Kamera dan mikrofon dilarang : Ekstensi aplikasi tidak dapat mengakses kamera atau mikrofon di perangkat (tetapi ini tidak berlaku untuk semua elemen perangkat keras). Ini adalah akibat dari tidak tersedianya beberapa API. Untuk mengakses beberapa elemen perangkat keras dalam ekstensi aplikasi, Anda harus memeriksa apakah API-nya tersedia untuk ekstensi aplikasi atau tidak (dengan pemeriksaan ketersediaan API yang dijelaskan di atas).

  • Sebagian besar tugas latar belakang terlarang : Ekstensi aplikasi tidak dapat melakukan tugas latar belakang yang berjalan lama, kecuali memulai unggahan atau unduhan, yang dibahas di bawah ini.

  • AirDrop terlarang : Ekstensi aplikasi tidak dapat menerima (tetapi dapat mengirim) data menggunakan AirDrop.

Mengunggah/Mengunduh di Latar Belakang

Satu-satunya tugas yang dapat dilakukan di latar belakang adalah mengunggah/mengunduh, menggunakan NSURLSession object .

Setelah tugas unggah/unduh dimulai, ekstensi dapat menyelesaikan permintaan aplikasi host dan dihentikan tanpa memengaruhi hasil tugas. Jika ekstensi tidak berjalan pada saat tugas latar belakang selesai, sistem akan meluncurkan aplikasi yang memuatnya di latar belakang dan aplikasi metode delegasi application:handleEventsForBackgroundURLSession:completionHandler: dipanggil.

Aplikasi yang ekstensinya memulai tugas NSURLSession latar belakang harus memiliki wadah bersama yang disiapkan yang dapat diakses oleh aplikasi yang memuat dan ekstensinya.

Pastikan untuk membuat sesi latar belakang yang berbeda untuk aplikasi yang memuatnya dan setiap ekstensi aplikasinya (setiap sesi latar belakang harus memiliki pengenal unik). Ini penting karena hanya satu proses yang dapat menggunakan sesi latar belakang dalam satu waktu.

Aksi vs. Bagikan

Perbedaan antara ekstensi Action dan Share tidak sepenuhnya jelas dari sudut pandang pembuat kode, karena dalam praktiknya keduanya sangat mirip. Template Xcode untuk target ekstensi berbagi menggunakan SLComposeServiceViewController , yang menyediakan UI tampilan penulisan standar yang dapat Anda gunakan untuk berbagi sosial, tetapi itu tidak diperlukan. Ekstensi berbagi juga dapat mewarisi langsung dari UIViewController untuk desain kustom sepenuhnya, dengan cara yang sama ekstensi Action dapat mewarisi dari SLComposeServiceViewController .

Perbedaan antara kedua jenis ekstensi ini adalah cara penggunaannya. Dengan ekstensi Action, Anda dapat membuat ekstensi tanpa UI sendiri (misalnya, ekstensi yang digunakan untuk menerjemahkan teks yang dipilih dan mengembalikan terjemahan ke aplikasi host). Ekstensi berbagi memungkinkan Anda berbagi komentar, foto, video, audio, tautan, dan lainnya langsung dari aplikasi host. UIActivityViewController menggerakkan ekstensi Action dan Share, di mana ekstensi Share ditampilkan sebagai ikon warna di baris atas dan ekstensi tindakan disajikan sebagai ikon monokrom di baris bawah (Gambar 2.1).

API terlarang

API yang ditandai di file header dengan makro NS_EXTENSION_UNAVAILABLE , atau makro serupa untuk ketidaktersediaan, tidak dapat digunakan (misalnya: kerangka kerja UI HealthKit dan EventKit di iOS 8 tidak tersedia untuk digunakan di ekstensi aplikasi apa pun).

Jika Anda berbagi kode antara aplikasi dan ekstensi, Anda harus ingat bahwa bahkan mereferensikan API yang tidak diizinkan untuk ekstensi aplikasi akan menyebabkan penolakan aplikasi Anda dari App Store. Anda dapat memilih untuk menangani ini dengan memfaktorkan ulang kelas bersama ke dalam hierarki, dengan induk yang sama dan subkelas yang berbeda untuk target yang berbeda. Cara lain adalah dengan menggunakan pra-prosesor dengan #ifdef memeriksa. Karena masih belum built-in target conditional, Anda harus membuatnya sendiri.

Cara bagus lainnya untuk melakukan ini adalah dengan membuat kerangka kerja tertanam Anda sendiri. Pastikan saja bahwa itu tidak akan berisi API apa pun yang tidak tersedia untuk ekstensi. Untuk mengonfigurasi ekstensi aplikasi untuk menggunakan kerangka kerja yang disematkan, navigasikan ke pengaturan build target dan atur pengaturan "Hanya Perlu App-Extension-Safe API" ke Ya. Saat mengonfigurasi proyek Xcode, dalam fase pembuatan Salin File, "Kerangka" harus dipilih sebagai tujuan untuk kerangka kerja yang disematkan. Jika Anda memilih tujuan “SharedFrameworks”, kiriman Anda akan ditolak oleh App Store.

Catatan tentang Kompatibilitas Mundur

Meskipun ekstensi aplikasi hanya tersedia sejak iOS 8, Anda dapat membuat aplikasi berisi Anda tersedia untuk versi iOS sebelumnya.

Kepatuhan Antarmuka Manusia Apple

Ingatlah Pedoman Antarmuka Manusia iOS Apple saat merancang ekstensi aplikasi. Anda harus memastikan bahwa ekstensi aplikasi Anda bersifat universal, apa pun perangkat yang didukung oleh aplikasi berisi Anda. Untuk memastikan bahwa ekstensi aplikasi bersifat universal, gunakan pengaturan build keluarga perangkat yang ditargetkan di Xcode yang menetapkan nilai “iPhone/iPad” (terkadang disebut universal).

Kesimpulan

Ekstensi aplikasi jelas memiliki dampak yang paling terlihat di iOS 8. Karena 79% perangkat sudah menggunakan iOS 8 (sebagaimana diukur oleh App Store pada 13 April 2015), ekstensi aplikasi adalah fitur luar biasa yang harus dimanfaatkan oleh aplikasi. Dengan menggabungkan pembatasan API dan cara berbagi data antara ekstensi dan aplikasi yang memuatnya, tampaknya Apple berhasil mengatasi salah satu keluhan terbesar tentang platform tanpa mengorbankan model keamanannya. Masih tidak ada cara bagi aplikasi pihak ketiga untuk langsung membagikan data mereka satu sama lain. Meskipun ini adalah konsep yang sangat baru, namun terlihat sangat menjanjikan.