Extensiones de iOS en Xamarin.iOS

Creación de extensiones en vídeo de iOS

Las extensiones, como se introdujo en iOS 8, son especializadas que iOS presenta dentro de contextos estándar, como dentro del Centro de notificaciones, como tipos de teclado personalizados solicitados por el usuario para realizar entradas especializadas u otros contextos como la edición de una foto donde la extensión puede proporcionar filtros de efecto UIViewControllers especiales. UIViewControllers

Todas las extensiones se instalan junto con una aplicación de contenedor (con ambos elementos escritos mediante las API unificadas de 64 bits) y se activan desde un punto de extensión determinado en una aplicación host. Y como se usarán como complemento a las funciones del sistema existentes, deben ser de alto rendimiento, lean y sólidas.

Puntos de extensión

Tipo Descripción Punto de extensión Aplicación host
Acción Editor o visor especializado para un tipo de medio determinado com.apple.ui-services Any
Proveedor de documentos Permite que la aplicación use un almacén de documentos remoto com.apple.fileprovider-ui Aplicaciones que usan UIDocumentPickerViewController
Keyboard Teclados alternativos com.apple.keyboard-service Any
Edición de fotos Edición y manipulación de fotos com.apple.photo-editing editor Fotos.app
Compartir Comparte datos con redes sociales, servicios de mensajería, etc. com.apple.share-services Any
Hoy "Widgets" que aparecen en la pantalla Hoy o en el Centro de notificaciones com.apple.widget-extensions Hoy y el Centro de notificaciones

Se agregaron puntos de extensión adicionales en iOS 10e iOS 12. Puede encontrar la tabla completa de todos los tipos admitidos en la Guía de programación de extensiones de aplicaciones de iOS.

Limitaciones

Las extensiones tienen una serie de limitaciones, algunas de las cuales son universales para todos los tipos (por ejemplo, ningún tipo de extensión puede acceder a las cámaras o micrófonos), mientras que otros tipos de extensión pueden tener limitaciones específicas en su uso (por ejemplo, los teclados personalizados no se pueden usar para campos de entrada de datos seguros como para contraseñas).

Las limitaciones universales son:

  • Los marcos de interfaz de usuario del kit de mantenimiento y del kit de eventos no están disponibles
  • Las extensiones no pueden usar modos extendidos en segundo plano
  • Las extensiones no pueden acceder a las cámaras o micrófonos del dispositivo (aunque pueden acceder a los archivos multimedia existentes)
  • Las extensiones no pueden recibir datos de Air Drop (aunque pueden transmitir datos a través de Air Drop)
  • UIActionSheet y UIAlertView no están disponibles; Las extensiones deben usar UIAlertController
  • Varios miembros de UIApplication no están disponibles: UIApplication.SharedApplication, UIApplication.OpenUrl,UIApplication.BeginIgnoringInteractionEvents y UIApplication.EndIgnoringInteractionEvents
  • iOS aplica un límite de uso de memoria de 16 MB en las extensiones actuales.
  • De forma predeterminada, las extensiones de teclado no tienen acceso a la red. Esto afecta a la depuración en el dispositivo (la restricción no se aplica en el simulador), ya que Xamarin.iOS requiere acceso de red para que la depuración funcione. Es posible solicitar acceso a la red estableciendo el valor Requests Open Access de Info.plist del proyecto en Yes . Consulte la Guía de teclado personalizado de Apple para obtener más información sobre las limitaciones de las extensiones de teclado.

Para ver las limitaciones individuales, consulte la Guía de programación de extensiones de aplicaciones deApple.

Distribución, instalación y ejecución de extensiones

Las extensiones se distribuyen desde dentro de una aplicación de contenedor, que, a su vez, se envía y distribuye a través del App Store. Las extensiones distribuidas con la aplicación se instalan en ese momento, pero el usuario debe habilitar cada extensión explícitamente. Los distintos tipos de extensiones se habilitan de maneras diferentes; varios requieren que el usuario vaya a la Configuración aplicación y que los habilite desde allí. Mientras que otros están habilitados en el punto de uso, como habilitar una extensión de uso compartido al enviar una foto.

