Ekstensi iOS di Xamarin.iOS
Membuat Ekstensi di video iOS
Ekstensi, seperti yang diperkenalkan di iOS 8, khusus UIViewControllers
yang disajikan oleh iOS di dalam konteks standar seperti dalam Pusat Pemberitahuan, seperti jenis keyboard kustom yang diminta oleh pengguna untuk melakukan input khusus atau konteks lain seperti mengedit foto di mana Ekstensi dapat memberikan filter efek khusus.
Semua Ekstensi diinstal bersama dengan aplikasi Kontainer (dengan kedua elemen yang ditulis menggunakan API Terpadu 64-bit) dan diaktifkan dari Titik Ekstensi tertentu di aplikasi Host. Dan karena mereka akan digunakan sebagai suplemen untuk fungsi sistem yang ada, mereka harus berkinerja tinggi, ramping, dan kuat.
Titik ekstensi
Tipe | Deskripsi | Titik Ekstensi | Aplikasi Host |
---|---|---|---|
Perbuatan | Editor atau penampil khusus untuk jenis media tertentu | com.apple.ui-services |
Mana pun |
Penyedia Dokumen | Memungkinkan aplikasi menggunakan penyimpanan dokumen jarak jauh | com.apple.fileprovider-ui |
Aplikasi yang menggunakan UIDocumentPickerViewController |
Keyboard | Keyboard alternatif | com.apple.keyboard-service |
Mana pun |
Pengeditan Foto | Manipulasi dan pengeditan foto | com.apple.photo-editing |
editor Photos.app |
Bagikan | Berbagi data dengan jejaring sosial, layanan olahpesan, dll. | com.apple.share-services |
Mana pun |
Hari Ini | "Widget" yang muncul di layar Hari Ini atau Pusat Pemberitahuan | com.apple.widget-extensions |
Hari Ini dan Pusat Pemberitahuan |
Titik ekstensi tambahan ditambahkan di iOS 10 dan iOS 12. Anda dapat menemukan tabel lengkap semua jenis yang didukung di Panduan Pemrograman Ekstensi Aplikasi iOS.
Batasan
Ekstensi memiliki sejumlah batasan, beberapa di antaranya bersifat universal untuk semua jenis (misalnya, tidak ada jenis Ekstensi yang dapat mengakses kamera atau mikrofon) sementara jenis Ekstensi lainnya mungkin memiliki batasan khusus pada penggunaannya (misalnya, keyboard kustom tidak dapat digunakan untuk bidang entri data yang aman seperti untuk kata sandi).
Batasan universal adalah:
- Kit Kesehatan dan Kerangka Kerja Antarmuka Pengguna Event Kit tidak tersedia
- Ekstensi tidak dapat menggunakan mode latar belakang yang diperluas
- Ekstensi tidak dapat mengakses kamera atau mikrofon perangkat (meskipun mereka dapat mengakses file media yang ada)
- Ekstensi tidak dapat menerima data Air Drop (meskipun dapat mengirimkan data melalui Air Drop)
- UIActionSheet dan UIAlertView tidak tersedia; ekstensi harus menggunakan UIAlertController
- Beberapa anggota UIApplication tidak tersedia: UIApplication.SharedApplication, UIApplication.OpenUrl, UIApplication.BeginIgnoringInteractionEvents dan UIApplication.EndIgnoringInteractionEvents
- iOS memberlakukan batas penggunaan memori 16 MB pada ekstensi Hari Ini.
- Secara default ekstensi keyboard tidak memiliki akses ke jaringan. Ini memengaruhi penelusuran kesalahan pada perangkat (pembatasan tidak diberlakukan dalam simulator), karena Xamarin.iOS memerlukan akses jaringan agar penelusuran kesalahan berfungsi. Dimungkinkan untuk meminta akses jaringan dengan mengatur
Requests Open Access
nilai dalam Info.plist proyek keYes
. Silakan lihat Panduan Papan Ketik Kustom Apple untuk informasi selengkapnya tentang batasan ekstensi keyboard.
Untuk batasan individual, silakan lihat Panduan Pemrograman Ekstensi Aplikasi Apple.
Mendistribusikan, menginstal, dan menjalankan ekstensi
Ekstensi didistribusikan dari dalam aplikasi kontainer, yang pada gilirannya dikirimkan dan didistribusikan melalui App Store. Ekstensi yang didistribusikan dengan aplikasi diinstal pada saat itu, tetapi pengguna harus mengaktifkan setiap Ekstensi secara eksplisit. Berbagai jenis Ekstensi diaktifkan dengan cara yang berbeda; beberapa mengharuskan pengguna untuk menavigasi ke aplikasi Pengaturan dan mengaktifkannya dari sana. Sementara yang lain diaktifkan pada titik penggunaan, seperti mengaktifkan Ekstensi Berbagi saat mengirim foto.
Aplikasi tempat Ekstensi digunakan (di mana pengguna menemukan Titik Ekstensi) disebut sebagai aplikasi Host, karena ini adalah aplikasi yang menghosting Ekstensi saat dijalankan. Aplikasi yang menginstal Ekstensi adalah aplikasi Kontainer, karena ini adalah aplikasi yang berisi Ekstensi saat diinstal.
Biasanya, aplikasi kontainer menjelaskan ekstensi dan memandu pengguna melalui proses mengaktifkannya.
Debug dan rilis versi ekstensi
Batas memori untuk menjalankan ekstensi aplikasi secara signifikan lebih rendah dari batas memori yang diterapkan ke aplikasi latar depan. Simulator yang menjalankan iOS memiliki lebih sedikit batasan yang diterapkan pada ekstensi, dan Anda dapat menjalankan ekstensi Anda tanpa masalah. Namun, menjalankan ekstensi yang sama pada perangkat dapat menyebabkan hasil yang tidak terduga, termasuk ekstensi yang mengalami crash atau dihentikan secara agresif oleh sistem. Oleh karena itu, pastikan Anda membangun dan menguji ekstensi pada perangkat sebelum mengirimkannya.
Anda harus memastikan bahwa pengaturan berikut diterapkan ke proyek kontainer dan semua ekstensi yang dirujuk:
- Buat paket aplikasi dalam konfigurasi Rilis .
- Di pengaturan proyek Build iOS, atur opsi Perilaku linker ke Tautkan SDK Kerangka Kerja Saja atau Tautkan Semua.
- Di pengaturan proyek Debug iOS, hapus centang opsi Aktifkan penelusuran kesalahan dan Aktifkan pembuatan profil.
Siklus hidup ekstensi
Ekstensi dapat sesering UIViewController tunggal atau Ekstensi yang lebih kompleks yang menyajikan beberapa layar UI. Ketika pengguna menemukan Titik Ekstensi (seperti saat berbagi gambar), mereka akan memiliki kesempatan untuk memilih dari Ekstensi yang terdaftar untuk Titik Ekstensi tersebut.
Jika mereka memilih salah satu Ekstensi aplikasi Anda, UIViewController
ekstensi tersebut akan diinstansiasi dan memulai siklus hidup View Controller normal. Namun, tidak seperti aplikasi normal, yang ditangguhkan tetapi umumnya tidak dihentikan ketika pengguna selesai berinteraksi dengan mereka, Ekstensi dimuat, dijalankan, dan kemudian dihentikan berulang kali.
Ekstensi dapat berkomunikasi dengan aplikasi Host mereka melalui objek NSExtensionContext . Beberapa Ekstensi memiliki operasi yang menerima panggilan balik asinkron dengan hasilnya. Panggilan balik ini akan dijalankan pada utas latar belakang dan Ekstensi harus mempertimbangkan hal ini; misalnya, dengan menggunakan NSObject.InvokeOnMainThread jika mereka ingin memperbarui antarmuka pengguna. Lihat bagian Berkomunikasi dengan Aplikasi Host di bawah ini untuk detail selengkapnya.
Secara default, Ekstensi dan aplikasi kontainer mereka tidak dapat berkomunikasi, meskipun diinstal bersama-sama. Dalam beberapa kasus, aplikasi Kontainer pada dasarnya adalah kontainer "pengiriman" kosong yang tujuannya dilayani setelah Ekstensi diinstal. Namun, jika keadaan menentukan, aplikasi Kontainer dan Ekstensi dapat berbagi sumber daya dari area umum. Selain itu, Ekstensi Hari Ini dapat meminta aplikasi Kontainernya untuk membuka URL. Perilaku ini ditampilkan di Widget Hitung Mundur Peristiwa.
Membuat ekstensi
Ekstensi (dan aplikasi Kontainernya) harus biner 64-bit dan dibuat menggunakan API Terpadu Xamarin.iOS. Saat mengembangkan Ekstensi, solusi Anda akan berisi setidaknya dua proyek: aplikasi kontainer dan satu proyek untuk setiap Ekstensi yang disediakan kontainer.
Persyaratan proyek aplikasi kontainer
Aplikasi Kontainer yang digunakan untuk menginstal Ekstensi memiliki persyaratan berikut:
- Ini harus mempertahankan referensi ke proyek Ekstensi.
- Ini harus berupa aplikasi lengkap (harus dapat diluncurkan dan berjalan dengan sukses) bahkan jika tidak lebih dari menyediakan cara untuk menginstal Ekstensi.
- Ini harus memiliki Pengidentifikasi Bundel yang merupakan dasar untuk Pengidentifikasi Bundel proyek Ekstensi (lihat bagian di bawah ini untuk detail selengkapnya).
Persyaratan proyek ekstensi
Selain itu, proyek Ekstensi memiliki persyaratan berikut:
Ini harus memiliki Pengidentifikasi Bundel yang dimulai dengan Pengidentifikasi Bundel aplikasi Kontainernya. Misalnya, jika aplikasi Kontainer memiliki Pengidentifikasi
com.myCompany.ContainerApp
Bundel , pengidentifikasi Ekstensi mungkin :com.myCompany.ContainerApp.MyExtension
Ini harus menentukan kunci
NSExtensionPointIdentifier
, dengan nilai yang sesuai (seperticom.apple.widget-extension
untuk widget Pusat Pemberitahuan Hari Ini ), dalam filenyaInfo.plist
.Ini juga harus menentukan
NSExtensionMainStoryboard
kunci atauNSExtensionPrincipalClass
kunci dalam filenyaInfo.plist
dengan nilai yang sesuai:- Gunakan kunci
NSExtensionMainStoryboard
untuk menentukan nama Storyboard yang menyajikan UI utama untuk Ekstensi (minus.storyboard
). Misalnya,Main
untukMain.storyboard
file. - Gunakan kunci
NSExtensionPrincipalClass
untuk menentukan kelas yang akan diinisialisasi saat Ekstensi dimulai. Nilai harus cocok dengan nilai Register AndaUIViewController
:
- Gunakan kunci
Jenis Ekstensi tertentu mungkin memiliki persyaratan tambahan. Misalnya, kelas utama Ekstensi Hari Ini atau Pusat Pemberitahuan harus menerapkan INCWidgetProviding.
Penting
Jika Anda memulai proyek menggunakan salah satu templat Ekstensi yang disediakan oleh Visual Studio untuk Mac, sebagian besar (jika tidak semua) persyaratan ini akan disediakan dan dipenuhi untuk Anda secara otomatis oleh templat.
Panduan
Dalam panduan berikut, Anda akan membuat contoh widget Hari Ini yang menghitung hari dan jumlah hari yang tersisa dalam setahun:
Membuat solusi
Untuk membuat solusi yang diperlukan, lakukan hal berikut:
Pertama, buat iOS baru, proyek Aplikasi Tampilan Tunggal dan klik tombol Berikutnya :
Panggil proyek
TodayContainer
dan klik tombol Berikutnya :Verifikasi Nama Proyek dan SolutionName dan klik tombol Buat untuk membuat solusi:
Selanjutnya, di Penjelajah Solusi, klik kanan pada Solusi dan tambahkan proyek Ekstensi iOS baru dari templat Ekstensi Hari Ini:
Panggil proyek
DaysRemaining
dan klik tombol Berikutnya :Tinjau proyek dan klik tombol Buat untuk membuatnya:
Solusi yang dihasilkan sekarang harus memiliki dua proyek, seperti yang ditunjukkan di sini:
Membuat antarmuka pengguna ekstensi
Selanjutnya, Anda harus merancang antarmuka untuk widget Today Anda. Ini dapat dilakukan menggunakan Storyboard atau dengan membuat UI dalam kode. Kedua metode akan dibahas di bawah ini secara rinci.
Menggunakan papan cerita
Untuk membangun UI dengan Storyboard, lakukan hal berikut:
Di Penjelajah Solusi, klik dua kali file proyek
Main.storyboard
Ekstensi untuk membukanya untuk pengeditan:Pilih Label yang secara otomatis ditambahkan ke antarmuka pengguna menurut templat dan berikan Nama
TodayMessage
di tab Widget dari Penjelajah Properti:Simpan perubahan ke Storyboard.
Menggunakan kode
Untuk membangun UI dalam kode, lakukan hal berikut:
Di Penjelajah Solusi, pilih proyek DaysRemaining, tambahkan kelas baru dan sebut saja
CodeBasedViewController
:Sekali lagi, di Penjelajah Solusi, klik dua kali file Ekstensi
Info.plist
untuk membukanya untuk pengeditan:Pilih Tampilan Sumber (dari bagian bawah layar) dan buka simpul
NSExtension
:Hapus kunci
NSExtensionMainStoryboard
dan tambahkanNSExtensionPrincipalClass
dengan nilaiCodeBasedViewController
:Simpan perubahan.
Selanjutnya, edit CodeBasedViewController.cs
file dan buat terlihat seperti berikut ini:
using System;
using Foundation;
using UIKit;
using NotificationCenter;
using CoreGraphics;
namespace DaysRemaining
{
[Register("CodeBasedViewController")]
public class CodeBasedViewController : UIViewController, INCWidgetProviding
{
public CodeBasedViewController ()
{
}
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
// Add label to view
var TodayMessage = new UILabel (new CGRect (0, 0, View.Frame.Width, View.Frame.Height)) {
TextAlignment = UITextAlignment.Center
};
View.AddSubview (TodayMessage);
// Insert code to power extension here...
}
}
}
Perhatikan bahwa cocok [Register("CodeBasedViewController")]
dengan nilai yang Anda tentukan untuk yang di NSExtensionPrincipalClass
atas.
Mengoding ekstensi
Dengan Antarmuka Pengguna yang dibuat, buka TodayViewController.cs
file atau CodeBasedViewController.cs
(berdasarkan metode yang digunakan untuk membuat Antarmuka Pengguna di atas), ubah metode ViewDidLoad dan buat terlihat seperti berikut ini:
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
// Calculate the values
var dayOfYear = DateTime.Now.DayOfYear;
var leapYearExtra = DateTime.IsLeapYear (DateTime.Now.Year) ? 1 : 0;
var daysRemaining = 365 + leapYearExtra - dayOfYear;
// Display the message
if (daysRemaining == 1) {
TodayMessage.Text = String.Format ("Today is day {0}. There is one day remaining in the year.", dayOfYear);
} else {
TodayMessage.Text = String.Format ("Today is day {0}. There are {1} days remaining in the year.", dayOfYear, daysRemaining);
}
}
Jika menggunakan metode Antarmuka Pengguna berbasis kode, ganti // Insert code to power extension here...
komentar dengan kode baru dari atas. Setelah memanggil implementasi dasar (dan menyisipkan Label untuk versi berbasis kode), kode ini melakukan perhitungan sederhana untuk mendapatkan hari dalam setahun dan berapa hari tersisa. Kemudian menampilkan pesan di Label (TodayMessage
) yang Anda buat dalam desain UI.
Perhatikan seberapa mirip proses ini dengan proses normal penulisan aplikasi. Ekstensi UIViewController
memiliki siklus hidup yang sama dengan Pengontrol Tampilan di aplikasi, kecuali Ekstensi tidak memiliki mode latar belakang dan tidak ditangguhkan saat pengguna selesai menggunakannya. Sebagai gantinya, Ekstensi berulang kali diinisialisasi dan dibatalkan alokasinya sesuai kebutuhan.
Membuat antarmuka pengguna aplikasi kontainer
Untuk panduan ini, aplikasi kontainer hanya digunakan sebagai metode untuk mengirim dan menginstal Ekstensi dan tidak menyediakan fungsionalitasnya sendiri. Edit file TodayContainer Main.storyboard
dan tambahkan beberapa teks yang menentukan fungsi Ekstensi dan cara menginstalnya:
Simpan perubahan ke Storyboard.
Menguji ekstensi
Untuk menguji Ekstensi Anda di Simulator iOS, jalankan aplikasi TodayContainer . Tampilan utama kontainer akan ditampilkan:
Selanjutnya, tekan tombol Beranda di Simulator, gesek ke bawah dari bagian atas layar untuk membuka Pusat Pemberitahuan, pilih tab Hari Ini dan klik tombol Edit :
Tambahkan Ekstensi DaysRemaining ke tampilan Hari Ini dan klik tombol Selesai:
Widget baru akan ditambahkan ke tampilan Hari Ini dan hasilnya akan ditampilkan:
Berkomunikasi dengan aplikasi host
Contoh Ekstensi Hari Ini yang Anda buat di atas tidak berkomunikasi dengan aplikasi host-nya ( layar Hari Ini ). Jika ya, ia akan menggunakan properti ExtensionContext dari TodayViewController
kelas atau CodeBasedViewController
.
Untuk Ekstensi yang akan menerima data dari aplikasi host mereka, data dalam bentuk array objek NSExtensionItem yang disimpan di properti InputItems dari ExtensionContext dari Ekstensi UIViewController
.
Ekstensi lain, seperti ekstensi Pengeditan Foto, dapat membedakan antara pengguna yang menyelesaikan atau membatalkan penggunaan. Ini akan disinyalir kembali ke aplikasi host melalui metode CompleteRequest dan CancelRequest properti ExtensionContext .
Untuk informasi selengkapnya, silakan lihat Panduan Pemrograman Ekstensi Aplikasi Apple.
Berkomunikasi dengan aplikasi induk
Grup Aplikasi memungkinkan aplikasi yang berbeda (atau aplikasi dan ekstensinya) untuk mengakses lokasi penyimpanan file bersama. Grup Aplikasi dapat digunakan untuk data seperti:
- Apple Watch Pengaturan.
- NSUserDefaults bersama.
- File Bersama.
Untuk informasi selengkapnya, silakan lihat bagian Grup Aplikasi dari dokumentasi Bekerja dengan Kemampuan kami.
MobileCoreServices
Saat bekerja dengan ekstensi, gunakan Pengidentifikasi Jenis Seragam (UTI) untuk membuat dan memanipulasi data yang dipertukarkan antara aplikasi, aplikasi lain, dan/atau layanan.
Kelas MobileCoreServices.UTType
statis menentukan properti pembantu berikut yang terkait dengan definisi Apple kUTType...
:
kUTTypeAlembic
-Alembic
kUTTypeAliasFile
-AliasFile
kUTTypeAliasRecord
-AliasRecord
kUTTypeAppleICNS
-AppleICNS
kUTTypeAppleProtectedMPEG4Audio
-AppleProtectedMPEG4Audio
kUTTypeAppleProtectedMPEG4Video
-AppleProtectedMPEG4Video
kUTTypeAppleScript
-AppleScript
kUTTypeApplication
-Application
kUTTypeApplicationBundle
-ApplicationBundle
kUTTypeApplicationFile
-ApplicationFile
kUTTypeArchive
-Archive
kUTTypeAssemblyLanguageSource
-AssemblyLanguageSource
kUTTypeAudio
-Audio
kUTTypeAudioInterchangeFileFormat
-AudioInterchangeFileFormat
kUTTypeAudiovisualContent
-AudiovisualContent
kUTTypeAVIMovie
-AVIMovie
kUTTypeBinaryPropertyList
-BinaryPropertyList
kUTTypeBMP
-BMP
kUTTypeBookmark
-Bookmark
kUTTypeBundle
-Bundle
kUTTypeBzip2Archive
-Bzip2Archive
kUTTypeCalendarEvent
-CalendarEvent
kUTTypeCHeader
-CHeader
kUTTypeCommaSeparatedText
-CommaSeparatedText
kUTTypeCompositeContent
-CompositeContent
kUTTypeConformsToKey
-ConformsToKey
kUTTypeContact
-Contact
kUTTypeContent
-Content
kUTTypeCPlusPlusHeader
-CPlusPlusHeader
kUTTypeCPlusPlusSource
-CPlusPlusSource
kUTTypeCSource
-CSource
kUTTypeData
-Database
kUTTypeDelimitedText
-DelimitedText
kUTTypeDescriptionKey
-DescriptionKey
kUTTypeDirectory
-Directory
kUTTypeDiskImage
-DiskImage
kUTTypeElectronicPublication
-ElectronicPublication
kUTTypeEmailMessage
-EmailMessage
kUTTypeExecutable
-Executable
kUTExportedTypeDeclarationsKey
-ExportedTypeDeclarationsKey
kUTTypeFileURL
-FileURL
kUTTypeFlatRTFD
-FlatRTFD
kUTTypeFolder
-Folder
kUTTypeFont
-Font
kUTTypeFramework
-Framework
kUTTypeGIF
-GIF
kUTTypeGNUZipArchive
-GNUZipArchive
kUTTypeHTML
-HTML
kUTTypeICO
-ICO
kUTTypeIconFileKey
-IconFileKey
kUTTypeIdentifierKey
-IdentifierKey
kUTTypeImage
-Image
kUTImportedTypeDeclarationsKey
-ImportedTypeDeclarationsKey
kUTTypeInkText
-InkText
kUTTypeInternetLocation
-InternetLocation
kUTTypeItem
-Item
kUTTypeJavaArchive
-JavaArchive
kUTTypeJavaClass
-JavaClass
kUTTypeJavaScript
-JavaScript
kUTTypeJavaSource
-JavaSource
kUTTypeJPEG
-JPEG
kUTTypeJPEG2000
-JPEG2000
kUTTypeJSON
-JSON
kUTType3dObject
-k3dObject
kUTTypeLivePhoto
-LivePhoto
kUTTypeLog
-Log
kUTTypeM3UPlaylist
-M3UPlaylist
kUTTypeMessage
-Message
kUTTypeMIDIAudio
-MIDIAudio
kUTTypeMountPoint
-MountPoint
kUTTypeMovie
-Movie
kUTTypeMP3
-MP3
kUTTypeMPEG
-MPEG
kUTTypeMPEG2TransportStream
-MPEG2TransportStream
kUTTypeMPEG2Video
-MPEG2Video
kUTTypeMPEG4
-MPEG4
kUTTypeMPEG4Audio
-MPEG4Audio
kUTTypeObjectiveCPlusPlusSource
-ObjectiveCPlusPlusSource
kUTTypeObjectiveCSource
-ObjectiveCSource
kUTTypeOSAScript
-OSAScript
kUTTypeOSAScriptBundle
-OSAScriptBundle
kUTTypePackage
-Package
kUTTypePDF
-PDF
kUTTypePerlScript
-PerlScript
kUTTypePHPScript
-PHPScript
kUTTypePICT
-PICT
kUTTypePKCS12
-PKCS12
kUTTypePlainText
-PlainText
kUTTypePlaylist
-Playlist
kUTTypePluginBundle
-PluginBundle
kUTTypePNG
-PNG
kUTTypePolygon
-Polygon
kUTTypePresentation
-Presentation
kUTTypePropertyList
-PropertyList
kUTTypePythonScript
-PythonScript
kUTTypeQuickLookGenerator
-QuickLookGenerator
kUTTypeQuickTimeImage
-QuickTimeImage
kUTTypeQuickTimeMovie
-QuickTimeMovie
kUTTypeRawImage
-RawImage
kUTTypeReferenceURLKey
-ReferenceURLKey
kUTTypeResolvable
-Resolvable
kUTTypeRTF
-RTF
kUTTypeRTFD
-RTFD
kUTTypeRubyScript
-RubyScript
kUTTypeScalableVectorGraphics
-ScalableVectorGraphics
kUTTypeScript
-Script
kUTTypeShellScript
-ShellScript
kUTTypeSourceCode
-SourceCode
kUTTypeSpotlightImporter
-SpotlightImporter
kUTTypeSpreadsheet
-Spreadsheet
kUTTypeStereolithography
-Stereolithography
kUTTypeSwiftSource
-SwiftSource
kUTTypeSymLink
-SymLink
kUTTypeSystemPreferencesPane
-SystemPreferencesPane
kUTTypeTabSeparatedText
-TabSeparatedText
kUTTagClassFilenameExtension
-TagClassFilenameExtension
kUTTagClassMIMEType
-TagClassMIMEType
kUTTypeTagSpecificationKey
-TagSpecificationKey
kUTTypeText
-Text
kUTType3DContent
-ThreeDContent
kUTTypeTIFF
-TIFF
kUTTypeToDoItem
-ToDoItem
kUTTypeTXNTextAndMultimediaData
-TXNTextAndMultimediaData
kUTTypeUniversalSceneDescription
-UniversalSceneDescription
kUTTypeUnixExecutable
-UnixExecutable
kUTTypeURL
-URL
kUTTypeURLBookmarkData
-URLBookmarkData
kUTTypeUTF16ExternalPlainText
-UTF16ExternalPlainText
kUTTypeUTF16PlainText
-UTF16PlainText
kUTTypeUTF8PlainText
-UTF8PlainText
kUTTypeUTF8TabSeparatedText
-UTF8TabSeparatedText
kUTTypeVCard
-VCard
kUTTypeVersionKey
-VersionKey
kUTTypeVideo
-Video
kUTTypeVolume
-Volume
kUTTypeWaveformAudio
-WaveformAudio
kUTTypeWebArchive
-WebArchive
kUTTypeWindowsExecutable
-WindowsExecutable
kUTTypeX509Certificate
-X509Certificate
kUTTypeXML
-XML
kUTTypeXMLPropertyList
-XMLPropertyList
kUTTypeXPCService
-XPCService
kUTTypeZipArchive
-ZipArchive
Lihat contoh berikut:
using MobileCoreServices;
...
NSItemProvider itemProvider = new NSItemProvider ();
itemProvider.LoadItem(UTType.PropertyList ,null, (item, err) => {
if (err == null) {
NSDictionary results = (NSDictionary )item;
NSString baseURI =
results.ObjectForKey("NSExtensionJavaScriptPreprocessingResultsKey");
}
});
Untuk informasi selengkapnya, silakan lihat bagian Grup Aplikasi dari dokumentasi Bekerja dengan Kemampuan kami.
Tindakan pencegahan dan pertimbangan
Ekstensi memiliki lebih sedikit memori yang tersedia secara signifikan daripada aplikasi. Mereka diharapkan untuk melakukan dengan cepat dan dengan gangguan minimal pada pengguna dan aplikasi tempat mereka dihosting. Namun, Ekstensi juga harus menyediakan fungsi yang khas dan berguna untuk aplikasi yang mengonsumsi dengan UI bermerek yang memungkinkan pengguna mengidentifikasi pengembang Ekstensi atau aplikasi Kontainer tempat mereka berada.
Mengingat persyaratan ketat ini, Anda hanya boleh menyebarkan Ekstensi yang telah diuji dan dioptimalkan secara menyeluruh untuk performa dan konsumsi memori.
Ringkasan
Dokumen ini telah mencakup Ekstensi, apa itu, jenis Titik Ekstensi dan batasan yang diketahui yang diberlakukan pada Ekstensi oleh iOS. Ini membahas pembuatan, pendistribusian, penginstalan, dan menjalankan Ekstensi dan siklus hidup Ekstensi. Ini memberikan panduan untuk membuat widget Today sederhana yang menunjukkan dua cara untuk membuat UI widget menggunakan Storyboard atau kode. Ini menunjukkan cara menguji ekstensi di Simulator iOS. Akhirnya, ia secara singkat membahas komunikasi dengan Aplikasi Host dan beberapa tindakan pencegahan dan pertimbangan yang harus diambil saat mengembangkan ekstensi.