frameworks choosing strategy for multi platform webapp - gwt

Issue
What is your strategy for building a desktop-like webapp that needs to be deployed to desktop web browsers and on mobile devices(Android, IPhone, etc)?
A course of action could be to firstly select the best framework for building the part that runs on computers(i.e. not mobile devices). Being a desktop-like app, a good candidate framework is GWT+ExtGWT since it provides:
Java-based development which is much scalable/solid than developing in Javascript via ExtJS for example
Good debugging
Good testability
Next, you'd want to deploy this app on mobile devices too. So how do you go from here? Write a separate implementation(separate from GWT) for Android, another one for iOS(in objective-c), another one for Windows Mobile, and so on?
Related
Related to above, I saw the presentation of PhoneGap which claims you develop in Javascript+HTML and it generates code for all mobile platforms: Android, iOS, etc.
However, PhoneGap is not an option since I don't think it integrates well with GWT and more important, it doesn't generate a native app which can take advantage of features like backgrounding, services, etc(see http://www.youtube.com/watch?v=xHXn3Kg2IQE for why native Android apps are much better than browser-based ones). There may be other frameworks like PhoneGap out there that I'm not aware of though but at this point I only see:
one implementation with GWT
one implementation for Android
one implementation for IPhone
and so on ...

If you are already planning on developing for multiple platforms, it is a good idea to at least consider cross platform frameworks like PhoneGap or Appcelerator. Beyond the fact that you are developing for multiple platforms there are a couple of other important questions to consider.
Do you want a web version as well?
Do you need intensive graphics support?
Do you have loads of money to target multiple platforms?
Do you have loads of time to target multiple platforms?
You also point out two more great questions to consider in debugging and testability. In terms of unit testing, any native platform is very difficult to unit test. Debugging is pretty easy for most native platforms.
Regarding PhoneGap, it is important to know a few things about it.
You can write PhoneGap plugins. A plugin is essentially native code for any given platform that can do pretty much anything you would want to do in native code -- background services, opengl, etc -- and make it accessible to JavaScript in the web view.
There are several open source projects that you might be very interested in such as GWT-PhoneGap, QUnit for JavaScript unit testing, and Weinre for Firebug like debugging.
Hope that helps!

Related

Trade-offs between native applications and cross-platform solutions on Android and iOS (iPhone/iPad)

I'm about to work on developing an application on tablets (Android/iPad).
Our clients ask us to make it cross platform unless there is any reason to stick to one.
I've looked at some posts related to cross-platform iOS/Android development here, but I'm still not sure if I should just develop a native application on a specific platform or I should try to make it cross-platform.
I'm new to developing applications on mobile devices.
If you can provide any advice/experience, that would be great!
As far as I know, for technical reasons, the trade-offs are as follows:
Native applications are faster, but it's not easy to reuse the codes on other platforms.
Cross-platform solutions using web-based applications (e.g. PhoneGap) have slower performance, limited access to OS and hardware APIs, web-like user interface.
Cross-platform solutions like Appcelerator Titanium compile the codes to native codes but I'm not sure about its limitation (if I have to change it back to native application after developing for three months, I'll cry!) and it costs money.
Also, for time/effort needed to develop a native application or cross-platform application on tablets, in general, is it easier and more reliable to develop/maintain a native application than a cross-platform solution?
Any suggestions?
Thanks in advance! :)
Personally I would stick with native apps. I'm working for a company that wants to create apps for multiple platforms as well and they have been looking for alternatives to native development, such as Titanium and PhoneGap. We've chosen for the following approach:
I've been hired to develop the iPhone app.
Some students for a University will probably work on the Android version, where the data framework / layer will look and work somewhat the same as my Objective-C code, e.g.:
-getFlightInfoWithId:forUserId: will become something like (void)getFlightInfo(flightId, userId) in Java.
The view and controller layers will probably differ in huge ways, mostly because Android and iOS devices have different GUI guidelines and capabilities (e.g. Android screen sizes can differ a lot, whereas on iOS there are only 2 real options).
For other smaller platforms we'll be offering a HTML5 app. To me native apps are always preferable to apps created with cross-platform toolsets as generally native apps should perform better, should have a better 'feeling' and might have some more capabilities, e.g. might be able to use some hardware features that are native to the platform and unavailable in a cross-platform toolset.
The bad news is that unless you're planning on writing a web, then you're going to have to write two versions.
The good news is that you can share the assets between them.
I guess you write could write large chunks of your iPad version in C, then compile it for Android via the NDK, but then there's all the UI stuff and so it's still gonna be two versions.

