2009-10-29 23 views
8

¿Cómo puedo usar el navegador como interfaz de usuario para una aplicación de escritorio? Las formas en que se me ocurrió hasta ahora son ...Uso del navegador para la interfaz de usuario de escritorio

  1. Usar todo HTML/Javascript. Problema: no se puede acceder al sistema de archivos o simplemente a cualquier otra cosa.
  2. Ejecute un servidor web local mientras la aplicación está en uso. Problema: ¿Cómo lo elimino cuando el usuario termina? Mis usuarios no son lo suficientemente técnicos como para Ctrl + C.
  3. Incruste un componente de navegador en una GUI normal. Problema: los componentes incrustados del navegador tienden a tener fallas en el mejor de los casos. El soporte para Javascript/CSS nunca es tan bueno como en un navegador real.
  4. ...?

La solución ideal funcionaría con cualquier tecnología. Sé que hay opciones como escribir extensiones de Firefox, pero quiero tener total libertad en la tecnología de back-end y la independencia del navegador.

+1

Es interesante que preguntes: estoy creando un complemento NPAPI (Firefox, Chrome) para descubrir "aplicaciones de escritorio" disponibles a través de HTTP. Se basa en Avahi mdns Service Discovery. – jldupont

+1

También abrí algunos "errores" en Chromium para ayudar a alcanzar este objetivo. – jldupont

Respuesta

2

En Windows, puede incrustar el control IE ActiveX, que utiliza el mismo motor de representación que IE. (Eso es un plus y un menos) Puede establecer la propiedad ScriptObject en su código de host y acceder a ella en Javascript como window.external para hacer cosas que Javascript no puede hacer.

Si ejecuta un servidor web local, puede tener un enlace de salida en la aplicación que elimina el websever.

+0

Lo que estoy teniendo problemas para averiguar es cómo escribir el enlace de matar. He encontrado una solución, pero es muy hacky. Los servidores que he intentado han sido Python, pero cualquier tipo de ejemplo concreto sería genial. –

+0

Y, por supuesto, existe el problema de que el usuario no puede hacer clic en el enlace de matar. –

+0

Si aloja un control WebBrowser, podría matar el servidor cuando la aplicación host salga.De lo contrario, podría eliminar el servidor un poco después de la última solicitud, y enviar latidos en sus páginas en caso de que el usuario lo deje solo por un tiempo. O bien, podrías dejarlo funcionando. – SLaks

1

No mencionaste el sistema operativo al que deberás dirigir. Pero es posible que pueda crear un servidor web con el programa statared, y luego abrir el navegador predeterminado. Espere hasta que el usuario finalice el navegador y luego cierre el servidor web.

Así, por ejemplo, en Windows, puede usar CreateProcess() para engendrar el proceso y luego MsgWaitForMultipleObjects() para esperar hasta que se termine de ejecutar.

+0

La independencia del sistema operativo también sería fabuloso, pero Windows es en lo que estoy trabajando. Parece que podría funcionar. El usuario aún puede dejar el navegador abierto y usarlo para explorar otros sitios, pero al menos sé * eventualmente * se cerrará. Sin embargo, puede haber un problema si el navegador decide abrir la aplicación en una nueva pestaña en lugar de en un nuevo navegador. Creo que Firefox hace esto incluso cuando se lo llama desde la línea de comando. –

+2

Si espera a que el navegador se cierre, nunca dejará de esperar. Recuerde que todos los navegadores modernos admiten pestañas, por lo que muchas personas, incluido yo mismo, ejecutamos un navegador 24/7. – SLaks

+1

Además, si el navegador ya se está ejecutando, ni siquiera tendrá un nuevo proceso para esperar. – SLaks

8

Tenga en cuenta que si elige ejecutar un servidor web local, está creando un riesgo de seguridad.

Cualquier página web que se ejecute en la misma máquina que conoce su aplicación puede enviar solicitudes a su servidor mediante Javascript, y usted no tiene una manera simple y confiable de saber de dónde viene la solicitud. (No confíe en el encabezado referer)

Google Desktop, que utiliza un enfoque similar, ha tenido varias vulnerabilidades en el mundo real que permiten que cualquier página web lea cualquier archivo en el disco.

Existen varias formas de protegerse contra esto; Recomendaría que se requiera que cada solicitud tenga una clave de autenticación que se genera aleatoriamente por máquina (y caduca en algún momento), que podría colocar en la fuente de las páginas reales. La protección XHR evitaría que los sitios web maliciosos lean la clave de autenticación, dejándolos sin poder.

+1

¿No se puede configurar el servidor local para que solo acepte solicitudes de la misma máquina en la que se está ejecutando? –

+0

Sí; Quise decir que Javascript en el mismo cliente podría enviar tales solicitudes. – SLaks

+1

Interesante .... –

1

Las aplicaciones HTML (HTA, por sus siglas en inglés) han existido por un tiempo. Puedes leer todo sobre ellos here. Básicamente son HTML y Javascript con algunas opciones adicionales para crear una ventana y con acceso al sistema de archivos local. Parecen ser exactamente lo que quieres. Es tecnología de Microsoft, por lo que esto solo funcionará con IE en sistemas Windows. Lo utilicé con éxito como interfaz para un CD-ROM que se utilizó para distribuir software a estudiantes de primer año

Otra opción sería utilizar Adobe Air. No estoy muy familiarizado con la tecnología, pero parece proporcionar un marco para implementar páginas web como aplicaciones de escritorio.No puedo publicar un segundo enlace como invitado, solo busque en Google y lo encontrará lo suficientemente pronto.

+0

En realidad, esto es exactamente lo que no quiero, porque "quiero tener total libertad en la tecnología de back-end y la independencia del navegador". –

4

Si está buscando un servidor web python con un enlace Kill, siempre puede marcar CherryPy.

import webbrowser 
import cherrypy 
import threading 

class MyApp: 
    """ Sample request handler class. """ 

    @cherrypy.expose 
    def index(self): 
     return """<html><head><title>An example application</title></head> 
<body> 
<h1>This is my sample application</h1> 
Put the content here... 
<hr> 
<a href="/exit">Quit</a> 
</body></html>""" 

    @cherrypy.expose 
    def exit(self): 
     raise SystemExit(0) 


class MyBGThread(threading.Thread): 
    def __init__(self): 
     threading.Thread.__init__(self) 
     self.start() 

    def run(self): 
     cherrypy.tree.mount(MyApp()) 
     cherrypy.quickstart() 

myThread = MyBGThread() 
webbrowser.open("http://127.0.0.1:8080") 

Este código se basa en la muestra de la SingleClickAndRun en el sitio web cherrypy: http://tools.cherrypy.org/wiki/SingleClickAndRun

Nota que en una aplicación web normal, es probable que utilice un motor de plantillas y plantillas de carga de métodos como la principal.

Algo que sería bueno sería incrustar un control de navegador en una ventana de GUI y cerrar el servidor cuando la aplicación se cierra.

Por la seguridad, posiblemente podría agregar un esquema de autenticación. Hay algunos que son compatibles con cherrypy, pero es posible que también implemente los suyos usando módulos de herramientas.

+0

Este es el tipo de cosas que estoy buscando. Gracias. –

4

Estoy buscando hacer exactamente lo mismo (aplicación de escritorio que utiliza un navegador HTML5/CSS3 actualizado como la GUI de la aplicación de escritorio), solo con Ruby (varias razones por las que decidí trabajar con Ruby). Es increíble la cantidad de bibliotecas multiplataforma que la gente ha creado. Sin embargo, pocos o ninguno han trabajado para que un navegador web sea la interfaz de usuario de la aplicación de escritorio. Problema de plataforma cruzada ... bueno, no voy a decir que se haya resuelto, pero diré varios pasos en la dirección correcta.

Para mí, esto sería perfecto con la aparición de los nuevos estándares HTML5/CSS3. Sé que se puede hacer con un servidor web ejecutándose localmente.

Otra forma podría ser cómo los chicos de "280 North" están haciendo lo que hacen. Desarrollaron Objective-J (una extensión de JavaScript regular que imita cómo Objective-C se extiende con regularidad C) y Cappuccino (el equivalente de Objective-J del trabajo de marco Cocoa de Objective-C en el MAC). También desarrollaron "Atlas", que es la versión 280 North del "Interface Builder" de Apple de Xcode, para sus frameworks Objective-J y Cappuccino para construir aplicaciones de Internet. Atlas es en realidad una aplicación web Cappuccino que se ejecuta en su escritorio como una aplicación de escritorio. En este caso, usan el Narwhal ... una plataforma multiplataforma, de propósito general, JavaScript para desarrollar aplicaciones JS fuera del navegador (básicamente un servidor web especializado).

Si alguien puede tener una idea para hacer el trabajo "Navegador, conexión directa a la aplicación de escritorio" sin la necesidad de un servidor web coexistente y manipular el FS local, yo estaría muy interesado ... Hmmm ... Ahora que lo pienso, me pregunto si el nuevo proyecto de Google Chrome "Native Client" se puede usar para hacer eso. NaCL es muy similar a Active X, excepto que no está limitado a una plataforma de Windows (pero estará limitado al navegador Google Chrome, al menos por ahora). Solo hay seguridad adicional a través de Sandboxing, pero puede manipular el FS local ... Cuanto más lo pienso, más estoy empezando a sospechar que se puede hacer.

¿Alguna idea?

Cuestiones relacionadas