Xamarin Evolve 2013

不久前,Xamarin在德州Austin举办了第一次他们自己的程序员会议,但是因为各种原因我没法现场参加。而且由于时差的问题,也错过了keynote和很多session的现场直播。

今天,Xamarin终于把第一天的keynote发布了出来。在keynote里,介绍了Xamarin从成立到现在的一些有趣的故事,进军移动领域的原因,他们CTO Miguel是如何从Linux粉转向果粉的,Xamrin 2.0的介绍,F#和Async开始beta测试,新的内嵌iOS designer,以及新产品Xamarin Test Cloud。Keynote地址在这里:Xamarin Evolve 2013

重点提下Xamarin Test Cloud,这是一套自动化UI测试(Automated UI Testing)框架。因为在iOS有几个版本,还有几个不同的设备,测试会变得很繁琐。在Android平台上这个情况更加严重,不仅版本众多而且还有两三千种不同的设备。面对这么繁多的设备,在所有真机上测试你的程序变得几乎不可能。在我实际Android开发的时候就碰到过这种情况,说得夸张些就是几乎每增加一个测试的真机就会出现一个新的问题。而Xamarin Test Cloud正是想解决这个问题。目前提供他们web app,可以上传你的程序的apk(Android)或者ipa(iOS)文件,选择想要的机型然后开始测试。当然,除了web app,也有API可以嵌入到你自己的开发过程当中。

Xamarin Test Cloud

既然叫Automated UI Testing,手工点app上的各种按钮,填写各种文本框等等这类根本算不上自动化测试。Xamarin Test Cloud最令我激动的是提供了一套脚本来自动化这些测试,比如定义脚本来进行“打开app->输入用户名和密码->点击登录按钮”这样的一系列操作,然后就可以在各个设备上看到跑这个脚本的情况,多少通过了,哪些有crash,crash的话就会有相应的log,哪些反应比较慢就会给出警告,非常方便和使用。最后提一点,Xamarin Test Cloud是适用于所有Android/iOS app的,并不仅限于用Xamarin写的app。

除了keynote,会议的session部分也即将上线,非常期待。一些有意思的session更新后,我会在这里及时更新。

MonoDroid.TimesSquare发布

之前看到Square发布了一个在Android上选择日期的widget,觉得挺不错的就想着把这个小项目移植到Mono for Android上。经过一段时间的开发,算完工了。代码库放在了GitHub上。

用法

CalendarPickerView作为custom view嵌入到layout里,像这样:

<monodroid.timessquare.CalendarPickerView
    android:id="@+id/calendar_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />

对于layout还想多说几句。因为这个控件占用比较多的控件,所以最好给足空间。在屏幕小的设备上最好用对话框、全屏的fragment或者单独一个activity。屏幕够大的话倒是不推荐全屏显示,用一个fragment或者对话框就行了。

接着在activity/dialog里的 OnCreate 方法中或者fragment里的OnCreateView方法中,需要用一段有效的日期和当前选择的日期来实例化这个控件。比如像这样:

using Java.Util;
...

var nextYear = Calendar.Instance;
nextYear.Add (CalendarField.Year, 1);

var calendar = FindViewById (Resource.Id.calendar_view);
calendar.Init (new Date (), new Date (), nextYear.Time);

然后就可以用calendar.SelectedDate来得到所选择的日期。

实现细节

Square当时是如何想到写android-times-square这个小项目的可以看这里

Android上,用Java Calendar类(MonoDroid里有这个类的绑定)来计算日期。我们曾经考虑过用别的第三方库来实现,不过还是觉得让我们的库越小越好。在layout上,我们就自己写了个ListView:每行代表一个月,对于每个月再分别计算尺寸啥的,这样可以加快滚动速度。

下载

这里下载最新版本,然后以library project加到你的程序里。

软件许可

使用Apache 2.0许可。其实这倒是让我稍微补了一补课的地方。

Xamarin 2.0

之前几个礼拜就收到邀请参与private beta的测试,今天,Xamarin终于发布了他们移动跨平台工具的新版本:Xamarin 2.0。这里略微的介绍下我比较感兴趣的新功能。

  1. 新的IDE:Xamarin Studio 
    Xamarin Studio的前身是MonoDevelop,一款用于在Linux/MacOS/Windows下写C#应用程序的IDE。新版本主要重新设计了UI,之前时不时会有问题的代码完成也有了巨大的改进以及全局搜索等等。官方blog里详细地介绍了这些改进是怎么来的。

    Xamarin Studio
    Xamarin Studio
  2. 在Visual Studio里开发iOS应用
    以前,这也是可行的,但是需要很多的弯路要走,也不是很稳定。这次官方总算加入了这个功能。他们的办法是通过网络与另一台Mac来传输编译调试所需要的信息。这个功能非常实用,因为Visual Studio是套非常强大而且完善的IDE,而且也还有另外一个杀手锏:ReShaper,能极大地增加开发效率。
  3. 新的价格
    新的版本也带来价格的变化。这次加入了有app体积限制的免费版本,降低了独立开发者和企业级的价格。不过对我来说,独立开发者这一档没有Visual Studio支持还是蛮令人扫兴的,毕竟VS上有ReShaper这个神器。

    Xamarin Pricing
    Xamarin Pricing

别的改进还有很多,比如多了个组件商店,可以下载(有的收费)一些组件拿来直接用,避免时间浪费在重复造轮子上。这里有篇非常详细的上手体验介绍,感兴趣的可以去看。

关于跨平台开发,势必会带来的一个问题就是,许多功能其实只是在不同环境/语言下的再实现,那这样的重复造轮子是否值得?或者说有没有这样一种工具或者语言能简化这部分的开发过程?

答案是有的。比如像PhoneGap这样,用你最喜欢的框架写个适合移动设备的web app,然后用各平台自带的浏览器控件包装一下。这样的好处就是只需要写一个web app就能在各个平台上跑,效果也都一样,开发时间又短,但显而易见的主要问题就是性能不好、依赖于当前平台浏览器控件所能支持的系统API以及需要实时在线。

为了解决这些问题,又有了类似像Titanium这类叫做hybrid app的新办法。就是提取出各个平台公共的UI控件以及API,再配合上web app,整合成一个app。好处就是相比之下性能会好一些,应用合适的数据存储方式后并不需要实时在线,但仍然运行起来不是很流畅,不能方便地调用系统API,所能提供的API也不全。

而Xamarin则走了一条不一样的路。上述两种方案的首要问题就是一个移动应用是否真的必须在每个平台上的设计和操作一模一样?他们认为,不需要,每个平台都有其独特的UI,比如像他们CTO Miguel在MIX11会上所示范的:Mono UI

既然如此,那不如在UI层上使用各个平台原生的控件,而业务逻辑层数据层则共用一套代码。这样既做到了拥抱各个平台原生UI的独特之处,又最大程度地共享代码加快开发效率。

此外,他们选择了C#这个非常强大又高效的语言,比如这些杀手级feature:LINQ, Lamda表达式,var匿名类型等(JAVA?!)。再通过P/Invoke实现每个平台上所有API的绑定。由于C#及其虚拟机CLI(Common Language Infrastructure,即.Net的核心部分)加入了ECMA标准,于是他们脱离微软自己实现了这些。当然也不用担心版权纠纷

那最后的性能到底如何呢?试试看像Bastion这样的游戏,或者iCircuit这样的跨平台应用,以及我最爱的云音乐软件Rdio就知道了。:)

所以,如果想要每个平台达到最好的用户体验又要最大程度地共享代码,Xamarin的这套移动开发平台可能是最好的选择。