[Xojo 2026r2] Experiencia de depuración mejorada para apps macOS

A lo largo de las últimas versiones hemos venido mejorando las opciones dirigidas al firmado de aplicaciones para macOS, facilitando así el cumplimiento con los requerimientos de Apple, tanto si decides distribuir tus apps de forma directa como a través de la Mac App Store. Aun así, todavía existía un agujero cuando se trataba de depurar dichas apps desde el IDE: no se aplicaba el Sandboxing, Hardened Runtime, el uso de Entitlements e incluso la aplicación de Perfiles de Aprovisionamiento… de modo que existía una diferencia significativa cuando la app se depuraba y el comportamiento real de dichas apps cuando se distribuían a los usuarios.

La buena noticia es que, comenzando con Xojo 2026r2, la depuración de tus apps macOS tendrán el mismo comportamiento que el mostrado para tus usuarios cuando dichas aplicaciones se distribuyen finalmente. Por ejemplo, si decides utilizar Sandboxing y Hardened Runtime, entonces se aplicarán también durante la depuración. Por tanto, todas las operaciones realizadas en este caso sobre archivos tendrán lugar en el entorno de Sandboxing y también se cumplirán con el resto de ajustes establecidos en Build Settings > macOS > Sign > Sandbox. Esto mismo también se aplica cuando se activa Hardened Runtime.

Adicionalmente, y especialmente cuando se trata de apps macOS avanzadas en las que se requiere el uso de Entitlements y Perfiles de Aprovisionamiento para acceder o utilizar a determinadas capacidades de macOS o tecnologías de Apple, estos también se aplicarán durante la depuración de tus apps desde el IDE. En tal caso, sólo has de asegurarte de seleccionar el certificado Build For > Development requerido para el firmado de la aplicación.

Depurar con Entitlements y Perfiles de Aprovisionamiento, en acción

Para mostrar cuan conveniente resulta depurar apps de macOS con entitlements y perfiles de aprovisionamiento aplicados, haremos uso de otra de las pequeñas mejoras incluidas a partir de Xojo 2026r2: contraseñas de KeyChain sincronizadas. (Para que ello funcione tendrás que tener activado iCloud > Passwords activado en System Settings > Apple Account > iCloud).

El primer paso consiste en crear el Perfil de Aprovisionamiento en el sitio Developer de Apple (especialmente para keychain-access-groups), descargarlo y añadirlo al proyecto utilizando un paso de compilación Copy Build Step; asegurándote a continuación de elegir la opción Contents como destino para el archivo a copiar.


Luego, hemos de crear el archivo correspondiente a los entitlements asociados utilizando para ello el editor de textos que prefieras. Asegúrate de que su contenido sea como el mostrado a continuación (evidentemente, cambiando las referencias al identificador de bundle y Developer ID para que se correspondan con los tuyos):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>keychain-access-groups</key>
	<array>
		<string>BW7PU32485.*</string>
	</array>
	<key>com.apple.application-identifier</key>
	<string>BW7PU32485.com.aprendexojo.Cheese</string>
</dict>
</plist>

Una vez creado y guardado en un archivo utilizando la extensión “.entitlements”, añádelo en Build Settings > macOS > Sign > User Entitlements.

Creando una contraseña sincronizada

Tras haber añadido un botón a la ventana por omisión del proyecto, impleméntale el manejador de evento Pressed y añade el siguiente fragmento de código en el Editor de Código asociado:

Var newItem As KeychainItem

If System.KeychainCount > 0 Then

  newItem = New KeychainItem
  newItem.Label = "This is a Label"
  newItem.Description = "This is a description"
  newItem.ServiceName = "MyApplication"
  newItem.AccountName = "XojoTest"
  newItem.Comment = "This is a comment"
  
  ' Assign a password to the item
  ' Passing True as the third parameter means we want this one
  ' to be created / saved under the iCloud keychain,
  ' so it will be automatically synced with other Macs using
  ' the same iCloud user account.
  
  System.Keychain.AddPassword(newItem, "SecretPassword", true)
Else
  System.Beep
  MessageBox("You don't have a key chain.")
End If

Exception e As KeychainException
  MessageBox("Keychain error: " + e.Message)

Ejecuta la app desde el IDE (puedes activar tanto Sandboxing como Hardened Runtime si lo deseas), haz clic en el botón… y se comportará del modo que lo hará cuando la distribuyas. Si abres la app Llaveros, seleccionas la entrada iCloud en la barra lateral de la ventana de Contraseñas, y seleccionas la opción Contraseñas en la parte superior de la ventana, verás que se habrá añadido la contraseña creada desde nuestra app depurada.

Evidentemente, si tienes más de un Mac en el que utilices la misma cuenta de iCloud, podrás ver cómo dicha contraseña también se ha sincronizado y añadido a Llaveros.

En definitiva, esto significa dos cosas:

  • Como has podido comprobar, las apps de macOS depuradas muestran el mismo comportamiento que tendrán cuando se distribuyan, lo que implica que podrás depurarlas en condiciones reales.
  • La nueva capacidad de crear contraseñas sincronizadas resulta muy conveniente para aquellas apps de macOS que necesiten acceder a contraseñas, de modo que tus usuarios no tendrán que volver a crearlas en cada uno de los ordenadores en los que se ejecute la app, o bien crear contraseñas diferentes en cada uno de ellos.

En resumen

Tal y como hemos visto, la capacidad de activar Sandboxing, Hardened Runtime, utilizar Entitlements y Perfiles de Aprovisionamiento en tus apps de macOS durante el proceso de depuración evita el uso de montones de condicionales de compilación en tu código, aparte de ofrecer una experiencia más próxima con respecto a la aplicación final (distribuida), e incluso facilitar y hacer que resulte más apropiada la detección de fallos en el código.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *