Espacio aislado de una aplicación de Xamarin.Mac

En este artículo se describe el espacio aislado de una aplicación de Xamarin.Mac para su lanzamiento en App Store. Abarca todos los elementos que entran en espacio aislado, como directorios de contenedor, derechos, permisos determinados por el usuario, separación de privilegios y cumplimiento 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 al trabajar con Objective-C o Swift.

An example of the running app

En este artículo, trataremos los conceptos básicos de trabajar con espacio aislado en una aplicación de Xamarin.Mac y todos los elementos que entran en espacio aislado: directorios de contenedor, derechos, permisos determinados por el usuario, separación de privilegios y cumplimiento del kernel. Se recomienda encarecidamente trabajar primero en el artículo Hello, Mac , específicamente en las secciones Introducción a Xcode y Generador de interfaces y Salidas y Acciones , ya que trata conceptos clave y técnicas que usaremos en este artículo.

Puede que quiera echar un vistazo a la sección Exponer clases o métodos de C# a Objective-C la sección del documento Xamarin.Mac Internals , también explica los Register atributos y Export que se usan para conectar las clases de C# a Objective-C objetos y elementos de la interfaz de usuario.

Acerca del espacio aislado de aplicaciones

El espacio aislado de aplicaciones proporciona una defensa fuerte contra daños que pueden deberse a que una aplicación malintencionada se ejecuta en un Equipo Mac limitando el acceso que una aplicación tiene a los recursos del sistema.

Una aplicación que no es de espacio aislado tiene los derechos completos del usuario que ejecuta la aplicación y puede acceder o hacer cualquier cosa que el usuario pueda. Si la aplicación contiene agujeros de seguridad (o cualquier marco que use), un hacker puede aprovechar esas debilidades 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 de espacio aislado proporciona una línea de defensa contra el robo, daños o intenciones malintencionadas por parte de una aplicación que se ejecuta en el equipo del usuario.

El espacio aislado de aplicaciones es una tecnología de control de acceso integrada en macOS (aplicada en el nivel de kernel) que proporciona una estrategia bidireccional:

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

Preparación para implementar el espacio aislado de aplicaciones

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

  • Directorios de contenedor
  • Derechos
  • Permisos determinados por el usuario
  • Separación de privilegios
  • Cumplimiento del kernel

Después de comprender 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 un buen candidato para el espacio aislado (la mayoría de las aplicaciones son). A continuación, deberá resolver cualquier incompatibilidad de API y determinar qué elementos del espacio aislado de la aplicación necesitará. Por último, examine el uso de la separación de privilegios para maximizar el nivel de defensa de la aplicación.

Al adoptar el espacio aislado de la aplicación, algunas ubicaciones del sistema de archivos que usa la aplicación serán diferentes. En particular, la aplicación tendrá un directorio de contenedor que se usará para archivos, bases de datos, 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 de espacio aislado

