Bagikan melalui


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:

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:

  1. Buat paket aplikasi dalam konfigurasi Rilis .
  2. Di pengaturan proyek Build iOS, atur opsi Perilaku linker ke Tautkan SDK Kerangka Kerja Saja atau Tautkan Semua.
  3. 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.ContainerAppBundel , pengidentifikasi Ekstensi mungkin :com.myCompany.ContainerApp.MyExtension

    Pengidentifikasi bundel

  • Ini harus menentukan kunci NSExtensionPointIdentifier, dengan nilai yang sesuai (seperti com.apple.widget-extension untuk widget Pusat Pemberitahuan Hari Ini ), dalam filenya Info.plist .

  • Ini juga harus menentukan NSExtensionMainStoryboard kunci atau NSExtensionPrincipalClass kunci dalam filenya Info.plist dengan nilai yang sesuai:

    • Gunakan kunci NSExtensionMainStoryboard untuk menentukan nama Storyboard yang menyajikan UI utama untuk Ekstensi (minus .storyboard). Misalnya, Main untuk Main.storyboard file.
    • Gunakan kunci NSExtensionPrincipalClass untuk menentukan kelas yang akan diinisialisasi saat Ekstensi dimulai. Nilai harus cocok dengan nilai Register Anda UIViewController:

    Pendaftaran kelas utama

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:

Contoh widget Hari Ini yang menghitung hari dan jumlah hari yang tersisa dalam setahun

Membuat solusi

Untuk membuat solusi yang diperlukan, lakukan hal berikut:

  1. Pertama, buat iOS baru, proyek Aplikasi Tampilan Tunggal dan klik tombol Berikutnya :

    Pertama, buat iOS baru, proyek Aplikasi Tampilan Tunggal dan klik tombol Berikutnya

  2. Panggil proyek TodayContainer dan klik tombol Berikutnya :

    Panggil proyek TodayContainer dan klik tombol Berikutnya

  3. Verifikasi Nama Proyek dan SolutionName dan klik tombol Buat untuk membuat solusi:

    Verifikasi Nama Proyek dan SolutionName dan klik tombol Buat untuk membuat solusi

  4. Selanjutnya, di Penjelajah Solusi, klik kanan pada Solusi dan tambahkan proyek Ekstensi iOS baru dari templat Ekstensi Hari Ini:

    Selanjutnya, di Penjelajah Solusi, klik kanan pada Solusi dan tambahkan proyek Ekstensi iOS baru dari templat Ekstensi Hari Ini

  5. Panggil proyek DaysRemaining dan klik tombol Berikutnya :

    Panggil proyek DaysRemaining dan klik tombol Berikutnya

  6. Tinjau proyek dan klik tombol Buat untuk membuatnya:

    Tinjau proyek dan klik tombol Buat untuk membuatnya

Solusi yang dihasilkan sekarang harus memiliki dua proyek, seperti yang ditunjukkan di sini:

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:

  1. Di Penjelajah Solusi, klik dua kali file proyek Main.storyboard Ekstensi untuk membukanya untuk pengeditan:

    Klik dua kali file Proyek ekstensi Main.storyboard untuk membukanya untuk pengeditan

  2. Pilih Label yang secara otomatis ditambahkan ke antarmuka pengguna menurut templat dan berikan NamaTodayMessage di tab Widget dari Penjelajah Properti:

    Pilih Label yang secara otomatis ditambahkan ke antarmuka pengguna menurut templat dan berikan Nama TodayMessage di tab Widget dari Penjelajah Properti

  3. Simpan perubahan ke Storyboard.

Menggunakan kode

Untuk membangun UI dalam kode, lakukan hal berikut:

  1. Di Penjelajah Solusi, pilih proyek DaysRemaining, tambahkan kelas baru dan sebut saja CodeBasedViewController:

    Pilih proyek DaysRemaining, tambahkan kelas baru dan sebut saja CodeBasedViewController

  2. Sekali lagi, di Penjelajah Solusi, klik dua kali file Ekstensi Info.plist untuk membukanya untuk pengeditan:

    Klik dua kali file Info.plist Ekstensi untuk membukanya untuk pengeditan

  3. Pilih Tampilan Sumber (dari bagian bawah layar) dan buka simpul NSExtension :

    Pilih Tampilan Sumber dari bagian bawah layar dan buka simpul NSExtension

  4. Hapus kunci NSExtensionMainStoryboard dan tambahkan NSExtensionPrincipalClass dengan nilai CodeBasedViewController:

    Hapus kunci NSExtensionMainStoryboard dan tambahkan NSExtensionPrincipalClass dengan nilai CodeBasedViewController

  5. 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:

Edit file TodayContainers 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:

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 :

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:

Tambahkan Ekstensi DaysRemaining ke tampilan Hari Ini dan klik tombol Selesai

Widget baru akan ditambahkan ke tampilan Hari Ini dan hasilnya akan ditampilkan:

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:

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.