Espacio aislado de una aplicación de Xamarin.Mac

En este artículo se trata el espacio aislado de una aplicación de Xamarin.Mac para su lanzamiento en App Store. Abarca todos los elementos que van al espacio aislado, como directorios de contenedor, derechos, permisos determinados por el usuario, separación de privilegios y aplicación del kernel.

Información general

Al trabajar con C# y .NET en una aplicación de Xamarin.Mac, tiene la misma capacidad de espacio aislado de una aplicación que cuando se trabaja con Objective-C o Swift.

Un ejemplo de la aplicación en ejecuciónUn ejemplo de la aplicación en

En este artículo, se tratarán los aspectos básicos del trabajo con espacio aislado en una aplicación de Xamarin.Mac y todos los elementos que van al espacio aislado: directorios de contenedor, derechos, permisos determinados por el usuario, separación de privilegios y aplicación del kernel. Se recomienda encarecidamente que trabaje primero en el artículo Hello, Mac, en concreto en las secciones Introduction to Xcode and Interface Builder and Outlets and Actions (Introducción a Xcode y Interface Builder y salidas y acciones), ya que trata los conceptos y técnicas clave que se usarán en este artículo.

También puede echar un vistazo a la sección del documento Xamarin.Mac Internals (Aspectos internos de Exposing C# classes / methods to Objective-CExposing C# classes / methods to Objective-C donde se explican los atributos y que se usan para conectar las clases de C# a objetos y elementos de interfaz de RegisterExportObjective-C usuario.

Acerca del espacio aislado de la aplicación

El espacio aislado de la aplicación proporciona una defensa sólida frente a los daños que puede causar una aplicación malintencionada que se ejecuta en un equipo Mac al limitar el acceso que una aplicación tiene a los recursos del sistema.

Una aplicación que no es de espacio aislado tiene todos los derechos del usuario que ejecuta la aplicación y puede acceder a la aplicación o hacer cualquier cosa que el usuario pueda hacer. Si la aplicación contiene vulnerabilidades de seguridad (o cualquier marco que esté usando), un hacker puede aprovechar esos puntos débiles y usar la aplicación para tomar el control del equipo Mac en el que se ejecuta.

Al limitar el acceso a los recursos por aplicación, una aplicación en espacio aislado proporciona una línea de defensa contra el robo, los daños o la intención malintencionada por parte de una aplicación que se ejecuta en la máquina del usuario.

App Sandbox es una tecnología de control de acceso integrada en macOS (aplicado en el nivel de kernel) que proporciona una estrategia doble:

  1. El espacio aislado de la aplicación permite al desarrollador describir cómo interactuará una aplicación con el sistema operativo y, de esta manera, solo se le conceden los derechos de acceso necesarios para realizar el trabajo y no más.
  2. El espacio aislado de la aplicación permite al usuario conceder acceso adicional al sistema sin problemas a través de los cuadros de diálogo Abrir y Guardar, las operaciones de arrastrar y colocar y otras interacciones comunes del usuario.

Preparación de la implementación del espacio aislado de aplicaciones

Los elementos del espacio aislado de aplicaciones que se tratarán en detalle en el artículo son los siguientes:

  • Directorios de contenedor
  • Derechos
  • User-Determined permisos
  • Separación de privilegios
  • Cumplimiento del kernel

Una vez que comprenda estos detalles, podrá crear un plan para adoptar el espacio aislado de aplicaciones en la aplicación Xamarin.Mac.

En primer lugar, deberá determinar si la aplicación es una buena candidata para el espacio aislado (la mayoría de las aplicaciones lo son). A continuación, deberá resolver las incompatibilidades de la API y determinar qué elementos del espacio aislado de la aplicación necesitará. Por último, busque el uso de la separación de privilegios para maximizar el nivel de defensa de la aplicación.

Al adoptar app sandbox, algunas ubicaciones del sistema de archivos que usa la aplicación serán diferentes. En concreto, la aplicación tendrá un directorio de contenedor que se usará para los archivos de compatibilidad de la aplicación, las bases de datos, las memorias caché y cualquier otro archivo que no sea documentos de usuario. Tanto macOS como Xcode proporcionan compatibilidad para migrar este tipo de archivos desde sus ubicaciones heredadas al contenedor.

Inicio rápido del espacio aislado

En esta sección, crearemos una aplicación sencilla de Xamarin.Mac que usa una vista web (que requiere una conexión de red restringida en el espacio aislado a menos que se solicite específicamente) como ejemplo de introducción al espacio aislado de la aplicación.

Comprobaremos que la aplicación está realmente en espacio aislado y aprenderemos a solucionar errores comunes de App Sandbox.

Creación del proyecto de Xamarin.Mac

Vamos a hacer lo siguiente para crear nuestro proyecto de ejemplo:

  1. Inicie Visual Studio para Mac haga clic en el vínculo Nueva solución.

  2. En el cuadro de diálogo Project nuevo, seleccione Aplicación MacCocoa App:

    Creación de una nueva aplicación de CocoaCreación de una nueva aplicación de

  3. Haga clic en el botón Siguiente, escriba como nombre del proyecto y haga clic en el botón Crear:

    Escribir el nombre de la aplicaciónEscriba el nombre de la

  4. En la Panel de solución, haga doble clic en el archivo Main.storyboard para abrirlo para editarlo en Xcode:

    Edición del guión gráfico principal

  5. Arrastre una vista web a la ventana, asíéntela para rellenar el área de contenido y esta establezca su crecimiento y reducción con la ventana:

    Agregar una vista web Adición

  6. Cree una salida para la vista web denominada webView :

    Creación de una nueva salidaCreación de una nueva

  7. Vuelva a Visual Studio para Mac haga doble clic en el archivo ViewController.cs del Panel de solución para abrirlo para su edición.

  8. Agregue la siguiente instrucción using: using WebKit;

  9. Haga que ViewDidLoad el método sea parecido al siguiente:

    public override void AwakeFromNib ()
    {
        base.AwakeFromNib ();
        webView.MainFrame.LoadRequest(new NSUrlRequest(new NSUrl("http://www.apple.com")));
    }
    
  10. Guarde los cambios.

Ejecute la aplicación y asegúrese de que el sitio web de Apple se muestra en la ventana como se muestra a continuación:

Mostrar una ejecución de aplicación de ejemplo Muestrauna ejecución de aplicación de

Firma y aprovisionamiento de la aplicación

Para poder habilitar app sandbox, primero es necesario aprovisionar y firmar la aplicación Xamarin.Mac.

Haga lo siguiente:

  1. Inicie sesión en apple Portal para desarrolladores:

    Inicio de sesión en apple Portal para desarrolladoresinicio de sesión en apple

  2. Seleccione Certificados, Perfiles de identificadores:

    Selección de certificados, identificadores  Perfiles

  3. En Aplicaciones mac,seleccione Identificadores:

    Seleccionar identificadores

  4. Cree un nuevo identificador para la aplicación:

    Creación de un nuevo identificador de aplicaciónCreación de un nuevo identificador de

  5. En Perfiles de aprovisionamiento,seleccione Desarrollo:

    Seleccionar desarrollo seleccionando

  6. Cree un perfil y seleccione Desarrollo de aplicaciones mac:

    Creación de un perfil nuevoCreación de un nuevo

  7. Seleccione el identificador de aplicación que hemos creado anteriormente:

    Selección del id. de aplicación

  8. Seleccione desarrolladores para este perfil:

    Adición de desarrolladores

  9. Seleccione los equipos para este perfil:

    Selección de los equipos permitidos

  10. Asigne un nombre al perfil:

    Dar un nombre al perfil Dandoun nombre al

  11. Haga clic en el botón Listo.

Importante

En algunos casos, es posible que tenga que descargar el nuevo perfil de aprovisionamiento desde el Portal para desarrolladores de Apple directamente y hacer doble clic en él para instalarlo. También es posible que tenga que detener y reiniciar Visual Studio para Mac para poder acceder al nuevo perfil.

A continuación, es necesario cargar el nuevo id. de aplicación y el perfil en la máquina de desarrollo. Vamos a hacer lo siguiente:

  1. Inicie Xcode y seleccione Preferencias en el menú Xcode:

    Edición de cuentas en cuentas de ediciónde Xcode

  2. Haga clic en el botón Ver detalles...:

    Hacer clic en el botón Ver detalles Haciendoclic en el botón Ver

  3. Haga clic en el botón Actualizar (en la esquina inferior izquierda).

  4. Haga clic en el botón Listo.

A continuación, es necesario seleccionar el nuevo id. de aplicación y el perfil de aprovisionamiento en nuestro proyecto de Xamarin.Mac. Vamos a hacer lo siguiente:

  1. En la Panel de solución, haga doble clic en el archivo Info.plist para abrirlo para su edición.

  2. Asegúrese de que el identificador de lote coincide con el identificador de aplicación que creamos anteriormente (ejemplo: ):

    Edición del identificador de lote editando

  3. A continuación, haga doble clic en el archivo Entitlements.plist y asegúrese de que iCloud Key-Value Store y los contenedores de iCloud coinciden con el identificador de aplicación que creamos anteriormente (por ejemplo: ):

    Edición del archivo Entitlements.plist Editando

  4. Guarde los cambios.

  5. En el Panel de solución, haga doble clic en el archivo de proyecto para abrir sus Opciones para editar:

    Edición de las opciones de la solución

  6. Seleccione Firma de Macy, a continuación, active Firmar el paquete de aplicaciones y Firmar el paquete del instalador. En Perfil de aprovisionamiento,seleccione el que hemos creado anteriormente:

    Establecimiento del perfil de aprovisionamiento

  7. Haga clic en el botón Listo.

Importante

Es posible que tenga que salir y reiniciar Visual Studio para Mac para que reconozca el nuevo identificador de aplicación y el perfil de aprovisionamiento instalados por Xcode.

Solución de problemas de aprovisionamiento

En este momento debe intentar ejecutar la aplicación y asegurarse de que todo está firmado y aprovisionado correctamente. Si la aplicación todavía se ejecuta como antes, todo es bueno. En caso de error, podría obtener un cuadro de diálogo como el siguiente:

Un cuadro de diálogo de problema de aprovisionamiento de ejemplo

Estas son las causas más comunes de los problemas de aprovisionamiento y firma:

  • El identificador del lote de aplicaciones no coincide con el identificador de aplicación del perfil seleccionado.
  • El identificador de desarrollador no coincide con el identificador de desarrollador del perfil seleccionado.
  • El UUID del equipo Mac en el que se está probando no está registrado como parte del perfil seleccionado.

En el caso de un problema, corrija el problema en apple Portal para desarrolladores, actualice los perfiles en Xcode y realice una compilación limpia en Visual Studio para Mac.

Habilitación del espacio aislado de la aplicación

Para habilitar app sandbox, active una casilla en las opciones de los proyectos. Haga lo siguiente:

  1. En la Panel de solución, haga doble clic en el archivo Entitlements.plist para abrirlo para su edición.

  2. Active Habilitar derechos y Habilitar espacio aislado de aplicaciones:

    Edición de derechos y habilitación del espacio aislado

  3. Guarde los cambios.

En este momento, ha habilitado app sandbox, pero no ha proporcionado el acceso de red necesario para la vista web. Si ejecuta la aplicación ahora, debería obtener una ventana en blanco:

Mostrar el acceso web bloqueado Mostrandoel acceso web

Comprobación de que la aplicación está en espacio aislado

Aparte del comportamiento de bloqueo de recursos, hay tres maneras principales de saber si una aplicación de Xamarin.Mac se ha aislado correctamente:

  1. En Finder, compruebe el contenido de la carpeta: si la aplicación está en espacio aislado, habrá una carpeta denominada como el identificador de lote de la aplicación ~/Library/Containers/ (ejemplo: com.appracatappra.MacSandbox ):

    Abrir el paquete de la aplicaciónAbriendo el paquete de la

  2. El sistema ve la aplicación como espacio aislado en el Monitor de actividad:

    • Inicie el Monitor de actividad (en /Applications/Utilities ).
    • Elija Vercolumnas y asegúrese de que el elemento de menú Espacio aislado está activado.
    • Asegúrese de que la columna Espacio aislado lee Yes la aplicación:

    Comprobación de la aplicación en el Monitor de actividadComprobación de la aplicación en el Monitor de

  3. Compruebe que el archivo binario de la aplicación está en espacio aislado:

    • Inicie la aplicación Terminal.
    • Vaya al directorio de bin aplicaciones.
    • Emita este comando: codesign -dvvv --entitlements :- executable_path (donde executable_path es la ruta de acceso a la aplicación):

    Comprobación de la aplicación en la línea de comandosComprobación de la aplicación en la línea de

Depuración de una aplicación en espacio aislado

El depurador se conecta a las aplicaciones de Xamarin.Mac a través de TCP, lo que significa que, de forma predeterminada, cuando se habilita el espacio aislado, no se puede conectar a la aplicación, por lo que si intenta ejecutar la aplicación sin los permisos adecuados habilitados, aparece el error "No se puede conectar al depurador".

Establecer las opciones necesarias Establecerlas opciones

El permiso Permitir conexiones de red salientes (cliente) es el que se necesita para el depurador, lo que permite la depuración con normalidad. Puesto que no se puede depurar sin él, hemos actualizado el destino para para agregar automáticamente ese permiso a los derechos de cualquier aplicación que esté en espacio aislado solo para compilaciones CompileEntitlementsmsbuild de depuración. Las compilaciones de versión deben usar los derechos especificados en el archivo de derechos, sin modificar.

Resolución de una infracción de App Sandbox

Se produce una infracción del espacio aislado de la aplicación si una aplicación xamarin.Mac en espacio aislado ha intentado acceder a un recurso que no se ha permitido explícitamente. Por ejemplo, nuestra vista web ya no puede mostrar el sitio web de Apple.

El origen más común de infracciones del espacio aislado de aplicaciones se produce cuando la configuración de derechos especificada en Visual Studio para Mac no coincide con los requisitos de la aplicación. De nuevo, vuelva a nuestro ejemplo, los derechos de conexión de red que faltan y que no pueden funcionar en la vista web.

Detectar infracciones de App Sandbox

Si sospecha que se está produciendo una infracción del espacio aislado de aplicaciones en la aplicación Xamarin.Mac, la manera más rápida de detectar el problema es mediante la aplicación de consola.

Haga lo siguiente:

  1. Compile la aplicación en cuestión y ejecute desde Visual Studio para Mac.

  2. Abra la aplicación de consola (desde ).

  3. Seleccione Todos los mensajes en la barra lateral y escriba en la búsqueda:

    Un ejemplo de un problema de espacio aislado en la consolaUn ejemplo de un problema de espacio aislado en la

En el caso de la aplicación de ejemplo anterior, puede ver que Kernal está bloqueando el tráfico debido al espacio aislado de la aplicación, ya que no hemos network-outbound solicitado ese derecho.

Corrección de infracciones de App Sandbox con derechos

Ahora que hemos visto cómo encontrar infracciones de espacio aislado de aplicaciones, veamos cómo se pueden resolver ajustando los derechos de nuestra aplicación.

Haga lo siguiente:

  1. En la Panel de solución, haga doble clic en el archivo Entitlements.plist para abrirlo para su edición.

  2. En la sección Derechos, active la casilla Permitir conexiones de red salientes (cliente):

    Edición de los derechos

  3. Guarde los cambios en la aplicación.

Si hacemos lo anterior para nuestra aplicación de ejemplo y, a continuación, la compilamos y ejecutamos, el contenido web ahora se mostrará según lo previsto.

El espacio aislado de la aplicación en profundidad

Los mecanismos de control de acceso proporcionados por App Sandbox son pocos y fáciles de entender. Sin embargo, la forma en que cada aplicación adopta el espacio aislado de la aplicación es única y se basa en los requisitos de la aplicación.

Dado su mejor esfuerzo para proteger la aplicación de Xamarin.Mac frente a la vulnerabilidad de código malintencionado, solo debe haber una única vulnerabilidad en la aplicación (o en una de las bibliotecas o marcos que consume) para obtener el control de las interacciones de la aplicación con el sistema.

El espacio aislado de la aplicación se diseñó para evitar la toma de control (o limitar los daños que puede causar) al permitirle especificar las interacciones previstas de la aplicación con el sistema. El sistema solo concederá acceso al recurso que la aplicación requiere para realizar su trabajo y nada más.

Al diseñar para el espacio aislado de aplicaciones, está diseñando para un escenario en el peor de los casos. Si la aplicación se ve comprometida por código malintencionado, se limita a acceder solo a los archivos y recursos del espacio aislado de la aplicación.

Derechos y acceso a recursos del sistema

Como vimos anteriormente, a una aplicación de Xamarin.Mac que no se ha aislado se le conceden los derechos completos y el acceso del usuario que ejecuta la aplicación. Si se ve comprometida por código malintencionado, una aplicación no protegida puede actuar como agente para el comportamiento malintencionado, con un amplio potencial para causar daños.

Al habilitar app sandbox, se quitan todos los privilegios menos un conjunto mínimo de privilegios, que luego se vuelve a habilitar solo cuando sea necesario mediante los derechos de la aplicación Xamarin.Mac.

Para modificar los recursos de App Sandbox de la aplicación, edite su archivo Entitlements.plist y active o seleccione los derechos necesarios en los cuadros desplegables de editores:

Edición de los derechos

Directorios de contenedor y acceso al sistema de archivos

Cuando la aplicación xamarin.mac adopta el espacio aislado de la aplicación, tiene acceso a las siguientes ubicaciones:

  • Directorio del contenedor de aplicaciones: en la primera ejecución, el sistema operativo crea un directorio de contenedor especial al que van todos sus recursos, al que solo puede acceder. La aplicación tendrá acceso de lectura y escritura completo a este directorio.
  • Directorios de contenedores del grupo de aplicaciones: se puede conceder a la aplicación acceso a uno o varios contenedores de grupo que se comparten entre las aplicaciones del mismo grupo.
  • Archivos especificados por el usuario: la aplicación obtiene automáticamente acceso a los archivos que el usuario abre o arrastra explícitamente y se arrastra en la aplicación.
  • Elementos relacionados: con los derechos adecuados, la aplicación puede tener acceso a un archivo con el mismo nombre pero con una extensión diferente. Por ejemplo, un documento que se ha guardado como un .txt archivo y un .pdf .
  • Directorios temporales, directorios de herramientas de línea de comandos y ubicaciones específicas legibles para el mundo: la aplicación tiene distintos grados de acceso a los archivos en otras ubicaciones bien definidas según lo especificado por el sistema.

El directorio del contenedor de aplicaciones

El directorio del contenedor de aplicaciones de una aplicación de Xamarin.Mac tiene las siguientes características:

  • Se encuentra en una ubicación oculta en el directorio Inicio del usuario (normalmente ) y se puede acceder a ella con la función ~Library/ContainersNSHomeDirectory (consulte a continuación) dentro de la aplicación. Dado que se encuentra en el directorio Inicio, cada usuario obtiene su propio contenedor para la aplicación.
  • La aplicación tiene acceso de lectura y escritura sin restricciones al directorio de contenedor y a todos sus subdirectorios y archivos dentro de él.
  • La mayoría de las API de búsqueda de rutas de acceso de macOS son relativas al contenedor de la aplicación. Por ejemplo, el contenedor tendrá su propia biblioteca (a la que se accede a través de ), los subdirectorios Compatibilidad con aplicaciones y Preferencias.
  • macOS establece y aplica la conexión entre y la aplicación y su contenedor a través de la firma de código. Incluso si otra aplicación intenta suplantación de la aplicación mediante su identificador de agrupación, no podrá acceder al contenedor debido a la firma de código.
  • El contenedor no es para los archivos generados por el usuario. En su lugar, es para los archivos que la aplicación usa, como bases de datos, memorias caché u otros tipos específicos de datos.
  • En el caso de los tipos de aplicaciones de shoebox (como la aplicación Photo de Apple), el contenido del usuario irá al contenedor.

Importante

Desafortunadamente, Xamarin.Mac aún no tiene una cobertura de API del 100 % (a diferencia de Xamarin.iOS), como resultado, la API no se ha asignado en la versión NSHomeDirectory actual de Xamarin.Mac.

Como solución temporal, puede usar el código siguiente:

[System.Runtime.InteropServices.DllImport("/System/Library/Frameworks/Foundation.framework/Foundation")]
public static extern IntPtr NSHomeDirectory();

public static string ContainerDirectory {
    get {
        return ((NSString)ObjCRuntime.Runtime.GetNSObject(NSHomeDirectory())).ToString ();
        }
}

Directorio del contenedor del grupo de aplicaciones

A partir de Mac macOS 10.7.5 (y superiores), una aplicación puede usar el derecho para acceder a un contenedor compartido que es común a todas las aplicaciones com.apple.security.application-groups del grupo. Puede usar este contenedor compartido para contenido no orientado al usuario, como la base de datos u otros tipos de archivos de soporte técnico (como cachés).

Los contenedores de grupo se agregan automáticamente al contenedor de espacio aislado de cada aplicación (si forman parte de un grupo) y se almacenan en ~/Library/Group Containers/<application-group-id> . El identificador de grupo debe comenzar por el identificador del equipo de desarrollo y un punto, por ejemplo:

<team-id>.com.company.<group-name>

Para obtener más información, vea Apple's Adding an Application to an Application Group (Agregar una aplicación a un grupo de aplicaciones) en Entitlement Key Reference (Referencia de clave de derechos).

Acceso de Powerbox y del sistema de archivos fuera del contenedor de aplicaciones

Una aplicación de Xamarin.Mac en espacio aislado puede acceder a las ubicaciones del sistema de archivos fuera de su contenedor de las maneras siguientes:

  • En la dirección específica del usuario (a través de abrir y guardar diálogos u otros métodos como arrastrar y colocar).
  • Mediante el uso de derechos para ubicaciones específicas del sistema de archivos (como /bin o /usr/lib ).
  • Cuando la ubicación del sistema de archivos está en determinados directorios que son legibles en todo el mundo (por ejemplo, uso compartido).

Powerbox es la tecnología de seguridad de macOS que interactúa con el usuario para expandir los derechos de acceso a archivos de la aplicación xamarin.Mac en espacio aislado. Powerbox no tiene NINGUNA API, pero se activa de forma transparente cuando la aplicación llama a NSOpenPanel o NSSavePanel . El acceso a Powerbox se habilita a través de los derechos que se establecen para la aplicación Xamarin.Mac.

Cuando una aplicación en espacio aislado muestra un cuadro de diálogo Abrir o Guardar, Powerbox presenta la ventana (y no AppKit) y, por tanto, tiene acceso a cualquier archivo o directorio al que el usuario tenga acceso.

Cuando un usuario selecciona un archivo o directorio desde el cuadro de diálogo Abrir o Guardar (o arrastra al icono de la aplicación), Powerbox agrega la ruta de acceso asociada al espacio aislado de la aplicación.

Además, el sistema permite automáticamente lo siguiente a una aplicación en espacio aislado:

  • Conexión a un método de entrada del sistema.
  • Llame a los servicios seleccionados por el usuario en el menú Servicios (solo para los servicios marcados como seguros para las aplicaciones de espacio aislado por el proveedor de servicios).
  • Abra los archivos que elija el usuario en el menú Abrir reciente.
  • Use Copiar & pegar entre otras aplicaciones.
  • Lee archivos de las siguientes ubicaciones legibles para el mundo:
    • /bin
    • /sbin
    • /usr/bin
    • /usr/lib
    • /usr/sbin
    • /usr/share
    • /System
  • Lee y escribe archivos en los directorios creados por NSTemporaryDirectory .

De forma predeterminada, los archivos abiertos o guardados por una aplicación de Xamarin.Mac en espacio aislado permanecen accesibles hasta que la aplicación finaliza (a menos que el archivo siga abierto cuando se cierre la aplicación). Los archivos abiertos se restaurarán automáticamente en el espacio aislado de la aplicación a través de la característica Reanudar de macOS la próxima vez que se inicie la aplicación.

Para proporcionar persistencia a los archivos ubicados fuera del contenedor de una aplicación de Xamarin.Mac, use Security-Scoped marcadores (consulte a continuación).

El espacio aislado de la aplicación permite a una aplicación acceder a elementos relacionados que tienen el mismo nombre de archivo, pero extensiones diferentes. La característica tiene dos partes: a) una lista de extensiones relacionadas en el archivo de la aplicación, b) código para decir al espacio aislado lo que hará la Info.plst aplicación con estos archivos.

Hay dos escenarios en los que esto tiene sentido:

  1. La aplicación debe poder guardar una versión diferente del archivo (con una nueva extensión). Por ejemplo, exportar un .txt archivo a un .pdf archivo. Para controlar esta situación, debe usar un para NSFileCoordinator acceder al archivo. Primero llamará al método WillMove(fromURL, toURL) , moverá el archivo a la nueva extensión y, a continuación, llamará a ItemMoved(fromURL, toURL) .
  2. La aplicación debe abrir un archivo principal con una extensión y varios archivos compatibles con distintas extensiones. Por ejemplo, una película y un archivo de subtítulos. Use para NSFilePresenter obtener acceso al archivo secundario. Proporcione el archivo principal a la PrimaryPresentedItemURL propiedad y el archivo secundario a la propiedad PresentedItemURL . Cuando se abra el archivo principal, llame al AddFilePresenter método de la clase para registrar el archivo NSFileCoordinator secundario.

En ambos escenarios, el archivo Info.plist de la aplicación debe declarar los tipos de documento que la aplicación puede abrir. Para cualquier tipo de archivo, agregue NSIsRelatedItemType (con un valor de ) a YES su entrada en la CFBundleDocumentTypes matriz.

Abrir y guardar el comportamiento del cuadro de diálogo con aplicaciones en espacio aislado

Los límites siguientes se colocan en NSOpenPanel y NSSavePanel al llamarlos desde una aplicación xamarin.Mac en espacio aislado:

  • No se puede invocar mediante programación el botón Aceptar.
  • No se puede modificar mediante programación la selección de un usuario en NSOpenSavePanelDelegate .

Además, se han puesto en marcha las siguientes modificaciones de herencia:

  • Aplicación que no es de espacio aisladoNSOpenPanelNSSavePanel``NSPanel``NSWindow``NSResponder``NSObject``NSOpenPanel``NSSavePanel``NSObject``NSOpenPanel``NSSavePanel

Marcadores con ámbito de seguridad y acceso persistente a recursos

Como se indicó anteriormente, una aplicación de Xamarin.Mac en espacio aislado puede acceder a un archivo o recurso fuera de su contenedor mediante la interacción directa del usuario (tal y como proporciona PowerBox). Sin embargo, el acceso a estos recursos no se conserva automáticamente entre inicios de aplicaciones o reinicios del sistema.

Mediante el uso de marcadorescon ámbito de seguridad, una aplicación de Xamarin.Mac en espacio aislado puede conservar la intención del usuario y mantener el acceso a determinados recursos después de reiniciar la aplicación.

Tipos de marcadores con ámbito de seguridad