En esta sección, crearemos una aplicación sencilla de Xamarin.Mac que use una vista web (que requiere una conexión de red restringida en 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 aprenderá a solucionar errores comunes del espacio aislado de aplicaciones.

Creación del proyecto de Xamarin.Mac

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

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

  2. En el cuadro de diálogo Nuevo proyecto, seleccione Mac>App>Cocoa App:

    Creating a new Cocoa App

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

    Entering the app name

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

    Editing the main storyboard

  5. Arrastre una vista web a la ventana, establézcala para rellenar el área de contenido y establézcala para crecer y reducirla con la ventana:

    Adding a web view

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

    Creating a new outlet

  7. Vuelva a Visual Studio para Mac y 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 el ViewDidLoad método tenga un aspecto similar 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 de la siguiente manera:

Showing an example app run

Firma y aprovisionamiento de la aplicación

Para poder habilitar el espacio aislado de aplicaciones, primero necesitamos aprovisionar y firmar nuestra aplicación de Xamarin.Mac.

Haga lo siguiente:

  1. Inicie sesión en el Portal para desarrolladores de Apple:

    Logging into the Apple Developer Portal

  2. Seleccione Certificados, identificadores y perfiles:

    Selecting Certificates, Identifiers & Profiles

  3. En Aplicaciones de Mac, seleccione Identificadores:

    Selecting Identifiers

  4. Cree un identificador para la aplicación:

    Creating a new App ID

  5. En Perfiles de aprovisionamiento, seleccione Desarrollo:

    Selecting Development

  6. Cree un nuevo perfil y seleccione Desarrollo de aplicaciones para Mac:

    Creating a new profile

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

    Selecting the App ID

  8. Seleccione los desarrolladores para este perfil:

    Adding developers

  9. Seleccione los equipos de este perfil:

    Selecting the allowed computers

  10. Asigne un nombre al perfil:

    Giving the profile a name

  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 antes de poder acceder al nuevo perfil.

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

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

    Editing accounts in Xcode

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

    Clicking the View Details button

  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 identificador de aplicación y el perfil de aprovisionamiento en nuestro proyecto de Xamarin.Mac. Hagamos lo siguiente:

  1. En el 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 agrupación coincide con el identificador de aplicación que hemos creado anteriormente (ejemplo: com.appracatappra.MacSandbox):

    Editing the Bundle Identifier

  3. A continuación, haga doble clic en el archivo Entitlements.plist y asegúrese de que nuestro almacén de clave-valor de iCloud y los contenedores de iCloud coinciden con nuestro identificador de aplicación que hemos creado anteriormente (ejemplo: com.appracatappra.MacSandbox):

    Editing the Entitlements.plist file

  4. Guarde los cambios.

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

    Editign the solution's options

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

    Setting the provisioning profile

  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 instalado 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 sigue funcionando como antes, todo es bueno. En caso de error, puede obtener un cuadro de diálogo como el siguiente:

An example provisioning issue dialog

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

  • El id. de agrupación 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 el Portal para desarrolladores de Apple, 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 el espacio aislado de aplicaciones, active una casilla en las opciones de los proyectos. Haga lo siguiente:

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

  2. Active Enable Entitlements (Habilitar derechos) y Enable App Sandboxing (Habilitar espacios aislados de aplicaciones):

    Editing entitlements and enabling sandboxing

  3. Guarde los cambios.

En este momento, ha habilitado el espacio aislado de aplicaciones, 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:

Showing the web access being blocked

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

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

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

    Opening the app's bundle

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

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

    Checking the app in the Activity Monitor

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

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

    Checking the app on the command line

Depuración de una aplicación de espacio aislado

El depurador se conecta a aplicaciones de Xamarin.Mac a través de TCP, lo que significa que, de forma predeterminada, al habilitar 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 un error "No se puede conectar al depurador".

Setting the required options

El permiso Allow Outgoing Network Conectar ions (Client) es el necesario para el depurador, lo que permite la depuración normalmente. Puesto que no se puede depurar sin él, hemos actualizado el CompileEntitlements destino para msbuild agregar automáticamente ese permiso a los derechos de cualquier aplicación que esté en espacio aislado solo para las compilaciones 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 del espacio aislado de aplicaciones

Una infracción de espacio aislado de aplicaciones se produce si una aplicación de Xamarin.Mac de espacio aislado intentó 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, en nuestro ejemplo, faltan derechos de red Conectar ion que impiden que la vista web funcione.

Detección de infracciones del espacio aislado de aplicaciones

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

Haga lo siguiente:

  1. Compile la aplicación en cuestión y ejecútelo desde Visual Studio para Mac.

  2. Abra la aplicación Consola (desde /Applications/Utilties/).

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

    An example of a sandboxing issue in the console

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

Corrección de infracciones del espacio aislado de aplicaciones 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 la aplicación.

Haga lo siguiente:

  1. En el 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 red saliente Conectar ions (cliente):

    Editing the entitlements

  3. Guarde los cambios en la aplicación.

Si hacemos lo anterior para nuestra aplicación de ejemplo, compile y ejecútelo, el contenido web se mostrará ahora según lo previsto.

Espacio aislado de aplicaciones en profundidad

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

Dado el mejor esfuerzo para proteger la aplicación de Xamarin.Mac de ser explotada por código malintencionado, solo es necesario que haya 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 aplicaciones se diseñó para evitar la adquisición (o limitar el daño que puede causar) al permitirle especificar las interacciones previstas de la aplicación con el sistema. El sistema solo concederá acceso al recurso que requiere la aplicación para realizar su trabajo y nada más.

Al diseñar para el espacio aislado de aplicaciones, está diseñando para un escenario peor. 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, se concede a una aplicación de Xamarin.Mac que no se ha aislado los derechos completos y el acceso del usuario que ejecuta la aplicación. Si está en peligro por código malintencionado, una aplicación no protegida puede actuar como agente para un comportamiento hostil, con una amplia gama de posibilidades para hacer daño.

Al habilitar el espacio aislado de la aplicación, se quitan todos los privilegios, pero un conjunto mínimo de privilegios, que después se vuelven a habilitar solo con los derechos de la aplicación de Xamarin.Mac.

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

Editing the entitlements

Directorios de contenedor y acceso al sistema de archivos

Cuando la aplicación de Xamarin.Mac adopta el espacio aislado de aplicaciones, tiene acceso a las siguientes ubicaciones:

  • El directorio contenedor de aplicaciones: en la primera ejecución, el sistema operativo crea un directorio de contenedor especial donde todos sus recursos van, a los que solo puede acceder. La aplicación tendrá acceso completo de lectura y escritura a este directorio.
  • Directorios de contenedor del grupo de aplicaciones: se puede conceder acceso a la aplicación 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 se abren o arrastran y quitan explícitamente en la aplicación por parte del usuario.
  • Elementos relacionados: con los derechos adecuados, la aplicación puede tener acceso a un archivo con el mismo nombre, pero 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 en 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

Un directorio contenedor de aplicaciones de Xamarin.Mac tiene las siguientes características:

  • Se encuentra en una ubicación oculta en el directorio Inicio del usuario (normalmente ~Library/Containers) y se puede acceder a ella con la función (consulte a continuación) dentro de la NSHomeDirectory aplicación. Dado que está en el directorio Inicio, cada usuario obtendrá su propio contenedor para la aplicación.
  • La aplicación tiene acceso de lectura y escritura sin restricciones al directorio contenedor y a todos sus subdirectorios y archivos dentro de ella.
  • La mayoría de las API de búsqueda de rutas 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 NSLibraryDirectoryde ), subdirectorios compatibilidad de 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 es otra aplicación que intenta suplantar 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 zapatillas de aplicaciones (como la aplicación Photo de Apple), el contenido del usuario pasará al contenedor.

Importante

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

Como solución alternativa 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 de contenedor del grupo de aplicaciones

A partir de Mac macOS 10.7.5 (y versiones posteriores), una aplicación puede usar el com.apple.security.application-groups derecho de acceder a un contenedor compartido que es común a todas las aplicaciones 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 con el identificador del equipo de desarrollo y un período, por ejemplo:

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

Para obtener más información, consulte Agregar una aplicación a un grupo de aplicaciones en referencia de clave de derechos.

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

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

  • 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 el mundo (por ejemplo, compartir).

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 de Xamarin.Mac en espacio aislado. Powerbox no tiene ninguna API, pero se activa de forma transparente cuando la aplicación llama a o NSOpenPanelNSSavePanel. El acceso a Powerbox está habilitado a través de los derechos establecidos para la aplicación Xamarin.Mac.

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

Cuando un usuario selecciona un archivo o directorio en 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 de espacio aislado:

  • Conectar 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 y pegar entre otras aplicaciones.
  • Leer archivos de las siguientes ubicaciones legibles del mundo:
    • /bin
    • /sbin
    • /usr/bin
    • /usr/lib
    • /usr/sbin
    • /usr/share
    • /System
  • Leer y escribir 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 finaliza la aplicación (a menos que el archivo todavía esté 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 reanudación de macOS la próxima vez que se inicie la aplicación.

Para proporcionar persistencia a los archivos ubicados fuera de un contenedor de la aplicación de Xamarin.Mac, use marcadores con ámbito de seguridad (consulte a continuación).

El espacio aislado de aplicaciones permite a una aplicación acceder a los 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 Info.plst la aplicación, b) código para indicar al espacio aislado qué hará la 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 para NSFileCoordinator acceder al archivo. Primero llamará al WillMove(fromURL, toURL) método , 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 auxiliares con diferentes extensiones. Por ejemplo, un archivo Movie y un subtítulo. Use para NSFilePresenter obtener acceso al archivo secundario. Proporcione el archivo principal a la PrimaryPresentedItemURL propiedad y al archivo secundario a la PresentedItemURL propiedad . Cuando se abra el archivo principal, llame al AddFilePresenter método de la NSFileCoordinator clase para registrar el archivo 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 YES) a su entrada en la CFBundleDocumentTypes matriz.

Comportamiento del cuadro de diálogo Abrir y guardar con aplicaciones de espacio aislado

Los límites siguientes se colocan en y NSOpenPanelNSSavePanel al llamarlos desde una aplicación de Xamarin.Mac de 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 aplican las siguientes modificaciones de herencia:

  • Aplicación sin espacio aislado - NSOpenPanelNSSavePanel``NSPanel``NSWindow``NSResponder``NSObject``NSOpenPanel``NSSavePanel``NSObject``NSOpenPanel``NSSavePanel

Marcadores con ámbito de seguridad y acceso a recursos persistentes

Como se indicó anteriormente, una aplicación de Xamarin.Mac con espacio aislado puede acceder a un archivo o recurso fuera de su contenedor mediante la interacción directa del usuario (según lo proporcionado por PowerBox). Sin embargo, el acceso a estos recursos no se conserva automáticamente en los inicios de la aplicación ni en los reinicios del sistema.

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

Tipos de marcador con ámbito de seguridad

Al trabajar con marcadores con ámbito de seguridad y acceso a recursos persistentes, hay dos casos de uso sistines:

  • Un marcador con ámbito de aplicación proporciona acceso persistente a un archivo o carpeta especificados por el usuario.

    Por ejemplo, si la aplicación de Xamarin.Mac de espacio aislado permite abrir un documento externo para su edición (mediante un NSOpenPanel), la aplicación puede crear un marcador con ámbito de aplicación para que pueda acceder de nuevo al mismo archivo en el futuro.

  • Un marcador con ámbito de documento proporciona un acceso persistente de documento específico a un subproceso.

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 ), NSOpenPanella aplicación crea un marcador con ámbito de documento para el elemento almacenado en el proyecto, de modo que el archivo siempre sea accesible para la aplicación.

Cualquier aplicación que pueda abrir los datos del marcador y el propio documento pueden resolver un marcador con ámbito de documento. Esto admite la portabilidad, lo que permite al usuario enviar los archivos del proyecto a otro usuario y hacer que todos los marcadores también funcionen para ellos.

Importante

Un marcador con ámbito de documento solo puede apuntar a un único archivo y no a una carpeta y ese archivo no puede estar en una ubicación usada por el sistema (como /private o /Library).

Uso de marcadores con ámbito de seguridad

El uso de cualquiera de los tipos de marcador con ámbito de seguridad requiere que realice los pasos siguientes:

  1. Establezca los derechos adecuados en la aplicación de Xamarin.Mac que necesita usar Marcadores con ámbito de seguridad: para marcadores con ámbito de aplicación, establezca la com.apple.security.files.bookmarks.app-scope clave de derecho en true. En Marcadores con ámbito de documento, establezca la com.apple.security.files.bookmarks.document-scope clave de derecho en true.
  2. Crear un marcador con ámbito de seguridad: lo hará para cualquier archivo o carpeta al que el usuario haya proporcionado acceso (por NSOpenPanel ejemplo), a la 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 NSUrl clase para crear el marcador.
  3. Resolver el marcador con ámbito de seguridad: cuando la aplicación necesite acceder al recurso de nuevo (por ejemplo, después del reinicio), tendrá que resolver el marcador en una dirección URL con á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 NSUrl clase para resolver el marcador.
  4. Notifique explícitamente al sistema que desea acceder al archivo desde la dirección URL con ámbito de seguridad: este paso debe realizarse inmediatamente después de obtener la dirección URL con ámbito de seguridad anterior o, cuando más adelante quiera recuperar el acceso al recurso después de haber renunciado al acceso a él. Llame al StartAccessingSecurityScopedResource () método de la NSUrl clase para empezar a acceder a una dirección URL con ámbito de seguridad.
  5. Notifique explícitamente al sistema que ha terminado de acceder al archivo desde la dirección URL con ámbito de seguridad: lo antes 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 NSUrl clase para dejar de acceder a una dirección URL con ámbito de seguridad.

Después de renunciar al acceso a un recurso, deberá volver al paso 4 para volver a establecer 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 los recursos de dirección URL con ámbito de seguridad, una aplicación de Xamarin.Mac perderá los recursos del 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 aplicaciones y firma de código

Después de habilitar el espacio aislado de aplicaciones y habilitar los requisitos específicos de la aplicación de Xamarin.Mac (a través de derechos), debe firmar el proyecto para que el espacio aislado surta efecto. Debe realizar la firma de código porque los derechos necesarios para el espacio aislado de aplicaciones 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 control de acceso (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 agrupación, 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 la aplicación se inicie.

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 desde el Portal para desarrolladores de Apple.
  2. Cuando 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 de Xamarin.Mac que firmó (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 podrá iniciar (ya que no tiene la misma firma de código que el contenedor de aplicaciones original). En esta situación, obtendrá un informe de bloqueo similar al siguiente:

Exception Type:  EXC_BAD_INSTRUCTION (SIGILL)

Para corregirlo, deberá ajustar la entrada de ACL para que apunte a la versión firmada de 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 de Xamarin.Mac desde la ventana Finder y colóquelo 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.

<container-name> normalmente es el identificador de agrupación de la aplicación Xamarin.Mac.

Diseño de una aplicación de Xamarin.Mac para el espacio aislado de aplicaciones

Hay un flujo de trabajo común que debe seguirse al diseñar una aplicación de Xamarin.Mac para el espacio aislado de aplicaciones. Dicho esto, los detalles de la implementación de 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 aplicaciones

El diseño de una aplicación de Xamarin.Mac para el espacio aislado de aplicaciones 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 de espacio aislado de aplicaciones necesarios 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 espacio aislado del archivo ejecutable principal de la agrupación de aplicaciones, sino también todas las aplicaciones auxiliares o herramientas incluidas de ese conjunto. 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 de una agrupación de aplicaciones 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 el espacio aislado de aplicaciones y, por tanto, son adecuadas para el espacio aislado. Si la aplicación requiere un comportamiento que el espacio aislado de aplicaciones no permite, debe considerar un enfoque alternativo.

Si la aplicación requiere uno de los siguientes comportamientos, 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 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 el envío de eventos de Apple a una aplicación desconocida y arbitraria, no puede estar en espacio aislado. Para obtener una lista conocida de aplicaciones denominadas, la aplicación todavía puede estar en espacio aislado y los derechos deberán incluir la lista de aplicaciones llamada.
  • Enviar diccionarios de información de usuario en notificaciones distribuidas a otras tareas : con el espacio aislado de la aplicación, no puede incluir un userInfo diccionario al publicar en un NSDistributedNotificationCenter objeto para mensajería de otras tareas.
  • Cargar extensiones de kernel: la carga de extensiones de kernel está prohibida por el espacio aislado de la aplicación.
  • Simulación de la entrada de usuario en cuadros de diálogo abrir y guardar: la manipulación mediante programación de diálogos Abrir o Guardar para simular o modificar la entrada del usuario está prohibida por el espacio aislado de la aplicación.
  • Acceso o configuración de preferencias en otras aplicaciones : la manipulación de la configuración de otras aplicaciones está prohibida por el espacio aislado de la aplicación.
  • Configurar Configuración de red: la manipulación de Configuración de red está prohibida por el espacio aislado de la aplicación.
  • Terminación de otras aplicaciones : el espacio aislado de aplicaciones prohíbe el uso NSRunningApplication de para finalizar otras aplicaciones.

Resolución de incompatibilidades de API

Al diseñar una aplicación de Xamarin.Mac para el espacio aislado de aplicaciones, es posible que encuentre 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 un seguimiento de documentos : si administra documentos con cualquier tecnología distinta NSDocumentde , debe cambiar a él debido a la compatibilidad integrada con el espacio aislado de aplicaciones. 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 con á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 mediante LSSharedFileList ni puede manipular el estado de los servicios de inicio mediante LSRegisterURL. Use la SMLoginItemSetEnabled función tal y como se describe en Apples Adding Login Items Using the Service Management Framework documentation (Agregar elementos de inicio de sesión mediante la documentación de Service Management Framework ).
  • Acceso a datos de usuario: si usa funciones POSIX como getpwuid 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 aplicaciones 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 el acceso a otras preferencias de aplicaciones en no permitidas.
  • Usar vídeo insertado HTML5 en vistas web: si la aplicación de Xamarin.Mac usa WebKit para reproducir vídeos HTML5 incrustados, también debe vincular la aplicación con el marco de AV Foundation. El espacio aislado de la aplicación impedirá que CoreMedia reproduzca estos vídeos de otro modo.

Aplicación de derechos de espacio aislado de aplicaciones requeridos

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 las características o recursos del sistema operativo. El espacio aislado de aplicaciones funciona mejor cuando se minimizan los derechos que solicita al mínimo necesario para ejecutar la aplicación, por lo que solo se habilitan 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 aplicaciones y ejecute la aplicación Xamarin.Mac.
  2. Ejecute las características de la aplicación.
  3. Abra la aplicación Consola (disponible en /Applications/Utilities) y busque sandboxd infracciones en el registro Todos los mensajes .
  4. Para cada sandboxd infracción, resuelva el problema mediante el uso del contenedor de aplicaciones en lugar de otras ubicaciones del sistema de archivos o aplique derechos de espacio aislado de aplicaciones para habilitar el acceso a características restringidas del sistema operativo.
  5. Vuelva a ejecutar y probar de nuevo todas las características de la aplicación de Xamarin.Mac.
  6. Repita esta operación hasta que se hayan resuelto todas las sandboxd infracciones.

Adición de la separación de privilegios mediante XPC

Al desarrollar una aplicación de Xamarin.Mac para el espacio aislado de aplicaciones, examine 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 obtener más información, consulte la Guía de programación de servicios y demonios y demonios y servicios de Apple.

Implementación de una estrategia de migración

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

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 tomado un vistazo detallado al espacio aislado de una aplicación de Xamarin.Mac. En primer lugar, creamos una aplicación de Xamarin.Mac para mostrar los conceptos básicos del espacio aislado de aplicaciones. A continuación, se muestra cómo resolver las infracciones del espacio aislado. A continuación, echamos un vistazo detallado al espacio aislado de aplicaciones y, por último, examinamos el diseño de una aplicación de Xamarin.Mac para el espacio aislado de aplicaciones.