我在去年(2013年)构建了一个大型应用程序,包含不同的组件:主要是API(ASP.NET Web API= > C#)、网站(ASP.NET MVC = > C# + AngularJS)和Android和iOS的应用程序(Xamarin.Android => C#,Xamarin.iOS => C#)。使用Xamarin的决定有其优点和缺点,但总体而言,我对此非常满意。
如上面的列表所示,几乎所有内容都是用C#完成的(好吧,网站主要是用JavaScript编写的;-))。这是一种成熟而优秀的语言,具有很好的特性(如LINQ)。在我的情况下,显然:我不必学习和精通四种语言(Swift/Objective-C、Java、C#、JavaScript),而只需要两种:C#和JavaScript。
这在代码共享方面尤为重要:由于某些离线功能需要大量同步逻辑,我们的客户端应用程序并不是真正的轻客户端,因此两个应用程序的UI部分只是其中的一面。结果证明,我确实可以在iOS和Android上同时使用90%的非界面代码。这是一个非常巨大的优势,因为这不仅涉及到Swift/Objective-C或Java的某些语言原始性,还涉及到您在iOS和Android上使用的不同框架。将.NET Framework/Mono用作每个Xamarin应用程序的基础,可以让您从底层操作系统中抽象出像数据访问或网络通信等事物。
在速度和UI方面,您没有任何劣势,因为您使用原生API 1:1。iOS或Android上可用的所有内容都通过Xamarin提供。例如,当Apple推出新版本的iOS时,Xamarin将在几天内发布该更新,因此您无需等待即可使用Apple引入的新功能。
Xamarin在iOS上使用一种称为Ahead of Time Compiling的技术,因此您所编写的所有C#代码都会在部署到您的设备之前编译成本地iOS代码。这意味着在“本机”Objective-C应用程序和Xamarin应用程序之间执行的内容没有任何区别(除了一些微小的开销,我的经验是不值得一提的)。
在Android上,就像其他“本地”安卓应用程序一样,使用即时编译。
这意味着您拥有与Objective-C或Java相同的精确API和可能性。您甚至可以使用相同的对象来构建具有完全相同类型和名称(有时稍微优化)的用户界面。因此,如果您想要为应用程序提供选项卡栏导航,则可以使用UITabBarController。参见iOS与Xamarin的比较。
在使用Xamarin多年后,我只遇到了一个缺点:
可能会出现内存泄漏问题。他们所有的示例都是关于防止内存泄漏方面的基本内容,但质量很差。如果您正在处理像应用程序中的媒体文件等“昂贵的资源”,则应该从第一天开始注意内存管理。当我的一个应用程序已经发展到35个不同的(复杂的)对话框时,我必须处理掉所有的问题。这花费了我将近两个月的时间,或者换句话说花费了成千上万的美元。他们提供了一些文档关于内存管理的最佳实践,但是工具在这方面很差。错误可能会出现,并且很难找到(例如)。
但总体而言,选择使用Xamarin是我做过的最好的决定之一。