随着被微软收购,最近一年间,Xamarin的火爆程度与日俱增。免费、更好的VS2015集成、更好的模拟器,甚至,在windows上运行和调试iOS平台程序,让我这样接触了十几年.NET平台的老司机,即使工作中没有直接应用,也忍不住想要一探究竟。

搭建开发环境

工欲善其事,必先利其器。首先,我们需要一个完美的开发环境。要怎么才“完美”呢?我想至少要达到以下三点:

  • 完美的Visual Studio集成
  • 高效易用的Android和iOS模拟器
  • 可视化UI设计

安装Xamarin

Xamarin的Visual Studio插件,现在已经是VS2015各版本的一个可选组件,这方面的安装和集成不是问题。不过,一般VS的安装程序默认安装的都不是最新版本。要升级到最新版本,官方方案是下载那个Xamarin官网的在线安装程序;或者,也可以在已安装Xamarin插件的VS2015的Options/Xamarin/Others中进行升级。

然而,国内的网络环境几乎没法下载更新。变通的办法是,可以用Fiddler这样的工具,抓到Xamarin的安装升级程序企图下载的安装包的URL,然后,通过例如百度云等提供的离线下载功能来下载,然后手动在本地安装。

另一个问题是,上述插件装完,如果企图编译Android项目的,在国内环境,多半会遇到“m2repository目录中相关文件找不到”这样的错误,这是因为,在编译Android项目时,它会企图从google的网站下载这些m2repository的package,然后,国内网络认为并没有google这个网站,大家都懂的,FQ下载速度也不稳定,有时一个package就要几百M。baidu了好一阵,后来找到有某位同学share的一个手动安装包,可惜我不记得出处了,当时只是转存到自己的百度云了,如果,谁知道,请告知,我一定会追加注明。

这里是我的百度云上的一个share,包含了当前最新的Xamarin的Windows和MacOS相关的安装包,和包括上面提到的这个m2repository手动安装包:
http://pan.baidu.com/s/1o8GqgNS 密码:oeoa

Android模拟器

选择一:

Xamarin的VS插件本身包含了官方的Android SDK及其模拟器,不过,在windows平台上,想要较好的性能,模拟器必须配置使用x86核心的CPU,并且安装Intel® HAXM启用硬件虚拟化加速。

选择二:

Visual Studio 2015的安装程序,同时提供了一个基于Hyper-V的Visual Studio Emulator for Android,性能非常不错。不过,Hyper-V和Intel® HAXM不能同时启用。一旦启用Hyper-V,widnows会禁止其他app使用CPU的虚拟化加速功能。所以,只能二选一。

iOS模拟器