La aplicación en la que se usa la extensión (donde el usuario encuentra el punto de extensión) se conoce como la aplicación host, ya que es la aplicación que hospeda la extensión cuando se ejecuta. La aplicación que instala la extensión es la aplicación contenedora, porque es la aplicación que contenía la extensión cuando se instaló.

Normalmente, la aplicación contenedora describe la extensión y guía al usuario a través del proceso de habilitarla.

Depuración y versiones de lanzamiento de extensiones

Los límites de memoria para ejecutar extensiones de aplicación son significativamente menores que los límites de memoria aplicados a una aplicación en primer plano. Los simuladores que ejecutan iOS tienen menos restricciones aplicadas a las extensiones y puede ejecutar la extensión sin problemas. Sin embargo, la ejecución de la misma extensión en un dispositivo puede dar lugar a resultados inesperados, incluido el bloqueo de la extensión o la terminación agresiva por parte del sistema. Por lo tanto, asegúrese de compilar y probar la extensión en un dispositivo antes de enviarla.

Debe asegurarse de que se aplican las siguientes opciones al proyecto de contenedor y a todas las extensiones a las que se hace referencia:

  1. Compile un paquete de aplicación en la configuración de versión.
  2. En la configuración del proyecto de compilación de iOS, establezca la opción Comportamiento del vinculador en Vincular solo SDK de marco o Vincular todo.
  3. En la configuración del proyecto de depuración de iOS, desactive la opción Habilitar depuración y Habilitar generación de perfiles.

Ciclo de vida de la extensión

Una extensión puede ser tan simple como un único UIViewController o extensiones más complejas que presentan varias pantallas de interfaz de usuario. Cuando el usuario encuentra un punto de extensión (por ejemplo, al compartir una imagen), tendrá la oportunidad de elegir entre las extensiones registradas para ese punto de extensión.

Si elige una de las extensiones de la aplicación, se crearán instancias de esta y comenzará el ciclo de vida UIViewController normal del controlador de vistas. Sin embargo, a diferencia de una aplicación normal, que se suspende pero no termina generalmente cuando el usuario termina de interactuar con ellas, las extensiones se cargan, ejecutan y finalizan repetidamente.

Las extensiones pueden comunicarse con sus aplicaciones host a través de un objeto NSExtensionContext. Algunas extensiones tienen operaciones que reciben devoluciones de llamada asincrónicas con los resultados. Estas devoluciones de llamada se ejecutarán en subprocesos en segundo plano y la extensión debe tener esto en cuenta. por ejemplo, mediante NSObject.InvokeOnMainThread si quieren actualizar la interfaz de usuario. Consulte la sección Comunicación con la aplicación host a continuación para obtener más detalles.

De forma predeterminada, las extensiones y sus aplicaciones de contenedor no se pueden comunicar, a pesar de que se instalan juntas. En algunos casos, la aplicación Contenedor es básicamente un contenedor de "envío" vacío cuyo propósito se sirve una vez instalada la extensión. Sin embargo, si las circunstancias lo dictan, la aplicación Container y la extensión pueden compartir recursos de un área común. Además, una extensión today puede solicitar a su aplicación Container que abra una dirección URL. Este comportamiento se muestra en el widget de cuenta atrás de eventos.

Creación de una extensión

Las extensiones (y sus aplicaciones de contenedor) deben ser archivos binarios de 64 bits y crearse mediante las API unificadas deXamarin.iOS. Al desarrollar una extensión, las soluciones contendrán al menos dos proyectos: la aplicación de contenedor y un proyecto para cada extensión que proporciona el contenedor.

Requisitos del proyecto de aplicación de contenedor