Reuse code in iPhone, Android and a Web applications

I'm about to develop an app for iPhone, Android, and for web too. I think there must be some "standard" way for doing this, in order to reuse as much code as possible.
Which is the best way for doing that? Webservices? (only if the app uses internet) Maybe an API? Another way?
Just for the record, the web application will probably be developed in Ruby On Rails 3.
Thanks!
There are a few cross platform development tools out there that let you write once and compile for multiple platforms. I know I've seen questions on both tool here on SO, so others might have some good advice on these specific products.
PhoneGap
http://www.phonegap.com/
Appcelerator
http://www.appcelerator.com/
Barring that, if you are looking at doing native development on each platform, the web services APIs are a good way to go. I've built an App that is heavily data driven, and I built out RESTful services over JSON that do the heavy lifting for the iPhone, Android and Web versions.
There still is quite a bit of work that goes into implementing a feature on each platform, but once I architect code on one platform the hard, creative work is done and it's just porting it to the next platform (Same applies, mostly, to the graphics as well). Since I am coding for each platform individually I do try to take advantage of both code and UI conventions for that platform to give the user a native experience (say building menus for the menu button on Android, something not supported on iPhone). To me that's a benefit of developing for each platform individually, however, it also greatly increases time to market for each version.
Since you're looking at Objective-C, Java and Ruby, 3 completely different languages, there's not an easy way to develop a shared library without using a intermediary layer like those linked above.
Well, all three are different languages, so anything you write for one won't work for the other. An API on a server may be able to get you the same data to all, but its highly unlikely that you'll get any reusable code. I'm doing the same thing, and realize that, so I am just sharing common things such as UI and code-design between them.

Cross Platform Apps

I am not much clear with the "Cross Platform Apps." Can we really built up some apps which can run on iPhone/iPad , Android Phones/Tabs , Blackberry , Nokia (Any platform or more than one platform at least) ?
I have heard something like WAC , Titanium but really not clear with all these. Please help me out.
There are some good frameworks out there to build cross-platform mobile applications:
Titanium: It is a framework to build Android, IPhone (and BlackBerry, still in beta it seems) using javascript, that will compile to native applications for the platforms specified.
Rhodes: A ruby framework, that supports almost all the mobile platforms out there (recently they added support to WP7). It has an MVC structure, and can use RhoSync to synchronize the data to a server side application.
PhoneGap: Another javascript framework, but it supports more platforms than Titanium, because it doesn't compile to native applications, but it embeds a web application inside a native application (web apps/web views are supported in each platform, so it's easier to handle the portability this way).
The apps will have access to the hardware, like the camera/gps, through some generic apis.
In some case you can build specific native module to integrate them in just one application platform if you need to.
These frameworks are useful to build cross-platform application writing just one application, without having to write each single application with the platforms sdks.
They have some (or many) limitations. If your application are simple enough you can consider using one of those framework. But for more complex ones, sometimes, if you target only a couple of plaforms, it could take less time to build each one with native sdks individually than using one of this cross-platform framework, because of their limitations (I highly prefer using the Android SDK than using Titanium).

Mobile App - Targeting iPhone, WP7, Android, and Blackberry

