2008-10-31 12 views
30

Me gustaría crear una aplicación que se ejecute tanto en Windows como en Mac OS X. También me gustaría utilizar para aprovechar lo mejor de la plataforma que ejecuta. con respecto a Frameworks, API, etc. ¿Hay alguna manera de hacerlo sin tener que escribir el código Objective-C y luego el código C#? He estado pensando en C++ como una alternativa, pero me preguntaba si había algo más. La aplicación estará basada en GUI (aunque no sé exactamente qué hará aún)Crear una aplicación multiplataforma para Windows, Mac OS X

-G.

Respuesta

49

Es bueno que esté pensando en la portabilidad desde el principio; es mucho más difícil "encenderlo" después de los hechos.

Existen varios kits multiplataforma disponibles, pero en mi humilde opinión, todos ellos son un poco insuficientes para proporcionar un aspecto "nativo" en todas las plataformas compatibles. En la Mac (lo que uso), los defensores de tales kits siempre quieren mencionar que están usando controles nativos. Ese es un buen comienzo, pero no es todo el viaje. Otros temas abordados por Apple's Human Interface Guidelines incluyen cómo los controles deben disponerse, cómo deben formularse etiquetas de los botones, lo que los accesos directos estándar se debe utilizar, etc.

Incluso Microsoft tuvo que learn the hard way sobre los peligros de tratar de escribir una multiplataforma GUI, con el desafortunado Word 6.0 para Mac.

En mi humilde opinión, un mejor enfoque es utilizar un diseño MVC, con la capa del modelo escrita en C++ portátil y estándar, y las capas de vista y controlador utilizando el kit de herramientas nativo para cada plataforma. Para la versión Mac, Carbon y C++ en general solían ser una opción interesante que ahora no es compatible, por lo que querría usar Cocoa, usando Objective-C en la vista y Objective-C++ en sus controladores para cerrar la brecha de idioma. Su versión de Windows también podría compilar su modelo como "C++ administrado" y usar cualquier lenguaje .NET para controladores y vistas.

+0

Esto lo dice todo. – jop

+9

Sugiero que se mantenga alejado de Carbon/C++ para la versión de Mac, ya que Apple no transfiere Carbon a 64 bits. Si bien eso podría no importar ahora, muestra que Cocoa/Objective-C es el futuro de la programación de Mac IMO. – Andy

+0

¿Tiene o conoce enlaces a ejemplos de proyectos escritos de esta manera? – GONeale

3

Para la GUI, examinaría SDL o QT.

Además, la salida mono http://mono-project.com/Main_Page

+2

SDL es una gran solución para juegos, ¿pero para una aplicación GUI? ¿Seriamente? –

+1

+1 por Qt. Sin embargo, sobre SDL. – jop

0

Mientras usted no está atado a las lenguas, parece que Java es un buen candidato. Emparéjalo con SWT para la GUI, y tendrás una aplicación nativa en cualquier sistema operativo que te guste.

+0

Excepto que los programas de Java son notoriamente "malos" en la Mac. Los cuadros de diálogo de archivos no funcionan como se esperaba, y todo se siente mal. (Y desarrollo en Java, al menos algunas veces!) –

+0

¿Incluso con SWT? Eso me parece extraño dado el número de desarrolladores que ejecutan Eclipse en Mac. –

+0

>> Los cuadros de diálogo de archivo no funcionan como se esperaba Eso se soluciona fácilmente, solo use java.awt.FileDialog en lugar de javax.swing.JFileChooser –

16

Eche un vistazo a Real Studio. Seriamente. Puede escribir una aplicación en Real Studio e implementarla en Windows, Mac OS X y Linux.

Editar: Real Studio es ahora Xojo.

+2

Me parece increíble que esta haya sido la única opción real para apuntar a los 3 varios años. – bruceatk

+0

No sabía que había una OO, versión actualizada de BASIC. ¡ORDENADO! – EndangeredMassa

2

Si es un desarrollador de Windows, use Qt o C# Winforms; si eres un desarrollador de Mac, puedes probar Cocotron (http://www.cocotron.org/), pero aún no está terminado al 100%, aunque se han enviado aplicaciones comerciales con él.

+0

Estoy considerando seriamente a Cocotron ahora también. Parece muy prometedor. –

6

wxWidgets es una biblioteca multiplataforma C++, que es una opción práctica. Pero estoy de acuerdo con Sherm: todas las bibliotecas multiplataforma crean una interfaz de usuario inferior a las aplicaciones nativas.

Cada sistema operativo tiene una semántica de UI diferente (órdenes de botones, etc.), por lo que si bien puede lograr una buena apariencia, conseguir la sensación en cada plataforma mediante una capa de vista es casi imposible.

Según lo que termine haciendo, es posible que encuentre una mejor interfaz web (por ejemplo, incruste un servidor web en su aplicación y sirva las páginas HTTP en un navegador). ¡Usted evita los problemas de L & F entonces!

Como alternativa, puede decidir que va a tener un L & F completamente no estándar, y optar por algo como wxWidgets o Tcl/Tk.

+0

Eso último es un gran punto. Para algunas aplicaciones "verticales" especializadas, la autoconsistencia puede ser más importante que la coherencia de la plataforma. –

+0

Si va a crear una aplicación web, omita el servidor web y use Adobe AIR –

+0

Si bien no me gustan las LAF no estándar, están bien, siempre que no sean feas ni terribles de usar. En mi humilde opinión wxWidgets y Tcl/Tk son feos y horribles de usar ... Cuidado con –

0

Estoy planeando hacer algo similar, y estoy considerando crear una aplicación de Windows C#/.NET y luego portarla a OS X usando Mono. Mi aplicación ya tiene una interfaz de usuario completamente diseñada (a excepción de la barra de título y los botones de esquina), por lo que las diferencias estéticas del sistema operativo no deberían afectarme demasiado.

No estoy seguro de lo que quiere decir al aprovechar lo mejor de cada plataforma en términos de marcos y API, y así sucesivamente. En general, escribir una aplicación multiplataforma significa escribir en un mínimo común denominador, y por lo tanto significa no sacando lo mejor de cada plataforma.

3

Si decides ir con C++, hay una serie de buenas bibliotecas de GUI multiplataforma que te permitirán evitar tener que duplicar el código de la GUI para cada plataforma. Por ejemplo:

Hay una serie de otros proyectos similares, pero esos son algunos de los mejores y más conocidos. Para el resto de su código, cualquier cosa específica del sistema, por supuesto, tendrá que escribirse utilizando un código C++ por separado para interactuar con las API de Win32 o la API del sistema de OS X cuando sea necesario. Dicho esto, es posible que pueda evitar gran parte del código específico del sistema mediante el uso de bibliotecas extensas como Boost.

Otras sugerencias serían cosas como usar un archivo de configuración en lugar del registro de Windows o un archivo plist en el mac. En lugar de eso, realice un análisis de enfoques independientes de la plataforma siempre que sea posible para minimizar los lugares en los que debe escribir código utilizando las API del sistema.

3

Debe utilizar las mejores herramientas disponibles para cada sistema operativo.

El código C/C++ puede separarse de la GUI y utilizarse en cada programa desarrollado por separado.

Antes de tomar una decisión, eche un vistazo a las aplicaciones multiplataforma que se han desarrollado con kits de herramientas portátiles como Qt o wxWidgets. En mi experiencia, nunca son tan pulidos como sus contrapartes nativas, especialmente en el mac.

4

Adobe Flex, con las bibliotecas de AIR, hace un buen trabajo al proporcionarle un entorno de desarrollo único y de alto nivel para este tipo de cosas. He escrito varias utilidades que las personas usan en ambas plataformas indistintamente.

También obtiene una portabilidad razonable para un navegador incluido, si eso le interesa. Pero creo que es una solución bastante buena sin considerar ese beneficio.

0

Me vienen a la mente Java o Mono. Algunas personas pueden argumentar que los kits de herramientas gráficas de Java no son lo mejor, pero parece ser, al menos para mí, la forma más fácil de portar su aplicación a varias plataformas y evitar dificultades de despliegue.

Mono, por otro lado, podría ser un poco más difícil de portar ya que tendría que escribir al menos la GUI dos veces si planea tener widgets nativos (winforms o GTK para Windows y CocoaSharp para Max) pero podría escribir el back-end una sola vez y desarrollar una interfaz para cada plataforma.

Como dije, los toolkits de la GUI de Java pueden no sentirse "nativos" dentro de OSX o incluso en Windows, pero ciertamente funcionan en ambas plataformas, puede usar Swing o AWT.

En cuanto a mono, puede usar GTK o Winforms para Windows y OSX pero todavía no se sentirán como nativos, pero puede usar CocoaSharp que son enlaces al marco de trabajo de Cocoa pero no estoy seguro del estado del proyecto (léase: soporte de funcionalidad)

0

I segundo Java. Está diseñado como una solución multiplataforma.

Otros han mencionado Adobe Air.

Similar a Adobe Air es Silverlight. Creo que es (o será) completamente multiplataforma.

1

También puedes ver fltk, wxWidgets es muy bueno & rica pero también muy grande ...

+0

Parece horrible en Mac. –

1

Como otros han mencionado es definitivamente es po Es posible crear una interfaz gráfica de usuario de plataforma cruzada en Java tanto en Windows como en Mac. Sin embargo, si desea que su aplicación se integre y se comporte de una manera que lo haga sentir como una aplicación diseñada desde cero para la plataforma en la que se ejecuta, realmente debe desarrollar la GUI y la experiencia del usuario para cada versión de la aplicación por separado.

Si analiza lo que su aplicación va a hacer y cree que hay una porción significativa de código/lógica que podría compartirse entre plataformas, escriba esa parte de manera portátil en un idioma disponible en ambos sistemas. C, C++, Java, Python, Ruby, etc. Si no hay una parte significativa, es decir, la mayor parte del código va a ser para la GUI, entonces hay menos razones para compartir cualquier código.

En el caso de que haya una porción significativa de código común, sugiero buscar en Python y Ruby como lenguajes de implementación ya que hay enlaces Cocoa para esos idiomas en la Mac y en Windows con el uso de IronPython e IronRuby. podría usar reutilizar ese código en una aplicación .Net también.

0

Los chicos de Magnetismo estudios tienen un buen write up on using Cocotron para construir un ejecutable de Windows con Xcode.

No tengo experiencia con Cocotron, pero si tuviera que escribir una aplicación de Windows -con un fondo de desarrollo de Mac- esto sería lo primero que intentaría.

2

gracias por todas sus respuestas. He estado investigando y jugando con WPF y CAnimation, etc. Parece que usar un modelo C/C++ y hacer la GUI individualmente para cada plataforma es la mejor manera de hacerlo. Gracias por toda tu ayuda.

4

Mi sugerencia, use Python. Python se integra con Objective-C y C# (IronPython). Solo evite muchas de las nuevas características del idioma y estará bien.

De acuerdo, no será fácil. Pero yo diría que no debería ser ser descuidadamente fácil. Se vuelve muy evidente cuando los diseñadores no toman en cuenta cómo funcionará su aplicación cuando se transfiere a otra plataforma.

0

Si elige el lenguaje C++, definitivamente recomendaría Qt para eso. Su aplicación se puede implementar en Windows y Mac según lo solicitado en el OP, pero también en Linux, y ahora, con la última versión en teléfonos inteligentes que utilizan iOs, Windows RT y Android.

Está bien documentado y muy activo en la web (incluso en SO).

El único punto negativo que veo es la herramienta de creador de Qt que, en mi humilde opinión, es menos fácil de usar que las herramientas históricas (como Visual Studio por ejemplo), pero no estás obligado a usarlo como IDE para el desarrollo de Qt.

0

Para completar, ahora vale la pena agregar Unity a la lista.

Sería muy difícil crear una aplicación de aspecto nativo para cualquiera de las plataformas y las herramientas de la GUI general están lejos de ser maduras. Pero no se trata solo de un motor de juego y puedes escribir en C#/Mono, usar un rango decente de libs y desplegar Win y OSX de forma bastante fácil.