使用Xamarin实现跨平台移动应用开发(转载)
刚在朋友圈看到张善友,转发的一条分享“使用Xamarin实现跨平台移动应用开发”,写的确实很详细得体,从收费到开源,这段时间xamarin受到不少质疑,如此文http://blog.csdn.net/aofengdaxia/article/details/41891945/。当然这篇随笔也是转载的(如果不写成随笔,大伙可能看不到这篇文章)。希望那些已经入坑xamarin的开发者能有一个新的认识
原文链接:http://www.infoq.com/cn/articles/mobile-cross-platform-xamarin
原文作者:Adriana Blum
本文要点
- 对移动应用而言,跨平台开发方式降低了开发和维护的代价。
- Microsoft收购Xamarin,这使得那些专注于Microsoft技术的企业受益匪浅。
- 自从Xamarin加入到Visual Studio中之后,其使用日益广泛。当然,这也要归因于它目前是开源和免费的。
- Xamarin是“近乎原生”的。它将源代码编译为原生的iOS和Android。
- Xamarin.Forms、Test Cloud和Xamarin University使Xamarin平台对开发人员更具吸引力。
Xamarin曾是一种利基产品,售价昂贵。现在,它正逐渐成为一种广为使用的移动应用开发工具(参见链接给出幻灯片的第4张和第6张)。出于一些原因,Xamarin并不适用于某些类型的应用,其本身也存在着不少缺点。对此,本文将做详细的介绍。同时,Xamarin也是一种跨平台的开发工具。因此,我们还将在本文中权衡跨各种平台与原生开发上的一些优缺点。下面,我们首先简述Xamarin的推出及发展历史。
从Gnome、Mono到Ximian
Miguel de Icaza是Gnome项目的创始人,他同时也是一位开源项目冠军(Open Source Champion )。在他看来,要让开源项目得到大众的认可,必须使该项目与Microsoft、Novell等公司提供的商业软件毫无二致。出于此考虑,de Icaza于1999年开始和Nat Friedman合作。他们曾在1997年有过短暂的接触,那是在de Icaza的一次不成功的Microsoft面试期间。当时,de Icaza对Microsoft管理层指出,他们公司的软件应该走上开源之路。这次面试进展的并不顺利,但此后Friedman和de Icaza创立了Ximian项目,其中最主要的项目是Mono。Ximain于2003年被Novell收购,当时Novell正试图从Microsoft赢回它们日益萎缩的网络市场份额。此后,Novell于2011年被Attachmate收购,而Attachmate裁剪掉了Mono项目的大部分资源。
这在de Icaza和Friedman看来,无疑是一个机会。因此,他们着手创立了另一个初创项目,即Xamarin,针对开发用于移动应用开发的产品。他们的首个产品Xamarin.Mac在2012年发布,支持开发人员使用C#语言为Apple Mac编写应用并通过Apple Store销售。在2013年,他们发布了Xamarin 2.0,这款IDE产品的推出,使开发人员可以使用Microsoft Visual Studio开发用于iOS、Android和Windows的应用。但是该版本的一个主要缺点在于,Xamarin的许可费用在当时是非常昂贵的。
多年来,Microsfot一直关注着de Icaza的动向。在Microsoft看来,Xamarin就是公司真正需要的产品,因为Xamarin具有使用Visual Studio开发Android和iOS应用的能力。这样,Microsoft出手收购了Xamarin,并将Xamarin作为一种开源的IDE绑定到.NET中。这正是De Icaza多年前就希望Microsfot能去做的事情。
图1 Xamarin的发展历史(图片来源:Craig Dunn的幻灯片)
跨平台开发的案例
移动应用开发主要有三种方式:原生的、跨平台的和混合的。本文将不会介绍混合解决方案,因为这种解决方案通常无法达到原生的或真正跨平台开发的质量和稳健性。
图2 三种开发方式(图片来源:Matt Larson在Xamarin Experience伦敦2017大会上演讲幻灯片)
原生开发使用特定于设备平台的编程语言和API。例如在iOS上,使用的是Objective C或Swift。尽管使用这种方式,开发人员能推出最适用于设备的产品,但其中也存在着一些严重的问题:
- 需要开发人员熟悉平台语言和API。
- 增加了上市时间;
- 增大了维护代价。
在开发团队中问题
对于开发原生应用,可能至少需要维护两个团队。一个团队具备在iOS平台上的Swift/Objective C开发技能,另一个团队具备在Android上的Java开展技能。甚至很有可能还需要维护第三个团队,即具备Windows平台开发技能的团队。我们还需要确保团队能保持最新的技能,并且人员不会被其它公司挖走,因为当前对这些技能的需求量很大。如果使用跨平台的方法,并不能消除这个问题。但是该方法降低了开发人员入职所需的技能要求,问题得到了一定程度上的缓解。
在开发代码和测试代码时,如果需要维护多个基本上在做同一工作的团队,这最终将会对开发成本产生影响。
增加了上市时间
当公司中有多个不同的团队同时投身于应用开发时,可能上市的时间会更长,因为这时会有两个(或更多)的团队使用不同的语言在不同的平台上编写、测试和调试同一个应用,而不是基于一个通用的C#技术栈。如果使用了跨平台的方法,这将有助于缩短推出应用所需的时间。
增大了维护代价和复杂性
消费类电子产品企业出于维持自身客户群的考虑,喜欢不断地推出新款手机,并不断地对操作系统推陈出新。相应地,应用也需要做不断地升级和更新。这使应用开发团队忙于在新设备上测试应用、发布新版本和补丁程序。如果使用跨平台方式,那么我们可以在单个代码库上测试大部分或全部设备和更改。如果我们选择的是独立原生应用,那么维护工作和发布时间安排会更为复杂。在一开始开发时,如果我们创建了一个原生应用,那么时间和开销将保持增长。公司将需要维护一个更大规模的开发团队。
图3 特定于平台的开发方式(图片来源:Matt Larson在Xamarin Experience伦敦2017大会上演讲幻灯片)
Xamarin跨平台开发的优点
跨平台的开发方式具有很多优点,其中主要是减少了复杂性,从而降低了成本和工作量。尽管任一跨平台解决方案都能有助于消除重复劳动,并具有更好的可维护性,但Xamarin还提供了其它一些优点。下面列出其中部分优点:
- 提高了代码的可重用能力;
- 在很大程度上减少了测试工作;
- 精简了维护;
- 提供全面的Xamarin环境;
- 可在Xamarin Test Cloud提供的两千多台设备上做实地测试;
- 近乎原生的性能;
- 支持地理位置和使用iBeacon。
功能的一次性开发
在Xamarin中,有超过70%的代码可重用。这意味着,许多针对Android开发的功能,无需重写全部内容即可用于iOS。因此,开发人员一旦完成了针对某个环境的编码和测试阶段(无论是Android、iOS还是Windows),就可以将同一代码用于其它环境,并使影响最小化。相比于使用原生开发方法,应用可以更快地交付市场。
降低了测试时间和工作量
我们并非说要削减测试工作。无论应运行在何种设备上,无论选用何种开发方式,软件测试都是任一应用开发中的重要组成。但是,在一个操作系统(例如Android)上对大部分的功能测试和调试后,就会缩减在另一个操作系统(例如iOS)上的测试时间,因为部分功能已经在一个平台上得以验证并测试。这样,开发人员可以专注于一些特定于平台的事项。相比起让两个团队以串联方式工作于两个不同的系统上,这种方式无疑降低了测试时间和工作量。
Xamarin环境
Xamarin提供的IDE功能全面,开发人员可以在IDE中执行构建最终产品所需的每个任务。Xamarin最近推出了Xamarin.Forms,进一步简化了开发。但依然需要开发人员具有Xamarin经验,以决定是使用Forms,还是坚持使用传统的Xamarin开发。Xamarin官方推荐从Xamarin.Forms开始。
图4 Xamarin与Xamarin.Forms的对比(图片来源: Craig Dunn的幻灯片)
图5 Xamarin.Forms与Xamarin原生开发的对比(图片来源:Xamarin官方网站)
Xamarin还提供了线上的Xamarin University,有助于开发人员快速熟悉开发所需的各个领域。
访问Xamarin Test Cloud
Test Cloud提供了一种应用测试环境,支持开发人员在其中模拟真实世界情况对两千多种真实手机进行实地测试。Test Cloud并非免费的,但是对于受广大应用目标受众青睐的多种目标机型,使用Test Cloud无疑物有所值。此外,购买了Visual Studio Enterprise许可的组织,可以获得Test Cloud的25%折扣。
性能近乎原生
在跨平台方式和混合开发方式领域中,没有竞争者的表现可与Xamarin相匹敌。其中的原因在于,Xamarin将源代码编译成二进制对象,而许多竞争对手(例如Sencha和PhoneGap)仅在运行时编译。 在2015年,一位开发人员Harry Cheung在Android和Apple上做过一些对比测试。必须要承认的是,测试当时所用设备,现在看来完全过时了。这对于Xamarin而言尤其如此,特别是在iOS上。
图6 iOS平台上开发的应用性能对比(图片来源:Harry Cheung的Medium博客文章)
图7 Android平台上开发的应用性能对比(图片来源:Harry Cheung的Medium博客文章)
使用iBeacons和地理位置
如果用户需要在应用中使用Beacons和地理位置,那么Xamarin可以使用邻近设备(其中包括Beacons和地理位置),支持定位和物联网(IoT)。Xamarin与Estimote间有着良好的合作关系。Estimote制造设备,并提供可用于开发的Xamarin SDK。尽管用户并非一定要局限Estimote的设备,但是Estimote设备的确可以使生活更轻松,因为基于设备开发的应用可以通过iBeacons(或其它协议)接收现场信息,其中包括了IoT设备的报告和监控情况。
Xamarin是跨平台的,但是近乎原生
尽管上面我们已经介绍了跨平台开发的多个优点,但是在此我们还是要着重介绍Xamarin的一个亮点。Xamarin对于iOS和Android来说都是“近乎原生”的。为实现这一点,Xamarin采用的一个方法是支持直接从C#调用开发人员使用Objective C/Swift for iOS及Java for Android的所有API。原生开发人员可用的标准用户界面控件,也可以通过Xamarin访问。这样,一旦应用运行在设备上,就会给出正确的观感。
尽管使用C#可以实现几乎所有的 特性,但是其中可能依然需要少量的原生代码。对于一名经验丰富的Xamarin开发人员,这无疑是应用开发中的一种福利,因为他们可以根据自身过往的经验决定调用情况。
Xamarin的适用之处
Xamarin具有强健的后端架构,非常适合于开发企业应用,以及任何需要做大量后端开发的应用。虽然Xamarin在需要功能丰富的用户界面方面有一定局限性,但Xamarin仍然可以生成一些非常有吸引力的应用。在本文稍后,我们将会给出一些案例研究。
Xamarin的最大优势在于开发时间以及跨平台工作的效率上。由于竞争激烈,大多数移动应用项目都给出了一个最后期限,Xamarin开发人员的开发速度无疑占优。Xamarin的另一个优势在于它能使用Estimote SDK,集成Beacons和智能眼镜等物联网设备。
Xamarin是运作在Microsoft生态系统中的,这一事实对于企业来说也是一大优势。其中的大多数企业已对Visual Studio等产品做了投资,并且很可能拥有一个稳定的.NET开发团队。
Xamarin有不足之处
下面给出一些坏消息。在下列情况中,Xamarin并非最好的选择:
- UI界面复杂(B2C情况下);
- 大量的动画和图形(例如,游戏);
- 仍然需要一些原生编程的情况下;
- 当应用会发展成很大的规模时;
- 需要使用特定的开源软件库的情况下;
- 如果开发人员不愿意支付Xamarin的许可费用。
UI界面复杂
如果应用面向的是最终用户,并且需要提供丰富的前端功能,这时建议使用原生应用。Xamarin.Forms足以应对简单的用户界面,并可以受益于Xamarin优异的后端功能。但是面对需要复杂用户界面的应用时,Xamarin是无法与原生SDK相媲美的。这是因为iOS和Android的UI必须根据各自平台的观感分别进行设计和实现,最终可共享的应用代码将不足一半,达不到一般情况下的75%,或是近乎使用Forms时100%。这完全违背了我们使用Xamarin的初衷。因此,这时应使用Objective C或Java。
图形和动画
Xamarin也并非开发游戏应用的好选择。Xamarin不适用于需要强大图形或动画的应用。尽管如此,我们也不能完全排除使用Xamarin开发游戏。一个例子就是Bastion展示在iPad上的游戏。此外,Xamarin的最新发展将会使这一状况有所改观。
图8 Bastion展示在iPad上的游戏(图片来源:Jo Ann Buckner在Xamarin官方博客上的文章)
并非100%的解决方案
正如我们前面提到的,在一些情况下,要构建一个完整的解决方案,我们可能仍然需要编写少量的原生代码。这意味着,开发人员仍然需要一些原生技能,这会降低Xamarin提供的优势。
访问开源软件库上的限制
原生开发人员可以使用目标平台上所有可用的开源软件库。但是,Xamarin开发人员只能使用在Xamarin环境中的开源软件库,这通常数量更少。随着Xamarin的日益普及,预计在未来这个问题将会逐渐消失。正如NuGet的最新发展所示。
Xamarin应用的规模很大
Xamarin应用的规模会更大一些。开发人员可能需要做一些额外工作,去优化应用的大小。如果一个应用过大,安装将花费更多的时间,并可能在客户手机上引发存储和访问问题,这会导致用户考虑删除该应用。
Xamarin可能是免费的,但是Visual Studio并非免费的
由于Xamarin是捆绑在Visual Studio中的,开发人员会发现需要Visual Studio Professional或Enterprise版才能使用所需的功能。尽管入门级产品是免费的,当然其中也不会具备所有的特性。
Xamarin提供了标准许可和云许可,它们的价格可不便宜。下图显示了标准许可的报价,供读者参考。
图9 Xamarin许可报价(图片来源:Xamarin官方网站)
一些使用Xamarin的成功案例
下面我们选取了几个不同行业的公司作为案例。这些公司使用Xamarin取得了满意的效果。
Siemens PLM
图10 Siemens PLM应用示例(图片来源:Kyle Maxey发表在engineering.com上的文章)
Siemens PLM是由一些昂贵的工程软件组合成的庞大产品,在全球拥有超过9百万席位和7.7万名用户。Siemens希望能借助一款名为“Catchbook”的轻便移动绘图和CAD应用,进一步扩展公司的市场。在应用中,用户可以使用手指或触笔绘制形状。考虑到公司具备Microsoft的开发技能,却不具备iOS或Android的开发技能,因此Siemens选择了Xamarin。Xamarin提供的第一个优势,就是企业可以移植很多现有的代码。其次,企业避免了学习原生iOS和Android开发语言的麻烦,就能让75%的应用运行起来。
世界银行
图11 世界银行应用示例(图片来源:Ann Buckne发表在Xamarin官方博客上的文章)
世界银行有一个小开发团队,由8位开发人员组成。团队成员熟悉Visual Studio和C#开发,因此团队能够使用Xamarin快速提高生产力。他们开发的一个复杂的调查系统只针对Android设备应用。这是因为世界银行所面对的是发展中国家用户,Android系统他们主要选择的手机类型。
可口可乐装瓶公司
图12 可口可乐装瓶公司应用实例(图片来源: Lacey Butler发表在Xamarin官方博客上的文章)
在短短的四个月时间内,全球最大的可口可乐装瓶公司就将“MarketPlace”应用投入运行。与前面介绍的案例一样,公司拥有具备.Net和C#技能的工作人员,他们十分熟悉Visual Studio,这就是公司对使用Xamarin有兴趣的原因。公司引入了两名经验丰富的Xamarin开发人员来指导团队(顺便说一句,他们在团队合作中使用了Slack。Slack也是使用Xamarin的)。
社区评论情况
Xamarin由于其敏捷性,使得产品能够在最短的时间内运行起来,因此在一些移动应用开发公司中广受好评。下面给出在Clutch Review论坛中的一些评论。
“对于具有.NET和C#经验的开发人员而言,他们希望开发工具能集成Microsoft技术栈后端。Xamarin无疑是一种极好的工具。”
“通过与Xamarin的合作,我们已成功地交付了大量的移动应用。这些应用得到了我们客户的高度赞赏。例如,有一位客户希望仅用正常时间的一半就交付一个应用,因为该应用将在一个大型活动中展示。正是由于Xamarin允许我们无缝地共享代码,这使得我们能够在最后期限内完成任务。客户非常高兴。面对如此时间上的压力,使用Xamarin总是更具优势。”
“如前所述,Xamarin最大的问题是在涉及到需要高度自动化的图形或应用时,就会面临一些问题。”
结论
虽然Xamarin并非适用于任一移动应用,但它的确是公司在选择移动应用开发中的考虑对象。应用可能会相当复杂,正如上面给出的企业案例所示。在企业环境中,Xamarin中使用C#作为首选语言,这使得其在众多竞争对手中脱颖而出。自Microsoft收购Xamarin以来,市场也一直保持快速的增长。对于现有客户来说,这无疑是一个好消息。
图13 Xamarin的市场增长情况(图片来源:Matt Larson在Xamarin Experience伦敦2017大会上演讲幻灯片)
本文作者简介
Adriana Blum任移动应用开发公司Iflexion的高级技术架构师。她在管理和交付定制移动解决方案上,拥有13年以上的经验。她目前在帮助企业实现流程自动化、寻找新的发展机会,并创建可为企业带来高价值的应用。
查看英文原文: Mobile Cross-platform Development with Xamarin
使用Xamarin实现跨平台移动应用开发(转载)的更多相关文章
- C#移动跨平台开发(2)Xamarin移动跨平台解决方案是如何工作的?
概述 上一篇 C#移动跨平台开发(1)环境准备发布之后不久,无独有偶,微软宣布了开放.NET框架源代码并且会为Windows.Mac和Linux开发一个核心运行时(Core CLR),这也是开源的!I ...
- Xamarin移动跨平台解决方案是如何工作
Xamarin移动跨平台解决方案是如何工作的? 概述 上一篇 C#移动跨平台开发(1)环境准备发布之后不久,无独有偶,微软宣布了开放.NET框架源代码并且会为Windows.Mac和Linux开发一个 ...
- 与Xamarin.Forms跨平台的用户界面
Xamarin.Forms 与Xamarin.Forms跨平台的用户界面 Xamarin的. 形式是一个跨平台的UI工具包,它允许开发人员 轻松地创建本地用户界面布局,可以共享 在Android,iO ...
- [ionic开源项目教程] - 手把手教你使用移动跨平台开发框架Ionic开发一个新闻阅读APP
前言 这是一个系列文章,从环境搭建开始讲解,包括网络数据请求,将持续更新到项目完结.实战开发中遇到的各种问题的解决方案,也都将毫无保留的分享给大家. 关注订阅号:TongeBlog ,查看移动端跨平台 ...
- 【Xamarin 挖墙脚系列:IOS 开发界面的3种方式】
原文:[Xamarin 挖墙脚系列:IOS 开发界面的3种方式] xcode6进行三种基本的界面布局的方法,分别是手写UI,xib和storyboard.手写UI是最早进行UI界面布局的方法,优点是灵 ...
- 移动跨平台开发框架Ionic开发一个新闻阅读APP
移动跨平台开发框架Ionic开发一个新闻阅读APP 前言 这是一个系列文章,从环境搭建开始讲解,包括网络数据请求,将持续更新到项目完结.实战开发中遇到的各种问题的解决方案,也都将毫无保留的分享给大家. ...
- 使用Xamarin在Visual Studio中开发Android应用
原文:使用Xamarin在Visual Studio中开发Android应用 本文使用的环境是Windows 8 Visual Studio 2012.2 1.下载Xamarin http://xam ...
- Xamarin原生跨平台概述(精简概述,命中要害。PS:无图)
Xamarin原生跨平台:原生界面.原生性能.原生API(与H5比较): 1.C#可以访问Andrid.IOS原生API,也可以调用C#系统类型,如Syetem,System.IO;2.原理:基于Mo ...
- Unity3D ——强大的跨平台3D游戏开发工具(六)
第十一章 制作炮台的旋转 大家知道,炮台需要向四周不同的角度发射炮弹,这就需要我们将炮台设置成为会旋转的物体,接下来我们就一起制作一个会旋转的炮台. 第一步:给炮台的炮筒添加旋转函数. 给炮台的炮筒部 ...
随机推荐
- 在无人值守程序(服务)中调用Microsoft Graph
作者:陈希章 发表于 2017年5月31日 什么是无人值守程序(服务) 我在此前用了几篇文章分别介绍了在桌面应用程序(控制台),Web应用程序(ASP.NET MVC),以及PowerSehll脚本中 ...
- GPU版的tensorflow在windows上的安装时的错误解决方案
1.用vs编译cuda的sample时会提示找不到"d3dx9.h"."d3dx10.h"."d3dx11.h"头文件的错误,如果没有安装这 ...
- Java二维数组的概念和使用方法
二维数组 数组的数组---二维数组的每一个元素是一个一维数组 定义格式 数据类型[][] 数组名 = new 数据类型[二维数组的长度/包含的一维数组的个数][每个一维数组的长度]; int[][] ...
- 配置SQL Server on Linux(1)
1. 背景 SQL Server一般是在安装过程中进行相关的配置,安装完成之后,再去修改有一些配置就比较麻烦,比如更改SQL Server实例级别的排序规则.但在Linux下,安装过程并没有很多可以配 ...
- Intellijidea建javaWeb以及Servlet简单实现
一.创建并设置javaweb工程1.创建javaweb工程File --> New --> Project... 点击Project后出现如下界面,选择Java Enterprise,选中 ...
- [.Net跨平台]部署DTCMS到Jexus遇到的问题及解决思路--验证码
上一篇博客我们已经基本完成了部署工作,目前发现了验证码出现500错误,分析其代码,我们可以看到验证码使用的是System.Drawing命名空间下的类库, GDI+ 位图,这个在肯定是平台相关的,所以 ...
- 使用angularjs实现注册表单
本文是在学习angularjs过程中做的相应的练习 github地址 https://github.com/2016Messi/angularjs1.6-form 演示地址 https://2016m ...
- 【JS】数据类型
其他类型转化为boolean类型规则: number:非0为true,0和NaN为false: String:非空为true,空为false: Object:任何对象都为true 任何变量赋值为nul ...
- Kendo UI使用笔记
1.Grid中的列字段绑定模板字段方法参数传值字符串加双引号: 上图就是个典型的例子,openSendWin方法里Id,EmergencyTitle,EmergencyDetail 三个参数,后两个参 ...
- Windows as a Service(3)——使用SCCM管理Windows10更新
Hello 小伙伴们,这是这个系列的第三篇文章,我已经和大家分享了有关于Windows 10服务分支以及利用WSUS管理更新的方式,有兴趣的小伙伴们可以参考下面的链接: Windows as a Se ...