Is there a sane way to develop a cross platform Mobile app? We want these to be native apps on each platform, and not necessarily some kind of web page.
Currently we're thinking to split it into two languages:
C# backend (business logic)
--> Standard C# app for WP7
--> App built on MonoTouch for iPhone/iPad/etc.
Java backend (business logic)
--> Standard Android Java app (MonoDroid version of C# not ready
yet)
--> Standard Blackberry Java app
We could also develop initially in C# and use one of the conversion tools out there to get our C# converted into Java as a starting point.
Is there another approach? Our skillsets include mainly include a strong C# .Net background, and minor Java experience.
We don't really want to go low level and use something like C/C++ to get the job done. These are usually going to be simple LOB applications that communicate to some web service.
Side Question: how do game devs like the makers of Angry Birds do it?
UPDATE:
MonoDroid is now officially released. So it seems you would only need to use Java for the BlackBerry. We are considering not developing for BlackBerry at all, because developing for the other 3 platforms has been simplified. There is definitely some cost involved, as MonoTouch and MonoDroid are both $399 and you would also need a license for Visual Studio (this doesn't include cost for App store, etc.).
There's no good simple answer that I know of for all mobile platforms. You can use development environments like Appcelerator Titanium, which cross-compile to native code on various platforms (right now, for instance, I think Titanium supports iOS and Android, with plans for Blackberry). However, these usually have a limited API that you have access to, and you still end up needing to design different UIs for the different platforms (in my commercial work, I have never successfully used such a platform)
You could also design all the business logic in a web-services back end, and then just write "thin client" apps for each platform. This works, but of course requires network access when the end user wants to use your app. (Usually it'll be there, but sometimes may not)
Ultimately, I usually end up doing what you propose -- writing the basic business logic in a couple of different languages as generically as possible, and then bundling that in with custom UI/device code for each platform. Haven't found a better way myself....
(BTW, I believe games like Angry Birds are written largely in OpenGL and then loaded onto the OpenGL processor on each platform. But I could be mistaken...)
Those are some great answers. I agree, x-platform development is still very primitive. I'd like to add 2 points:
1) You do not need to write your backend in different languages. Choose one language (based on your comfort level, performance etc. criteria) and then connect from your platform-specific apps directly to the backend. If your backend is server-side code, one way of talking to it would be via XmlHttpClient. If it's a piece of native code common across various apps and is written in say C++, you can use JNI from Java and wrapper assembly from C#.
2) Another reason for avoiding x-platform tools is that you'd always need to wait for them to support the new APIs released by the platform vendor (Apple, Google, MSFT etc.). Once these companies release new APIs, the tools will need to be updated and only then will you be able to use the new APIs.
I don't think this is (easily) possible, if you're not using some HTML5 (jquerymobile etc.) in a WebView in your own app (looks like a real app, but still you will somehow see that it's not) instead of the normal browser. You can still use some native API from the device (accelerometer,...).
There are (commercial) platforms like Sybase Unwired Platform that help you in generating some client code. Afaik for Blackberry and Windows Mobile even some UI can be generated out of the business objects on the server. But to me it sounds that this might be too heavy-weight for your case.
Regards,
Martin

GWT as offline app, to be deployed onto an iPad

I often use GWT for web UIs. I have heard of it being used a fair bit in conjunction with Gears for offline solutions (probably nowadays HTML5 "offline storage" is all the rage) and I'd like to experiment with building a GUI in GWT and use it on my iPad. Tips/tutorials on how to deploy it onto the device to act as much as possible like a resident "App"? This is just a curiosity/experiment to fill a week-end... (I can "free" the iPad for the experiment if need be yet I am sure a lot can be done without doing so...)
phonegap(now Apache cordova) makes available the ios/android native features like camera,device file management,contacts,geolocation etc to our app.
GWT and mgwt :::
Using mgwt,gwt( both are opensource) and GwtPhonegap we can develop cross platform mobile applications which can behave exactly like native apps. in performance perspective these apps are bit slow when compared with native apps but the convenience is that the app can be installed in multiple platforms.
GwtPhonegap
GwtPhonegap acts like a bridge(provides abstraction) between device native functionalities and to our app. We can get good look and feel using css.
We have support for gwt-html5-database for which to perform cache storage.gwt-html5
Try using gwt in conjunction with phone gap. It will expose many of the native Apis to make them available for use in gwt.
https://code.google.com/p/gwt-phonegap/wiki/GettingStarted
Additionally I've had very good experiences using the m-gwt as a UI framework. MGWT makes creating native looking UIs using CSS+JS very easy.
http://www.m-gwt.com/