Al trabajar con Security-Scoped marcadores y el acceso persistente a recursos, hay dos casos de uso sistine:

  • Un App-Scoped Bookmark proporciona acceso persistente a un archivo o carpeta especificados por el usuario.

    Por ejemplo, si la aplicación Xamarin.Mac en espacio aislado permite usar para abrir un documento externo para editarlo (mediante ), la aplicación puede crear un marcador de App-Scoped para que pueda tener acceso al mismo archivo de nuevo en NSOpenPanel el futuro.

  • Un Document-Scoped Bookmark proporciona un acceso persistente de documento específico a un subpes archivo.

Por ejemplo, una aplicación de edición de vídeo que crea un archivo de proyecto que tiene acceso a las imágenes individuales, clips de vídeo y archivos de sonido que se combinarán más adelante en una sola película.

Cuando el usuario importa un archivo de recursos en el proyecto (a través de ), la aplicación crea un marcador de Document-Scoped para el elemento almacenado en el proyecto, de modo que el archivo siempre sea accesible para la NSOpenPanel aplicación.

Cualquier Document-Scoped bookmark que pueda abrir los datos del marcador y el propio documento puede resolver un marcador. Esto admite la portabilidad, lo que permite al usuario enviar los archivos de proyecto a otro usuario y hacer que todos los marcadores también funcionen para ellos.

