tendulkar-uvāca : Episode 2

In previous episode of tendulkar-uvāca, we’ve seen how we can setup our development environment using Visual Studio and Xamarin.
In this episode, we’re going to see how we can use emulators to test and debug our applications.

iOS simulators will get installed with XCode is installed.
For Android emulator, install Xamarin Android Player from here
Windows Phone emulators can be installed while installing Visual Studio 2013 Update 3.

Do let me know your feedback and suggestions.

Namaste
Mayur Tendulkar

Cross-Platform. Hybrid or Native?

Recently I had to build an app for our company (zevenseas) which can work across all the platforms i.e. Windows Phone, Windows 8, iOS (iPhone, iPad) and Android (Phone and Tablet). I started looking for various options like Titanium, Icenium, PhoneGap & Xamarin. Considering the options I had, I chose two best solutions Icenium and Xamarin. But like many, I was confused about which one to use & when, one being hybrid and other native. So, I used and tested both and here are my findings in this post.

Experimenting with Xamarin – A native solution

I started using Xamarin (build on top of Mono) since February 2013 and I’m loving it. Just think about writing apps for Android/iOS/Mac using the language that you’re using since years – C#. The best feature that I can see which Xamarin provides is one solution to build them all. Just think about having one solution, which has all the required projects & dependencies at one place. Everything in one IDE (Visual Studio), one solution and in one repository, built using one language. This is AWESOME. The other most important feature for me is Portable Class Libraries (PCL). Think about having your Data Access Layer, Business Logic Layer, Models, etc.… into PCL and then referring it into various different applications. Just create UI layers. 100% code re-use. Isn’t it? So, think about project structure like this:

image

Other awesome feature which I liked about Xamarin is, their releases aligned with release of .NET features, iOS and Android. You can use LINQ, Async/Await, PCL in your cross-platform project. One more thing to mention here, Xamarin provided support for iOS7 as soon as it got released. Pretty amazing.

The challenges with Xamarin

I can see some challenges with Xamarin & yes, those can be addressed. First one is third-party SDKs equivalents and controls. Recently Xamarin is coming up with their components-store and I’m waiting for few SDKs and components to appear in it. Perhaps, this can be a great opportunity for some folks to build and sell their components/controls. For example, I wanted to build mobile app to fetch data from SharePoint. For Windows Phone, there is SharePoint SDK for Windows Phone. Being lazy, I wanted that same SDK as Xamarin component. It is doable. No doubt. But if somebody can provide it to me, or provide solution to migrate these kind of SDKs to Xamarin I’ll be happy. (btw, Xamarin has something called scan my code which analyses the code and tells you how much of it can be reused across platforms).

Capture

In case of controls (like Telerik, Infragistics, ComponentOne, Mindscape and Syncfusion), it would be great if I can port/use existing controls (without reinventing the wheel) written in .NET; in my cross-platform solution. I know, it is going to take time, but still.

Second challenge that I found is if I want to build highly touch intensive app like which includes drawing/animations/etc…. manipulating that in C# can be difficult. Same can be achieved with existing JavaScript libraries in Icenium. Although there is MonoGame for game development, works just like Xamarin products and built on top of Mono.

Playing around Icenium – A hybrid solution

I have fair understanding of JavaScript/JQuery and have used JQuery Mobile to build mobile web-apps. So, getting used to Icenium was damn easy. The great thing I loved about Icenium is, I can use same code (UI, DAL, BAL, etc…) for all the platforms. Plus, I can run any simulator and test the app LIVE. When I say live means, just make a change in HTML/CSS/JS, save and the it affects the app in simulator. Too good. Plus these simulators are pretty fast. In case of Android emulator, if I start it, I can easily go for a walk, have a cup of tea and still emulator is booting-up on my machine. I’ve ‘one of the best machine’ – thanks to zevenseas.  (P.S. Xamarin has nothing to do with Android emulator. It uses Android’s native emulator i.e. AVD etc.…, which by default slow. You can try Intel HAXM & Intel Atom based Android images in this case)

image

Being hybrid app platform, I can use all existing JavaScript libraries including Jquery mobile, Kendo UI or what not. The list is endless. This is LEGEN—wait for it DARY… The challenge with Xamarin (third-party libraries) can be solved here. Other feature which I liked the most is, you can build the app and run or test it on Android or iOS device without developer account. It uses something called Icenium Ion. Because *i think* provisioning profiles is pathetic with Apple. Microsoft and Google are way better in this case. However, remember that at the end you need developer account to publish the app. You can delay this, but can’t skip.

image

The challenges with Icenium

I found some challenges when dealing with Icenium. First, if you already have your existing logic in C# (in case of Xamarin, PCL is the best solution), then porting it to hybrid app (JS) can be time consuming affair. You may need to re-write. But this re-write can help you to use that code across platforms. Second, the simulators are not active simulators and has some limitations. Which means, you can’t use hardware buttons like back/home/menu etc… on Android/iOS. Keyboard inputs work from real keyboard connected to development machine. You also can’t test most of the Cardova plug-ins.

Apart from these challenges, I found both Icenium and Xamarin good options to build cross-platform solutions. So, the question is when to use what?

  Icenium Xamarin
Use existing C# Knowledge and code
Incl. Async/Await, LINQ, PCL, etc…
 
Use existing JS knowledge and code
Inc. Jquery, JQMobile, KendoUI, etc…
 
Cross-Platform
(Windows Phone/8, Android/iOS/Mac/Desktop/XBOX)
Android & iOS

Edit: I just found that Icenium as IDE allows you to build apps for Android, iOS. However, the same code can be used to build for Blackberry and Windows Phone externally i.e. like using Visual Studio to build XAP (Windows Phone package). Using respective build process. Thanks to Lohith for pointing out my mistake.

When it comes to documentation and support, both of these solutions are good. Xamarin uses default .NET APIs which you already know. In case if you’re looking for platform specific API, while going through Xamarin docs, you can navigate to Apple or Android documentation. Basically, Xamarin has one-to-one API mappings/bindings (just for example, it may be different. I don’t know internals). So, it makes life easier. Icenium on the other hand, is all JavaScript. You may need to check with each JS library vendor for documentation. Support is good as both the solutions have active forums and twitter handles to ask questions.

I will not talk about performance. I haven’t built similar kind of application using these two solutions to check performance. Hence, I can’t comment on this point.

So far I’m loving both of these solutions to build cross-platform applications and I’ve my own reasons to choose right-one at right-time. Do you? Do let me know if you need any further information.

Namaste,

Mayur Tendulkar