隨着被微軟收購,最近一年間,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這個網站,大家都懂的,翻牆下載速度也不穩定,有時一個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下載所有的更新: