URI personalizado en Apps Xojo Desktop OS X

URI personalizado en Xojo¿Te has preguntado alguna vez cómo funciona la magia que existe tras “mailto:…” o cualquier otro URI (Uniform Resource Identifier) similar? Ya sabes, se trata del modo en el que utilizas este tipo elementos desde el campo de URL del navegador web o, desde la perspectiva Xojo, en combinación con la función ShowURL. Una vez que se ejecutan estas URL especiales, se abre la aplicación registrada reaccionando a los parámetros pasados (en el caso de Mail, componiendo un nuevo mensaje con la información recibida para los campos ‘Para’, ‘Asunto’ o cuerpo del mensaje, por ejemplo).

Lo cierto es que implementar este tipo de comportamiento en tus apps OS X con Xojo ¡no es nada complicado! Solo has de seguir estos sencillos pasos para registrar el URI personalizado de tu app. Este es el modo que tiene la app de indicar al Sistema Operativo que se encargará de responder cada vez que cualquier usuario (o aplicación) utilice dicha URI.

Registrar la URI personalizada que quieres gestionar

Esto es algo que se hace modificando el archivo “info.plist” generado por Xojo cada vez que se compila la app, de modo que involucra necesariamente el uso de los potentes pasos de Compilación disponibles en Xojo (Build Step). Para allanar el camino:

  1.  Haz Control + clic en el item OS X disponible en la sección Build Settings del Navegador de Proyectos (la columna situada más a la izquierda en el IDE de Xojo).
  2. Selecciona la opción Add to “Build Settings” > Build Step > Script.
  3. Pega el siguiente código (¡asegúrate de que PlistBuddy está instalado en tu Mac!):
Dim App As String = CurrentBuildLocation + "/" + CurrentBuildAppName +".app"
call DoShellCommand("/usr/libexec/PlistBuddy -c ""add :CFBundleURLTypes array"" " + App + "/Contents/Info.plist" )
call DoShellCommand("/usr/libexec/PlistBuddy -c ""add :CFBundleURLTypes:0 dict"" " + App + "/Contents/Info.plist" )
call DoShellCommand("/usr/libexec/PlistBuddy -c ""add :CFBundleURLTypes:0:CFBundleURLName string 'Demo'"" " + App + "/Contents/Info.plist" )
call DoShellCommand("/usr/libexec/PlistBuddy -c ""add :CFBundleURLTypes:0:CFBundleURLSchemes array"" " + App + "/Contents/Info.plist" )
call DoShellCommand("/usr/libexec/PlistBuddy -c ""add :CFBundleURLTypes:0:CFBundleURLSchemes:0 string 'demo'"" " + App + "/Contents/Info.plist" )

Presta atención al uso de las cadenas ‘Demo’ y ‘demo’ para las claves CFBundleURLName y CFBundleURLSchemes, respectivamente. La segunda, CFBundleURLSchemes, es la correspondiente al URI personalizado que podrá utilizar cualquiera para pasar información a nuestra aplicación.

Asegúrate de seleccionar la opción “Both” en el Inspector para este Paso de Compilación, y escribe un nombre que permita identificar el script (por ejemplo “Insertar URI en Plist”). De este modo, el URI se registrará tanto cada vez que se ejecute la app desde el Depurador de Xojo como cuando se compile para su despliege (como aplicación independiente o standalone).

Permite que tu app reaccione al URI

El segundo paso principal consiste en permitir que tu app Xojo reaccione al URI, y esto se logra añadiendo el evento HandleAppleEvent al Objeto App de tu aplicación.

En cuanto al código que probablemente quieras utilizar como parte de este Evento, el propósito principal consiste en identificar el Evento recibido y compararlo con la cadena “GURL”, dado que este es el identificador utilizado por OS X para enviar un evento URI:

if eventClass = "GURL" then

//do your thing

return true
end

return false

De esta forma la app no interfiere con la gestión del resto de eventos recibidos y en los que no estamos interesados.

¡Es muy importante señalar que el evento HandleAppleEvent debe devolver False para los Eventos ignorados! De otro modo, el usuario de tu app probablemente experiencie problemas de funcionamiento en el uso de determinados atajos de teclado sobre los TextField, TextArea u otros controles, entre otros problemas.