Importante

Un Document-Scoped Bookmark solo puede apuntar a un único archivo y no a una carpeta, y ese archivo no puede estar en una ubicación utilizada por el sistema (como o /Library ).

Uso de marcadores con ámbito de seguridad

El uso de cualquier tipo Security-Scoped Bookmark requiere que realice los pasos siguientes:

  1. Establezca los derechos adecuados en la aplicación Xamarin.Mac que necesita usar Security-Scoped Bookmarks - For App-Scoped Bookmarks (Marcadores de App-Scoped), establezca la clave Entitlement (Derechos) en true . Para Document-Scoped bookmarks, establezca la com.apple.security.files.bookmarks.document-scope clave Entitlement en true .
  2. Crear un Security-Scoped Bookmark: lo hará para cualquier archivo o carpeta al que el usuario haya proporcionado acceso (por ejemplo, a través de ), al que la aplicación necesitará acceso persistente. Use el public virtual NSData CreateBookmarkData (NSUrlBookmarkCreationOptions options, string[] resourceValues, NSUrl relativeUrl, out NSError error) método de la clase para crear el NSUrl marcador.
  3. Resolver el marcador Security-Scoped: cuando la aplicación necesite acceder de nuevo al recurso (por ejemplo, después del reinicio), deberá resolver el marcador en una dirección URL de ámbito de seguridad. Use el public static NSUrl FromBookmarkData (NSData data, NSUrlBookmarkResolutionOptions options, NSUrl relativeToUrl, out bool isStale, out NSError error) método de la clase para resolver el NSUrl marcador.
  4. Notificar explícitamente al sistema que desea acceder al archivo desde la dirección URL de Security-Scoped: este paso debe realizarse inmediatamente después de obtener la dirección URL de Security-Scoped anterior o, cuando más adelante quiera recuperar el acceso al recurso después de haber cedido el acceso a él. Llame al StartAccessingSecurityScopedResource () método de la clase para empezar a acceder a una Security-Scoped NSUrl URL.
  5. Notificar explícitamente al sistema que ha terminado de acceder al archivo desde la dirección URL de Security-Scoped: tan pronto como sea posible, debe informar al sistema cuando la aplicación ya no necesite acceso al archivo (por ejemplo, si el usuario lo cierra). Llame al StopAccessingSecurityScopedResource () método de la clase para dejar de tener acceso a una Security-Scoped NSUrl URL.