La aplicación Container que se usa para instalar la extensión tiene los siguientes requisitos:

  • Debe mantener una referencia al proyecto de extensión.
  • Debe ser una aplicación completa (debe ser capaz de iniciarse y ejecutarse correctamente) incluso si no hace nada más que proporcionar una manera de instalar una extensión.
  • Debe tener un identificador de agrupación que sea la base para el identificador de agrupación del proyecto de extensión (consulte la sección siguiente para obtener más detalles).

Requisitos del proyecto de extensión

Además, el proyecto de la extensión tiene los siguientes requisitos:

  • Debe tener un identificador de agrupación que comience por el identificador de agrupación de la aplicación contenedora. Por ejemplo, si la aplicación contenedora tiene un identificador de agrupación de , el identificador de la extensión com.myCompany.ContainerApp podría ser com.myCompany.ContainerApp.MyExtension :

    Identificadores de agrupación

  • Debe definir la clave , con un valor adecuado (por ejemplo, para un widget del Centro de NSExtensionPointIdentifiercom.apple.widget-extension notificaciones de NSExtensionPointIdentifier en su Info.plist archivo.

  • También debe definir la clave o la clave de su archivo con un valor NSExtensionPrincipalClassInfo.plist adecuado:

    • Use la clave para especificar el nombre del guión gráfico que presenta la interfaz de NSExtensionMainStoryboard usuario principal de la extensión (menos .storyboard ). Por ejemplo, Main para el Main.storyboard archivo .
    • Use la NSExtensionPrincipalClass clave para especificar la clase que se inicializará cuando se inicie la extensión. El valor debe coincidir con el valor register de :

    Registro de clase principal

Los tipos específicos de extensiones pueden tener requisitos adicionales. Por ejemplo, una clase principal de la extensión Today o Notification Center debe implementar INCWidgetProviding.

Importante

Si inicia el proyecto con una de las plantillas de extensiones proporcionadas por Visual Studio para Mac, la plantilla le proporciona y cumple automáticamente la mayoría de estos requisitos (si no todos).

Tutorial

En el siguiente tutorial, creará un widget today de ejemplo que calcula el día y el número de días restantes en el año:

Un widget de hoy de ejemplo que calcula el día y el número de días restantes en el año

Creación de la solución

Para crear la solución necesaria, haga lo siguiente:

  1. En primer lugar, cree un nuevo proyecto de aplicación de vista única de iOS y haga clic en el botón Siguiente:

    En primer lugar, cree un nuevo proyecto de aplicación de vista única de iOS y haga clic en el botón Siguiente.

  2. Llame al proyecto TodayContainer y haga clic en el TodayContainer Siguiente:

    Llame al proyecto TodayContainer y haga clic en el botón Siguiente.

  3. Compruebe los Project nombre y el nombre de la solución y haga clic en el botón Crear para crear la solución:

    Compruebe el nombre Project y el nombre de la solución y haga clic en el botón Crear para crear la solución.

  4. A continuación, en Explorador de soluciones, haga clic con el botón derecho en la solución y agregue un nuevo proyecto de extensión de iOS desde la plantilla De extensión hoy:

    A continuación, en Explorador de soluciones, haga clic con el botón derecho en la solución y agregue un nuevo proyecto de extensión de iOS desde la plantilla De extensión hoy.

  5. Llame al proyecto DaysRemaining y haga clic en el DaysRemaining Siguiente:

    Llame al proyecto DaysRemaining y haga clic en el botón Siguiente.

  6. Revise el proyecto y haga clic en el botón Crear para crearlo:

    Revise el proyecto y haga clic en el botón Crear para crearlo.

La solución resultante debe tener ahora dos proyectos, como se muestra aquí:

La solución resultante debe tener ahora dos proyectos, como se muestra aquí.

Creación de la interfaz de usuario de la extensión

A continuación, deberá diseñar la interfaz para el widget Hoy. Esto se puede hacer mediante un guión gráfico o mediante la creación de la interfaz de usuario en el código. Ambos métodos se tratarán a continuación en detalle.

Uso de guiones gráficos

Para compilar la interfaz de usuario con un guión gráfico, haga lo siguiente:

  1. En la Explorador de soluciones, haga doble clic en el archivo del proyecto de extensión para abrirlo para su edición:

    Haga doble clic en el archivo Main.storyboard de los proyectos de extensión para abrirlo para su edición.

  2. Seleccione la etiqueta que se agregó automáticamente a la interfaz de usuario por plantilla y asíñale el nombre en la pestaña Widget del Explorador de propiedades:

    Seleccione la etiqueta que se agregó automáticamente a la interfaz de usuario por plantilla y asíñale el nombre TodayMessage en la pestaña Widget del Explorador de propiedades.

  3. Guarde los cambios en el guión gráfico.

Uso de código

Para compilar la interfaz de usuario en el código, haga lo siguiente:

  1. En la Explorador de soluciones, seleccione el proyecto DaysRemaining, agregue una nueva clase y llámela :

    Seleccione el proyecto DaysRemaining, agregue una nueva clase y llámela CodeBasedViewController.

  2. De nuevo, en Explorador de soluciones, haga doble clic en el archivo de la extensión para abrirlo para su edición:

    Haga doble clic en el archivo Info.plist de extensiones para abrirlo para su edición.

  3. Seleccione la Vista de origen (en la parte inferior de la pantalla) y abra el nodo:

    Seleccione la vista de origen en la parte inferior de la pantalla y abra el nodo NSExtension.

  4. Quite la NSExtensionMainStoryboard clave y agregue con el valor NSExtensionPrincipalClassCodeBasedViewController :

    Quite la clave NSExtensionMainStoryboard y agregue NSExtensionPrincipalClass con el valor CodeBasedViewController.

  5. Guarde los cambios.

A continuación, CodeBasedViewController.cs edite el archivo y haga que sea parecido al siguiente:

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

    }
  }
}

