Xamarin是一套跨平台解决方案,目的是使用C#语言创造原生的iOS,Android,Mac和Windows应用。
Xamarin的三个优势:
说白了,Xamarin宣称的最大的优势就是在三个平台上使用同一种语言来共享代码,总体说来有三种技术实现:
#if __ANDROID__
等条件编译符来指定哪一部分会编译输出到特定平台中。工欲善其事,必先利其器。Xamarin的安装过程参考简书上的一篇文章,内容很齐全很详细:http://www.jianshu.com/p/c67c14b3110c
由于墙的原因,从官网下载的安装包无法直接安装,可以通过安装包中解析出配置文件,从中获取下载路径:
Windows下载路径
Mac下载路径
Windows下的大体流程如下:
注意6和7的版本号很重要,必须要跟Mac端相匹配,跟破解补丁的版本也需要匹配。如果以后升级,通常只需要更新6和7就可以了。
关于Android模拟器,之前折腾过不少,最后推荐一款专用于游戏玩家的Andorid模拟器,海马玩模拟器,它的性能很好很流畅,不过游戏模拟器屏幕默认是横屏的,第一次要手动改成竖屏。
Mac下的大体流程:
如果只考虑用Mac开发iOS程序,不考虑在Mac下开发Android程序,那么大体流程如下:
需要注意三者之间的版本一一对应。
关于商业证书,Xamarin的价格是很昂贵的:
上面看到的价格只是针对单用户单设备平台,通常我们使用Xamarin都希望至少能用于Android和iOS两个平台,所以价格还得乘以2。
安装完毕后如果没有购买商业证书,那么可以按照上面那篇文章来破解试用,如果使用的版本号在3.11之前,那么只需要完成离线破解,IDE不需要登陆Xamarin账号,如果版本号在3.11之后,而且要编译iOS(目的是为了连接Mac端的BuildHost,如果是在Mac上开发编译iOS则不需要),那么还需要完成在线破解,具体破解流程文章里有,大体流程如下,最后提醒一下试用完了别忘了购买官方的商业授权。
程序的目录结构大致就可以参考这个图,最顶上一层表示三个特定平台的工程,第二层表示一个PCL或者SAP工程,通常也是Forms所在的工程,然后引用两个核心库Xamarin.Forms.Core和Xamarin.Forms.Xaml,然后特定平台的工程还要引用两个特定平台的库,这个特定平台的库可以让程序集使用特定平台的API。
Xamarin提供了很多学习用的Demo,地址是:https://developer.xamarin.com/samples-all/。不过官网的网速确实太慢,在GitHub上还有更多更全的Forms的Demo:https://github.com/xamarin/xamarin-forms-samples。
其中我认为几个比较重要的Demo可以学习一下:
Xamarin官方提供了一套很全的在线学习指南,地址是:https://developer.xamarin.com/guides/xamarin-forms/getting-started/,这份指南目录结构良好,便于快速查看,从怎样开始第一个程序到后面怎样到商城发布一应俱全。
还有一个学习途径就是官网教材,可以免费下载离线版:https://developer.xamarin.com/guides/xamarin-forms/creating-mobile-apps-xamarin-forms/,教材的随书Demo地址:https://github.com/xamarin/xamarin-forms-book-preview-2。这本教材支持Forms1.3以上,并且章节一直在保持更新,截至2016/02/25已发布到24章,Demo的核心库已更新到2.0并且加入了UWP工程。
如果说在线学习指南可以帮助你快速入门,那么这本教程可以帮助你更细化的理解Forms程序。
下面我将24章的官方教材的目录做个简单介绍,后面有时间也会对重要的几章做个更详尽的剖析:
其中我感觉有几章比较重要,如果对Xaml(WPF主要用的界面标记语言)开发不太熟悉的同事需要看一下这几章:
要对Forms的细节有深入理解看下面几章:
下面对第五章Dealing with Sizes稍作讲解,这章重点介绍了移动平台下尺寸相关的一些知识,先看下下面两个表格:
型号 | iPhone 2,3 | iPhone 4 | iPhone 5 | iPhone 6 | iPhone 6 Plus |
---|---|---|---|---|---|
像素尺寸 | 320x480 | 640x960 | 640x1136 | 750x1134 | 1080x1920 |
屏幕尺寸 | 3.5英寸 | 3.5英寸 | 4英寸 | 4.7英寸 | 5.5英寸 |
像素密度 | 165 DPI | 330 DPI | 326 DPI | 326 DPI | 401 DPI |
单位点包含像素数量 | 1 | 2 | 2 | 2 | 3 |
点数尺寸 | 320x480 | 320x480 | 320x568 | 375x667 | 414x736 |
每英寸包含点数量 | 165 | 165 | 163 | 163 | 154 |
屏幕类型 | WVGA | WXGA | 720P | 1080P |
---|---|---|---|---|
像素尺寸 | 480x800 | 768x1280 | 720x1280 | 1080x1920 |
缩放比例 | 1 | 1.6 | 1.5 | 2.25 |
DIUs尺寸 | 480x800 | 480x800 | 480x853 | 480x853 |
第一张图是iPhone下的一些尺寸元素间的关系,第二张是WinPhone的,这里没有给出Android的,其实Android整体上说来跟iPhone的那些参数很相似。
Forms中真正使用的不是像素,而是点数,点里面包含的像素数量是不一致的,像iPhone2,3基本上是一一对应,一个点包含一个像素,iPhone4,5,6就是两倍像素,iPhone6Plus就是三倍像素,所以iPhone的图片里出现@2x
,@3x
这些标识就是对应平台所使用的像素不同的图片。我们在Forms中使用的那些表示宽高的值就是这种点数单位,要知道设置的这些值可以获取整个页面的Width和Height值。
下面说下字号,Forms提供了几种枚举字号:Default,Micro,Small,Medium,Large,在不同的设备,不同的用户系统字号设置,不同的控件中,相同的枚举返回的字号数值可能都不一样。通过Device.GetNamedSize方法获取的FontSize值的单位是double,表示文本字符从最下面到最上面到高度,字体的宽度一般都是FontSize值的一半,字体的行距一般是FontSize值的1.2倍。
在Forms中设计各种元素布局等细节依然可以参考设计网页采用的盒模型的思想。从大的块元素的分离到小如一个文字,都可以想象成一个个小盒子。由内容区,内边距,边框,外边距组成。
Forms中还有几个比较容易混淆的类:ContentView,Frame,BoxView。
虽然可以按照盒模型的思想来布局元素,但是Forms中没有标准的margin的概念,Forms的做法是在一个内容视图外面再嵌套一个ContentView,ContentView继承自Layout,只多了一个Content属性来存放内容视图。此时,ContentView的Padding属性就可以想象成盒子的Margin。
Frame在布局中也比较常用,通常用于定义页面中一组视图的区块,它继承自ContentView,多了些边框、阴影等属性。
BoxView是一个矩形填充区,在Forms中用得最多的地方就是用它来绘制横线、竖线等分割线。虽然看起来很山寨,但它却是是Forms中的一个标准用法。
前面教程重点是介绍Xamarin.Forms相关的东西,对于平台特定的那些没有做介绍,比如平台和Forms之间的交互(依赖注入,前面的Demo介绍PPT有),比如最后APP的发布,发布相关的东西参考前面提到的在线教程:
我们项目中的Android安装包没有发布进商城,是通过网址直接下载,所以发布教程没有验证:https://developer.xamarin.com/guides/android/deployment,_testing,_and_metrics/publishing_an_application/
iOS需要发布,流程主要是有很多和apple打交道的地方比较麻烦,比如说开发者证书,AppStore证书,用特定的证书打包你的IPA,提交到itunesconnect,审核等等,Xamarin的教程如下:https://developer.xamarin.com/guides/ios/deployment,_testing,_and_metrics/app_distribution/
Xamarin有自己的组件商店,里面有很多免费和收费的组件,刚开始就在这上面找东西,不过网速实在不可恭维,后来发现免费插件这上面有的GitHub上几乎都有,所以使用GitHub又快又方便。
如果要在组件商店中下载需要注意最后一步需要,因为网站用了google提供的jquery库:https://components.xamarin.com/
GitHub上Xamarin提供的一个常用的免费插件目录,这个插件库里有Xamarin官方的也有第三方的。我们的项目所使用的插件大多来自这个目录,里面有插件的NuGet和GitHub地址: https://github.com/xamarin/plugins
GitHub上Xamarin官方插件库的源代码: https://github.com/jamesmontemagno/Xamarin.Plugins
在GitHub上使用“Xamarin.Forms”为关键词进行搜索,可以快速找到相关资源。
Forms中插件的使用也比较简单,基本上用一次就会了。首先,插件的使用方式都很统一,Forms的PCL中一般引用两个库,两个库都是PCL的,一个带Abstractions后缀,里面只定义了接口和实体,不包含逻辑代码;另一个不带Abstractions后缀,就像工厂一样,只负责创建Abstractions程序集里定义的那些接口的实现者,创建的方式不是使用前面提到的Xamarin提供的依赖注入( UsingDependencyService ),而是条件编译的方式直接New对应平台的实现者。在Andorid和iOS(或者WP)里引用了带Abstractions后缀的程序集,然后引用一个真正的属于该平台的程序集(非PCL,可以调用平台特殊API),这个程序集实现了Abstractions程序集里的接口,它的实例化对象在运行时被真正使用。如果我们自己写插件就可以使用Xamarin提供的依赖注入的方式,在特定平台内部写好功能类,然后在PCL中直接导出就可以使用了。
然后下面列出一些常用插件:
然后一些用得比较多的UI组件有:圆形图片、Checkbox、RadioButton、图片选择器等,有自己写的,也有在Xamarin-Forms-Labs的基础上改的。
Andorid使用插件时注意在工程的Properties的AndroidManifest.xml中写入对应的权限。
遇到疑难的问题,上Xamarin官方论坛搜索,大部分你遇到的问题上面应该都会有,基本用不着主动提问,这个地址我认为访问频率相当高,地址如下:http://forums.xamarin.com/
本教程没有涉及到GIS相关的内容。
没有对特定平台内部相关知识介绍,我们团队的成员对平台特定API都了解太少,特别是涉及UI方面的,要掌握这些知识的难度跟学习原生开发无异,所以对一些难题解决起来比较费力,比如之前的Android和iOS的Tab页样式差异问题(Android的Tab在屏幕上面,iOS的Tab在屏幕底部)。因为Tab属于页面,跟控件不一样,不能使用CustomRenderers的技术重写样式,在论坛上搜索的结果如下:
http://forums.xamarin.com/discussion/54668/bottom-tab-bar-menu-for-android
https://forums.xamarin.com/discussion/10004/tabs-on-the-bottom-for-android-example-code
http://forums.xamarin.com/discussion/56320/is-there-any-way-to-show-tabs-on-bottom-in-android-using-tabbedpagerenderer
主要意思先是从设计的角度强调不要进行这样通用的设计,如果一定是通用样式那么给出的解决方案也是平台内部的,首先不说技术门槛,这个实现方式跟Forms的思想就是有冲突的,所以最好的方案就是在新APP里用Forms纯手写Tab页面。
官方Demo:
https://developer.xamarin.com/samples-all/
https://github.com/xamarin/xamarin-forms-samples
官方程序安装地址:
https://static.xamarin.com/installer_assets/v3/Windows/Universal/InstallationManifest.xml
https://static.xamarin.com/installer_assets/v3/Mac/Universal/InstallationManifest.xml
windows下的ios模拟器
最新的版本信息查询地址:
https://developer.xamarin.com/releases/current/
一个博客提供的最新下载地址:
https://www.coderbusy.com/archives/256.html?from=groupmessage&isappinstalled=0
可根据以上版本号手动构造下载地址如下:
Win:
http://dl.google.com/android/ndk/android-ndk-r10e-windows-x86_64.exe
http://dl.google.com/android/installer_r24.4.1-windows.exe
http://download.xamarin.com/GTKforWindows/Windows/gtk-sharp-2.12.30.msi
https://dl.xamarin.com/XamarinforVisualStudio/Windows/Xamarin.VisualStudio_4.2.1.58.msi
http://download.xamarin.com/studio/Windows/XamarinStudio-5.10.3.26-0.msi
Mac:
http://download.xamarin.com/Installer/MonoForAndroid/jdk-7u71-macosx-x64.dmg
http://dl.google.com/android/android-sdk_r24.4.1-macosx.zip
http://dl.google.com/android/ndk/android-ndk-r10e-darwin-x86_64.bin
http://dl.xamarin.com/MonoFrameworkMDK/Macx86/MonoFramework-MDK-4.6.2.7.macos10.xamarin.universal.pkg
https://dl.xamarin.com/MonoDevelop/Mac/XamarinStudio-6.1.2.44.dmg
https://dl.xamarin.com/MonoTouch/Mac/xamarin.ios-10.2.1.5.pkg
http://dl.xamarin.com/MonoforAndroid/Mac/xamarin.android-7.0.2-37.pkg
http://dl.xamarin.com/XamarinforMac/Mac/xamarin.mac-2.10.0.113.pkg
官方文档:
https://developer.xamarin.com/guides/xamarin-forms/creating-mobile-apps-xamarin-forms/
官方教材:
https://developer.xamarin.com/guides/xamarin-forms/creating-mobile-apps-xamarin-forms/
https://github.com/xamarin/xamarin-forms-book-samples/
官方论坛:
http://forums.xamarin.com/
常用插件:
https://github.com/xamarin/plugins
https://github.com/jamesmontemagno/Xamarin.Plugins
https://components.xamarin.com/
https://github.com/XLabs/Xamarin-Forms-Labs
MvvmCross
https://github.com/MvvmCross/MvvmCross
https://github.com/MvvmCross/MvvmCross-Plugins
https://github.com/xamarin/xamarin-forms-samples
https://docs.microsoft.com/zh-cn/xamarin/xamarin-forms/user-interface/picker/populating-itemssource
https://docs.microsoft.com/zh-cn/xamarin/xamarin-forms/data-cloud/web-services/asmx
https://docs.microsoft.com/zh-cn/xamarin/cross-platform/samples/