iOS模拟器可以在Windows上跑,但是,还是同时需要一台Mac机器,或者一个Mac虚拟机来进行真正的编译和背后的模拟器服务的运行。关于虚拟机安装,建议使用VMWARE,网上相关的文章不少,这里就不过多介绍了。不过,安装最新的Xcode8需要MacOS v10.11.6以上版本。目前最新版本的Xamarin iOS组件可以阉割运行于Xcode7(iOS项目的link选项不能选Don't link,否则无法运行),不过需要Xcode8才能完美运行所有功能。另外,因为开启了Hyper-V以后VMWARE里面不能跑x64的系统,而新版的OSX都只有x64版了,所以,实际上,还是必须关闭Hyper-V才能运行。所以,虽然我很喜欢Visual Studio Emulator for Android,也只能忍痛不用了。

一旦在MacOS中安装好Mono MDK和Xamarin ios组件,并打开MacOS的远程控制允许远程server进行ssh连接,就可以在VS2015中配置iOS模拟器了。配置成功以后,就可以在Xamarin的iOS项目中,指定部署到iOS模拟器了。不过默认情况下,iOS模拟器运行时是运行在MacOS端的,别急,可以安装下面这个iOS Simulator for Windows,让iOS模拟器的UI运行在Windows端。

可视化UI设计

Xamarin的UI设计,现在有两大类别,一类是如Xamarin Android/iOS这样,只能用于特定平台的UI。这类UI几乎是原生Android和iOS的简单封装,所以不具通用性,不过Xamarin本身就已经提供对其很好的可视化设计功能,但是这种UI无法跨平台共享相关的代码;另一类,也是真正能体现Xamarin跨平台价值的,就是基于Xamarin Forms和xaml的UI,这类UI设计可以真正的跨平台共享UI代码,但是,目前,Xamarin提供的Vasual Studio插件还不能进行很好的预览支持。幸好,有一些做得不错的第三方插件,评估了好几个后,觉得最好用的是Gorilla Player,这也是一个免费工具,不过并不开源。

Gorilla Player的运行效果如下,可以在编辑Xamarin Forms的xaml时,在多个device或者模拟器里实时预览UI效果:

至此,开发环境,基本搞定。

Xamarin开发框架的选择

语言和开发工具,是进行任何软件开发的基础。但是,没有好的框架,开发效率往往事倍功半。在决定一个框架之前,我过了一遍这本官方的教程Creating Mobile Apps with Xamarin.Forms Book First Edition,大概列一下面一些要点——如果我自己要设计一个Xamarin的架构,大概会怎么做呢?

  • 首先,我一定会选用Portable Class Library(PCL)类型的项目,来共享跨平台代码,包括UI代码;
  • 接着,我需要尽可能使用Mvvm模式,来管理UI组件的数据和事件绑定,并且简化UI层的单元测试;
  • 然后,UI设计必须基于xaml和Xamarin Forms,方便预览和隔离UI和后端代码;
  • 最后,为各种通用功能,比如,SplashPage,Audio Play,DB Access,我会做一些类库,这些类库应该包含PCL格式的共享代码,还应该包含各平台的特殊实现;

评估了一些现有的框架,发现数量不少,不过大多数都还在比较早期阶段,很少有基于Xamarin Forms的,尤其是基于xaml版的Forms。直到找到MvvmCross。他的较早版本也是不支持Xamarin Forms的,不过,现在已经有了MvvmCross-Forms,这个repo的Samples目录包含了很好的示例。

那么,MvvmCross和MvvmCross-Forms提供了哪些框架别的功呢?

  • 首先,它的名字都叫Mvvm了,当然,它的所有UI模块都是基于ViewModel的,它强制要求每个逻辑页面都必须有一个ViewModel,甚至连页面跳转时指定的也不是页面名字,而是ViewModel;
  • 当结合使用MvvmCross-Forms时,对应于每一个ViewModel,有一个xaml格式的标准Xamarin Forms页面,每个xaml默认绑定到对应的ViewModel;
  • 它提供了一个IoC容器实现,替代功能薄弱的Xamarin官方提供的DependencyService,支持Fluent形式的DI配置,更好的管理各种业务Model和Service;
  • 它的模版封装了Xamarin官方模版中一般存在于Shared项目的App.cs,提供了一个它自己的封装版本,实现更完善的DI功能;
  • 在每个Android、iOS项目中,它的模版提供了一个通用SplashScreen实现和一个Setup.cs文件,用于项目的初始化;
  • 它提供了一个很好的跨平台插件架构,已经有很多官方和社区提供的插件,也很容易添加各种跨平台的插件功能;

总体上说,它几乎完美符合我心目中的期望的所有功能,甚至超出预期。使用它的模版进行跨平台开发,在绝大多数情况下,只需要写ViewModel+xaml和对应的业务Model和Service,开发效率极大的得到提升。再结合前面提到的Gorilla Player的xaml多平台UI设计和实时预览功能。整个开发过程,想必是会非常舒畅的!

因为才刚玩了几天,还没深入了解MvvmCross的一些实现细节,上面的介绍,还是更多的停留在表面的功能上,也十分可能有所疏漏,欢迎批评指正。后续有时间会对MvvmCross的架构做一些更深入分析。

Update 1 (2016-10-14): 如何修复VS2015启动时的“XamarainShellPackage did not load correctly”错误?

在一台Win10机器上新装VS2015,并升级Xamarin for VisualStudio后,每次打开VS2015报“XamarainShellPackage did not load correctly”等package不能load错误。修复办法,在控制面板的添加删除程序中手动反安装Xamarin。然后,在VS2015安装程序中修复安装VS2015。最后,手动安装最新的Xamarin for VisualStudio msi安装包。打开VS2015就不再抱错了,新版的Xamarin开发工具也能正常运行了。

Update 2 (2016-10-16): 如何加速Android SDK Manager的下载和更新?

默认情况下,Android SDK Manager从https://dl-ssl.google.com下载所有的更新。但是dl-ssl.google.com在国内常年被墙无法访问,但非https的dl.google.com域名却没有被封,而且速度飞快。我们可以设置Android SDK Manager的选项,强制指定让它从dl.google.com下载所有的更新:

Update 3 (2016-10-24): 离线查看SDK文档的利器,Zeal和Dash,你必不可少的伙伴!

老司机学新平台 - Xamarin开发环境及开发框架初探的更多相关文章

  1. 老司机学新平台 - Xamarin开发之我的第一个MvvmCross跨平台插件:SimpleAudioPlayer

    大家好,老司机学Xamarin系列又来啦!上一篇MvvmCross插件精选文末提到,Xamarin平台下,一直没找到一个可用的跨平台AudioPlayer插件.那就自力更生,让我们就自己来写一个吧! ...

  2. 老司机学新平台 - Xamarin Forms开发框架二探 (Prism vs MvvmCross)

    在上一篇Xamarin开发环境及开发框架初探中,曾简单提到MvvmCross这个Xamarin下的开发框架.最近又评估了一些别的,发现老牌Mvvm框架Prism现在也支持Xamarin Forms了, ...

  3. 老司机学新平台 - Xamarin Forms开发框架之MvvmCross插件精选

    在前两篇老司机学Xamarin系列中,简单介绍了Xamarin开发环境的搭建以及Prism和MvvmCross这两个开发框架.不同的框架,往往不仅仅使用不同的架构风格,同时社区活跃度不同,各种功能模块 ...

  4. 老司机学Xamarin系列总目录

    Xamarin开发环境及开发框架初探 Xamarin Forms开发框架二探 (Prism vs MvvmCross) Xamarin Forms开发框架之MvvmCross插件精选 Xamarin开 ...

  5. 学习spring1--跟我一起学Spring 3(2)–开发环境配置

    http://www.importnew.com/13185.html#spring     首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 我要投稿 更多频道 » - 导航条 - 首页 所 ...

  6. 【Xamarin挖墙脚系列:Xamarin开发环境配置需求】

    原文:[Xamarin挖墙脚系列:Xamarin开发环境配置需求] 前言 因为操作的全是大块头,加大你们的内存,CPU网上飙.... 卤煮的机器配置  最近的版本部署包,百度云离线下载:版本:Xama ...

  7. Xamarin 开发环境搭建

    一.安装环境 打开 Visual Studio Installer,点击修改,然后勾选 "使用 .NET 的移动开发" 二.移动SDK SDK默认被放置在了E:\Program F ...

  8. C语言老司机学Python (五)

    今天看的是标准库概览. 操作系统接口: 用os模块实现. 针对文件和目录管理,还有个shutil模块可以用. 例句: import os os.getcwd() # 返回当前的工作目录 os.chdi ...

  9. JAVA学习(一):Java介绍及其平台、开发环境的配置与搭建

    Java介绍及其平台.开发环境的配置与搭建 1.Java的介绍 Java是一种面向对象的编程语言,具有跨平台.可移植.分布式.简单.可扩展等诸多特性.Java能够进行桌面应用.Web应用.分布式系统及 ...

随机推荐

  1. 3.View绘制分析笔记之onLayout

    上一篇文章我们了解了View的onMeasure,那么今天我们继续来学习Android View绘制三部曲的第二步,onLayout,布局. ViewRootImpl#performLayout pr ...

  2. js中的 || 与 && 运算符 的使用

    &&和||总是傻傻分不清,在这里详细记录一下吧.也给你们分享一下. 表达式a && 表达式b :  计算表达式(或者函数)a的运算结果, 如果为 True, 执行表达式 ...

  3. 分享篇——我的Java学习路线

    虽然之前我是开发出身,但是我学习的语言是Objective-c,这个语言使用起来范围比较窄,对于自动化学习来说也是无用武之地,所以我自己学习了Java,对于一个有开发经验的人来说学习一门新语言相对来说 ...

  4. 使用GizwitsOpenAPI,快速开发轻应用

    导读:使用机智云提供的Open API(Http / WebSocket),可以快速开发网页或微信应用等基于html的轻应用,用于管理和控制智能设备.机智云 Open API 主要帮助开发者通过 HT ...

  5. wpf 仿QQ图片查看器

    参考博客 WPF下的仿QQ图片查看器 wpf图片查看器,支持鼠标滚动缩放拖拽 实现效果 主要参考的WPF下的仿QQ图片查看器,原博主只给出了部分代码. 没有完成的部分 1.右下角缩略图是原图不是缩略图 ...

  6. iOS 之 SVN提交错误:"XXX" is scheduled for addition, but is missing

    今天使用SVN提交项目时,出现了这样的提示:"XXX" is scheduled for addition, but is missing.(无关紧要的东西用XXX代替). 看报错 ...

  7. backup

    1.垂直居中 2.敏捷开发,bug级别划分 3.bash构建,设计模式 4.git reset  revoke rebase 区别 vue -validator 规则 • required: 是否是必 ...

  8. JS操作Json

    因为我水啊 所以我就要手打一下 熟悉一下 ===== JSON 全称 JavaScript Object Notation(标记) 一种轻量级的数据交互格式,采用完全独立于语言的文本格式 同事JSON ...

  9. python实现简单爬虫功能

    在我们日常上网浏览网页的时候,经常会看到一些好看的图片,我们就希望把这些图片保存下载,或者用户用来做桌面壁纸,或者用来做设计的素材. 我们最常规的做法就是通过鼠标右键,选择另存为.但有些图片鼠标右键的 ...

  10. sequelize常见操作使用方法

    关于sequelize的准备工作这里不再赘述. 一.引入sequelize模块 var Sequelize = require('sequelize'); 二.连接数据库 var sequelize  ...