Tenga en cuenta [Register("CodeBasedViewController")] que coincide con el valor especificado para lo NSExtensionPrincipalClass anterior.

Codificación de la extensión

Con el Interfaz de usuario creado, abra o el archivo (basado en el método usado para crear el Interfaz de usuario anterior), cambie el método TodayViewController.csCodeBasedViewController.csTodayViewController.cs y haga que sea parecido al siguiente:

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);
  }
}

Si usa el método de Interfaz de usuario código, reemplace el // Insert code to power extension here... comentario por el nuevo código anterior. Después de llamar a la implementación base (e insertar una etiqueta para la versión basada en código), este código realiza un cálculo sencillo para obtener el día del año y cuántos días quedan. A continuación, muestra el mensaje en la etiqueta ( TodayMessage ) que creó en el diseño de la interfaz de usuario.

Tenga en cuenta que este proceso es similar al proceso normal de escritura de una aplicación. Una extensión tiene el mismo ciclo de vida que un controlador de vistas en una aplicación, excepto que las extensiones no tienen modos en segundo plano y no se suspenden cuando el usuario termina UIViewController de usarlos. En su lugar, las extensiones se inicializan y desasigna repetidamente según sea necesario.

Creación de la interfaz de usuario de la aplicación contenedora

En este tutorial, la aplicación contenedora se usa simplemente como método para enviar e instalar la extensión y no proporciona ninguna funcionalidad propia. Edite el archivo TodayContainer y agregue texto que defina la función de la extensión Main.storyboard y cómo instalarlo:

Edite el archivo TodayContainers Main.storyboard y agregue texto que defina la función Extensions y cómo instalarlo.

Guarde los cambios en el guión gráfico.

Prueba de la extensión

Para probar la extensión en el simulador de iOS, ejecute la aplicación TodayContainer. Se mostrará la vista principal del contenedor:

Se mostrará la vista principal de los contenedores.

A continuación, presione el botón Inicio en el simulador, deslice el dedo hacia abajo desde la parte superior de la pantalla para abrir el Centro de notificaciones,seleccione la pestaña Hoy y haga clic en el botón Editar:

Presione el botón Inicio en el simulador, deslice el dedo hacia abajo desde la parte superior de la pantalla para abrir el Centro de notificaciones, seleccione la pestaña Hoy y haga clic en el botón Editar.

Agregue la extensión DaysRemaining a la vista Hoy y haga clic en el botón Listo:

Agregue la extensión DaysRemaining a la vista Hoy y haga clic en el botón Listo.

El nuevo widget se agregará a la vista Hoy y se mostrarán los resultados:

El nuevo widget se agregará a la vista Hoy y se mostrarán los resultados.

Comunicación con la aplicación host

La extensión today de ejemplo que creó anteriormente no se comunica con su aplicación host (la pantalla Hoy). Si lo hubiera hecho, usaría la propiedad ExtensionContext de las clases o CodeBasedViewController .

En el caso de las extensiones que recibirán datos de sus aplicaciones host, los datos tienen el formato de una matriz de objetos NSExtensionItem almacenados en la propiedad InputItems de ExtensionContext de la extensión .

Otras extensiones, como las extensiones de edición de fotos, pueden distinguir entre el usuario que completa o cancela el uso. Esto se señalizará de nuevo a la aplicación host a través de los métodos CompleteRequest y CancelRequest de la propiedad ExtensionContext.

Para más información, consulte la Guía de programación de extensiones de aplicaciones deApple.

Comunicación con la aplicación primaria

Un grupo de aplicaciones permite que aplicaciones diferentes (o una aplicación y sus extensiones) tengan acceso a una ubicación de almacenamiento de archivos compartidos. Los grupos de aplicaciones se pueden usar para datos como:

Para obtener más información, consulte la sección Grupos de aplicaciones de nuestra documentación sobre cómo trabajar con funcionalidades.

MobileCoreServices

Al trabajar con extensiones, use un identificador uniforme de tipo (UTI) para crear y manipular los datos que se intercambian entre la aplicación, otras aplicaciones o servicios.

La MobileCoreServices.UTType clase estática define las siguientes propiedades auxiliares relacionadas con las definiciones de kUTType... Apple:

  • 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

Observe el ejemplo siguiente:

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");
    }
});

Para obtener más información, consulte la sección Grupos de aplicaciones de nuestra documentación sobre cómo trabajar con funcionalidades.

Precauciones y consideraciones

Las extensiones tienen significativamente menos memoria disponible que las aplicaciones. Se espera que se realicen rápidamente y con una mínima intrusión para el usuario y la aplicación en la que se hospedan. Sin embargo, una extensión también debe proporcionar una función distinta y útil a la aplicación consumidora con una interfaz de usuario de marca que permita al usuario identificar el desarrollador o la aplicación contenedora de la extensión a la que pertenecen.

Dados estos estrictos requisitos, solo debe implementar extensiones que se hayan probado exhaustivamente y optimizado para el rendimiento y el consumo de memoria.

Resumen

En este documento se han abordado las extensiones, lo que son, el tipo de puntos de extensión y las limitaciones conocidas impuestas a una extensión por iOS. Se ha analizado la creación, distribución, instalación y ejecución de extensiones y el ciclo de vida de la extensión. Se proporcionó un tutorial sobre la creación de un widget Today sencillo que muestra dos maneras de crear la interfaz de usuario del widget mediante guiones gráficos o código. Se ha mostrado cómo probar una extensión en el simulador de iOS. Por último, se ha analizado brevemente la comunicación con la aplicación host y algunas precauciones y consideraciones que deben tenerse en cuenta al desarrollar una extensión.