Acceder a la información

El paso final consiste en extraer la información recibida junto con el evento “GURL”. Xojo proporciona varios métodos que nos permiten realizar dicha acción (e incluso responder a los eventos); pero para este ejemplo vamos a proporcionar el código para el más común de los usos: obtener la información enviada como una cadena de texto.

dim s() as string = DecodeURLComponent(theEvent.StringParam("----")).DefineEncoding(encodings.UTF8).Split(":")

s.Remove(0)

La clave en este caso se encuentra en el código ‘theEvent.StringParam(“—-“)’. Este obtiene la cadena disponible y que está asociada con la lcave keyDirectObject del Diccionario (el valor de dicha constante es la cadena “—-” utilizada aquí.)

El segundo punto a destacar es que debes de asignar una codificación de texto a la cadena recibida, y utilizar la función DecodeURLComponent para restaurar el texto original enviado junto con el URI (“demo:”, en este ejemplo).

Por último, puedes utilizar la función Split para obtener un Array de cadenas de modo que puedas descartar el primer componente recivido (el URI propiamente dicho), uniendo el resto de elementos para obtener la cadena final.

Descubre como puedes crear apps multiplataforma con mi libro electrónico “Programación Multiplataforma Xojo“.

6 comentarios en “URI personalizado en Apps Xojo Desktop OS X

  1. Domenico Castellana

    Hola Javier

    Yo compre tu libro hace tiempo y es muy bueno , pero te pregunto y me pregunto como hago para llegar a los niveles de conocimiento que tu tienes con Xojo.
    Es decir me todos tus videos pero me falta mucho , muchisimo para dominar xojo como tu lo dominas.

    Donde me estoy equivocando o que es lo que me esta haciendo falta?

    Me encanta la programacion y mas con Xojo pero a tu lado me siento un tarado.

    El secreto para aprender xojo esta en los manuales o va mas alla de los manuales?

    Te agradezco la respuesta

    Domenico

    1. Javier Rodriguez

      Hola Domenico,

      Como en todo, ¡no hay más secreto que horas y horas de trabajo! Tranquilo, a mi también me parece que aun me queda mucho por aprender! Para allanar el camino, no obstante, también ofrezco mis servicios de formación a distancia o presencial… así que si quieres acelerar el aprendizaje, no dudes en contactar conmigo y seguro que en pocas horas concentradas en un tema serás capaz de aumentar el nivel de programación considerablemente!

  2. Pablo Kessler

    Javier he comenzado a programar en Xojo en MAC. (He programdo en Basic) y me gustaría preguntarte, si me podrías ayudar. Quiero saber como dar una instrucción al código (en un bucle (For/while etc)) para que detecte que he presionado una tecla (space) o el ratón y pare momentaneamente el programa, hasta que vuelva a apretar el ratón.
    Cuando este bucle está corriendo, los botones que modifican el código, no funcionan y solo están disponibles cuando este cesa

    Gracias

    1. Javier Rodriguez

      Hola Pablo,
      Estás cometiendo un error de concepto (muy probablemente fruto de tu anterior experiencia con Basic). A diferencia de la programación Procedural, en la que tienes un punto de partida, uno de final y lo que ocurre entre medias está contemplado por diferentes casos y/o bifurcaciones condicionales, en los programas modernos orientados a objetos y eventos es el usuario quien está en control. Tu programa simplemente espera y reacciona a las acciones realizadas por el usuario.
      En el caso que planteas, no precisas de un bucle para constatar si se ha pulsado una tecla o pulsado el ratón… simplemente has de añadir eventos sobre el objeto de ventana (en concreto MouseDown y KeyDown), y ejecutar el código que desees en cada caso. Incluso en el caso de la tecla, podrás reaccionar de distinto modo en el caso de que se haya pulsado una u otra… Si necesitas más información, no dudes en enviarme un correo electrónico! (Tienes los datos de contacto en el área “Acerca de mi”)

      1. Pablo

        Muchas Gracias, Javier. Me pondré a ello y ya te contaré

Deja un comentario

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