Después de volver a dar acceso a un recurso, deberá volver al paso 4 para restablecer el acceso. Si se reinicia la aplicación Xamarin.Mac, debe volver al paso 3 y volver a resolver el marcador.

Importante

Si no se libera el acceso a Security-Scoped url, una aplicación de Xamarin.Mac pierde recursos de kernel. Como resultado, la aplicación ya no podrá agregar ubicaciones del sistema de archivos a su contenedor hasta que se reinicie.

Espacio aislado de la aplicación y firma de código

Después de habilitar el espacio aislado de la aplicación y de habilitar los requisitos específicos de la aplicación de Xamarin.Mac (a través de derechos), debe firmar el proyecto con código para que el espacio aislado suba. Debe realizar la firma de código porque los derechos necesarios para el espacio aislado de la aplicación están vinculados a la firma de la aplicación.

macOS aplica un vínculo entre el contenedor de una aplicación y su firma de código, de esta manera ninguna otra aplicación puede acceder a ese contenedor, incluso si suplanta el identificador de lote de aplicaciones. Este mecanismo funciona de la siguiente manera:

  1. Cuando el sistema crea el contenedor de la aplicación, establece una lista de Access Control (ACL) en ese contenedor. La entrada de control de acceso inicial de la lista contiene el requisito designado (DR) de la aplicación, que describe cómo se pueden reconocer las versiones futuras de la aplicación (cuando se ha actualizado).
  2. Cada vez que se inicia una aplicación con el mismo identificador de lote, el sistema comprueba que la firma de código de la aplicación coincide con los requisitos designados especificados en una de las entradas de la ACL del contenedor. Si el sistema no encuentra una coincidencia, impide que se inicie la aplicación.

La firma de código funciona de las maneras siguientes:

  1. Antes de crear el proyecto de Xamarin.Mac, obtenga un certificado de desarrollo, un certificado de distribución y un certificado de identificador de desarrollador de apple Portal para desarrolladores.
  2. Cuando el equipo Mac App Store distribuye la aplicación Xamarin.Mac, se firma con una firma de código de Apple.

Al probar y depurar, usará una versión de la aplicación Xamarin.Mac que ha firmado (que se usará para crear el contenedor de aplicaciones). Más adelante, si desea probar o instalar la versión desde apple App Store, se firmará con la firma de Apple y no se iniciará (ya que no tiene la misma firma de código que el contenedor de aplicaciones original). En esta situación, recibirá un informe de bloqueo similar al siguiente:

Exception Type:  EXC_BAD_INSTRUCTION (SIGILL)

Para solucionar este problema, deberá ajustar la entrada de ACL para que apunte a la versión firmada por Apple de la aplicación.

Para obtener más información sobre cómo crear y descargar los perfiles de aprovisionamiento necesarios para el espacio aislado, consulte la sección firma y aprovisionamiento de la aplicación anterior.

Ajuste de la entrada de ACL

Para permitir que se ejecute la versión firmada de Apple de la aplicación Xamarin.Mac, haga lo siguiente:

  1. Abra la aplicación Terminal (en /Applications/Utilities ).
  2. Abra una ventana de Finder en la versión firmada de Apple de la aplicación Xamarin.Mac.
  3. Escriba asctl container acl add -file en la ventana Terminal.
  4. Arrastre el icono de la aplicación Xamarin.Mac desde la ventana Finder y suéltelo en la ventana Terminal.
  5. La ruta de acceso completa al archivo se agregará al comando en Terminal.
  6. Presione Entrar para ejecutar el comando.

La ACL del contenedor ahora contiene los requisitos de código designados para ambas versiones de la aplicación Xamarin.Mac y macOS ahora permitirá que se ejecute cualquiera de las versiones.

Mostrar una lista de requisitos de código de ACL

Puede ver una lista de los requisitos de código en la ACL de un contenedor haciendo lo siguiente:

  1. Abra la aplicación Terminal (en /Applications/Utilities ).
  2. Escriba asctl container acl list -bundle <container-name>.
  3. Presione Entrar para ejecutar el comando.

suele <container-name> ser el identificador de lote de la aplicación Xamarin.Mac.

Diseño de una aplicación xamarin.mac para el espacio aislado de la aplicación

Hay un flujo de trabajo común que se debe seguir al diseñar una aplicación de Xamarin.Mac para app sandbox. Dicho esto, los detalles de la implementación del espacio aislado en una aplicación serán únicos para la funcionalidad de la aplicación determinada.

Seis pasos para adoptar el espacio aislado de la aplicación

El diseño de una aplicación xamarin.mac para el espacio aislado de la aplicación normalmente consta de los pasos siguientes:

  1. Determine si la aplicación es adecuada para el espacio aislado.
  2. Diseñar una estrategia de desarrollo y distribución.
  3. Resuelva las incompatibilidades de la API.
  4. Aplique los derechos necesarios del espacio aislado de la aplicación al proyecto de Xamarin.Mac.
  5. Agregue la separación de privilegios mediante XPC.
  6. Implementar una estrategia de migración.

Importante

No solo debe incluir en el espacio aislado el ejecutable principal del paquete de aplicaciones, sino también todas las herramientas o aplicaciones auxiliares incluidas en ese paquete. Esto es necesario para cualquier aplicación distribuida desde mac App Store y, si es posible, debe realizarse para cualquier otra forma de distribución de aplicaciones.

Para obtener una lista de todos los archivos binarios ejecutables en la agrupación de una aplicación de Xamarin.Mac, escriba el siguiente comando en Terminal:

find -H [Your-App-Bundle].app -print0 | xargs -0 file | grep "Mach-O .*executable"

Donde [Your-App-Bundle] es el nombre y la ruta de acceso al paquete de la aplicación.

Determinar si una aplicación de Xamarin.Mac es adecuada para el espacio aislado

La mayoría de las aplicaciones de Xamarin.Mac son totalmente compatibles con app sandbox y, por tanto, son adecuadas para el espacio aislado. Si la aplicación requiere un comportamiento que el espacio aislado de la aplicación no permite, debe considerar un enfoque alternativo.

Si la aplicación requiere uno de los comportamientos siguientes, no es compatible con el espacio aislado de la aplicación:

  • Servicios de autorización: con el espacio aislado de la aplicación, no puede trabajar con las funciones descritas en Authorization Services C Reference (Referencia de C de Servicios de autorización).
  • API de accesibilidad: no se pueden usar aplicaciones de asistencia de espacio aislado, como lectores de pantalla o aplicaciones que controlan otras aplicaciones.
  • Enviar eventos de Apple a aplicaciones arbitrarias: si la aplicación requiere enviar eventos de Apple a una aplicación desconocida y arbitraria, no puede estar en espacio aislado. En el caso de una lista conocida de aplicaciones llamadas, la aplicación todavía puede estar en espacio aislado y los derechos tendrán que incluir la lista de aplicaciones llamadas.
  • Enviar diccionarios de información de usuario en notificaciones distribuidas a otras tareas: con el espacio aislado de la aplicación, no se puede incluir un diccionario al publicar en un objeto para la mensajería de NSDistributedNotificationCenter otras tareas.
  • Cargar extensiones de kernel: el espacio aislado de la aplicación prohíbe la carga de extensiones de kernel.
  • Simular la entrada del usuario en los diálogos Abrir y Guardar: el espacio aislado de la aplicación prohíbe manipular mediante programación los diálogos Abrir o Guardar para simular o modificar la entrada del usuario.
  • Acceso o configuración de preferencias en otras aplicaciones: el espacio aislado de aplicaciones prohíbe la manipulación de la configuración de otras aplicaciones.
  • Configuración de la Configuración: el espacio aislado de la Configuración de aplicaciones prohíbe la manipulación de la red.
  • Terminación de otras aplicaciones: el espacio aislado de la aplicación prohíbe usar para finalizar otras aplicaciones.

Resolución de incompatibilidades de API

Al diseñar una aplicación de Xamarin.Mac para app sandbox, puede encontrar incompatibilidades con el uso de algunas API de macOS.

Estos son algunos problemas comunes y cosas que puede hacer para resolverlos:

  • Abrir, guardar y realizar el seguimiento de documentos: si administra documentos con cualquier tecnología que no sea , debe cambiar a ella debido a la compatibilidad integrada con app sandbox. NSDocument funciona automáticamente con PowerBox y proporciona compatibilidad para mantener los documentos dentro del espacio aislado si el usuario los mueve en Finder.
  • Conservar el acceso a los recursos del sistema de archivos: si la aplicación Xamarin.Mac depende del acceso persistente a los recursos fuera de su contenedor, use marcadores de ámbito de seguridad para mantener el acceso.
  • Crear un elemento de inicio de sesión para una aplicación: con el espacio aislado de la aplicación, no puede crear un elemento de inicio de sesión con ni puede manipular el estado de los servicios de inicio mediante LSRegisterURL . Use la función SMLoginItemSetEnabled como se describe en Apple Adding Login Items Using the Service Management Framework documentation (Agregar SMLoginItemSetEnabled
  • Acceso a datos de usuario: si usa funciones POSIX como para obtener el directorio principal del usuario de los servicios de directorio, considere la posibilidad de usar símbolos de Cocoa o Core Foundation como NSHomeDirectory .
  • Acceso a las preferencias de otras aplicaciones: dado que el espacio aislado de la aplicación dirige las API de búsqueda de rutas de acceso al contenedor de la aplicación, la modificación de las preferencias tiene lugar dentro de ese contenedor y no se permite el acceso a otras preferencias de aplicaciones.
  • Uso de vídeo incrustado HTML5 en vistas web: si la aplicación Xamarin.Mac usa WebKit para reproducir vídeos HTML5 insertados, también debe vincular la aplicación con el marco de AV Foundation. El espacio aislado de la aplicación impedirá que CoreMedia reprodgue estos vídeos de lo contrario.

Aplicación de los derechos necesarios del espacio aislado de la aplicación

Tendrá que editar los derechos de cualquier aplicación de Xamarin.Mac que quiera ejecutar en el espacio aislado de la aplicación y activar la casilla Habilitar espacio aislado de aplicaciones.

En función de la funcionalidad de la aplicación, es posible que tenga que habilitar otros derechos para acceder a los recursos o características del sistema operativo. El espacio aislado de aplicaciones funciona mejor cuando se minimizan los derechos que se solicitan al mínimo necesario para ejecutar la aplicación, por lo que debe habilitar los derechos de forma aleatoria.

Para determinar qué derechos requiere una aplicación de Xamarin.Mac, haga lo siguiente:

  1. Habilite el espacio aislado de la aplicación y ejecute la aplicación Xamarin.Mac.
  2. Ejecute las características de la aplicación.
  3. Abra la aplicación de consola (disponible en /Applications/Utilities ) y busque infracciones en el registro Todos sandboxd/Applications/Utilities mensajes.
  4. Para cada infracción, resuelva el problema mediante el contenedor de aplicaciones en lugar de otras ubicaciones del sistema de archivos o aplique derechos de espacio aislado de aplicación para habilitar el acceso a características sandboxd restringidas del sistema operativo.
  5. Vuelva a ejecutar y probar todas las características de la aplicación Xamarin.Mac de nuevo.
  6. Repita la repetición hasta sandboxd que se hayan resuelto todas las infracciones.

Agregar separación de privilegios mediante XPC

Al desarrollar una aplicación de Xamarin.Mac para app sandbox, vea los comportamientos de la aplicación en términos de privilegios y acceso y, a continuación, considere la posibilidad de separar las operaciones de alto riesgo en sus propios servicios XPC.

Para más información, consulte la Guía de programación de servicios y demonios y servicios XPCdeApple.

Implementación de una estrategia de migración

Si va a lanzar una nueva versión en espacio aislado de una aplicación de Xamarin.Mac que no estaba anteriormente en espacio aislado, deberá asegurarse de que los usuarios actuales tengan una ruta de actualización sin problemas.

Para más información sobre cómo implementar un manifiesto de migración de contenedores, lea la documentación migración de una aplicación a un espacio aislado de Apple.

Resumen

En este artículo se ha realizado un análisis detallado del espacio aislado de una aplicación de Xamarin.Mac. En primer lugar, creamos una aplicación xamarin.mac sencilla para mostrar los conceptos básicos del espacio aislado de la aplicación. A continuación, se ha mostrado cómo resolver las infracciones del espacio aislado. A continuación, hemos visto en profundidad el espacio aislado de la aplicación y, por último, hemos visto el diseño de una aplicación xamarin.mac para el espacio aislado de la aplicación.