写给 iOS 程序员的 Xamarin 入门教程

今天要写的内容,是在我之前的一篇文章 2016 年技术路径 里已经提到的内容,今天来详细写下对于一个 iOS 程序员来说,如何更快地入门 Xamarin.iOS 并进行实际开发。

一、Xamarin 是什么

有时候官方对自己的介绍可能是最准确的,但不一定是最容易让人明白的。比如 Xamarin 官方对自己的介绍:

Deliver native Android, iOS, and Windows apps, using existing skills, teams, and code.
Build native apps for multiple platforms on a shared C# codebase. Use the same IDE, language, and APIs everywhere.

其实就一句话,Xamarin 可以让你用 C# 开发跨平台的手机 APP。

它的原理是 Xamarin 团队用 C# 语言重写了 iOS 和 Android 原生 API,使得开发者可以通过相应的 C# 代码去调用原生平台的 API,然后将 C# 代码封装之后直接编译为二进制文件,因此执行效率也很高。而 C# 代码之所以能够在 Mac 上运行,则离不开 Mono,这是一个开源的 .NET framework 跨平台软件,其具体实现原理我们今天不管,只需要知道安装了 Mono 之后,C# 就可以在 Mac 上编译运行起来。

《写给 iOS 程序员的 Xamarin 入门教程》 Mono 官网的介绍

另外,虽然官方宣称他们重写了 iOS 和 Android 的所有 API,任何 Objective-C 和 Java 可以实现的, Xamarin 都可以实现,但据我所知并非如此,比如我上次在 Xamarin.iOS 集成第三方库 一文中提到的集成第三方原生 SDK 的时候,在实际调用中听云 SDK 就报错了:

[exception][03:03:21]The ObjectiveC class ‘_priv_NBSLensWebViewDelegate’ could not be registered, it does not seem to derive from any known ObjectiveC class (including NSObject).

这个 bug 导致点击 WebView 应用会闪退,必现,我尝试了几种方法无论如何都无法解决,后来意识到这是听云 SDK 报错只好求助于官方,他们研究两天之后给出了答案:

《写给 iOS 程序员的 Xamarin 入门教程》 听云官方最终的排查结果和解释

这个解释与我在网上搜索的结果不谋而合,可见 Xamarin 确实没有实现 NSProxy 这个类。

《写给 iOS 程序员的 Xamarin 入门教程》 我在网上搜索的结果

《写给 iOS 程序员的 Xamarin 入门教程》 GitHub 上面可以找到类似的问题

背景知识介绍完毕,下面直接开始 Xamarin.iOS 的学习。

二、开发 Xamarin.iOS 之前的准备工作

首先是安装开发工具,这里官方提供了两种:Xamarin Studio 和 Visual Studio for Mac Preview 版,我选择安装后者,在 下载地址 下载到 Visual Studio 安装程序,直接双击打开安装即可。

《写给 iOS 程序员的 Xamarin 入门教程》 Xamarin Studio 的界面

《写给 iOS 程序员的 Xamarin 入门教程》 Visual Studio for Mac 的界面

启动安装程序,勾选同意协议,会出现 Checking network connectivity 界面,转半天之后,会给你一堆错误,这才符合微软一向的尿性。如下图所示,提示你这个没有安装那个目录缺少,总之就是安装失败,先去下载图中所需的软件才能安装 Visual Studio for Mac,很好。这是当年在 Windows 上做软件开发的标配环节了,没想到现在跑到 Mac 平台还能被微软追着虐,厉害了。

《写给 iOS 程序员的 Xamarin 入门教程》 报错界面截图(一)

《写给 iOS 程序员的 Xamarin 入门教程》 报错界面截图(二)

根据每个人电脑的情况,具体报错可能不太一样,或多或少,不过按照报错界面的链接和提示下载安装就行了,这里值得********注意********的是 android-ndk 文件并不能直接双击解压,需要在终端里执行两条命令才能正确解压,然后复制解压的内容到相应的目录,如果没有就创建。还有一点需要提示,下载安卓 SDK 的时候尽量只下载一定需要的,因为模拟器镜像文件实在太大了,我当时不知天高地厚把从 14 到 25 全都下载了,一共 130G 还要多的镜像文件,平均大概 4M/s 的速度下了一下午才差不多下完,请大家引以为戒。

chmod a+x android-ndk-r10e-darwin-x86_64.bin

./android-ndk-r10e-darwin-x86_64.bin

《写给 iOS 程序员的 Xamarin 入门教程》 下载完成之后的文件列表
《写给 iOS 程序员的 Xamarin 入门教程》 安卓 SDK&NDK 配置成功界面

原来不想把文章写得这样又臭又长,但是没办法,不用这么多图片和文字讲不清楚。事实上,我自己在这个过程就放弃了 2 次,第 3 次才下决心全部搞清楚。不过后来我发现一个简单的方法,因为我们只开发 Xamarin.iOS,所以安卓的 SDK 和 NDK 目录完全不用管,只需要安装 Xamarin.iOS ,然后下载 Visual Studio 的离线版安装包即可,完全不影响调用模拟器和进行真机调试,亲测有效。

三、Xamarin.iOS 之 Hello World

通过前面两节已经基本把 Xamarin 的来龙去脉和开发环境搞定了,下面我们动手来做个 Xamarin.iOS 的 上手程序。

《写给 iOS 程序员的 Xamarin 入门教程》

打开 Visual Studio, CMD + Shift + N 新建一个 iOS 的 Master-Detail 应用,点击下一步,输入应用名称;

《写给 iOS 程序员的 Xamarin 入门教程》 输入应用名称

点击下一步,勾选相关选项,跟在 Xcode 里面新建 iOS 应用差不多;

《写给 iOS 程序员的 Xamarin 入门教程》 勾选相关选项

点击创建,可以看到新建完成的项目目录;

《写给 iOS 程序员的 Xamarin 入门教程》 新建的项目目录

然后选择相应的模拟器,在点击左上角运行按钮,稍等片刻即可看到应用的运行界面;

《写给 iOS 程序员的 Xamarin 入门教程》 运行之后的应用界面

这是一个类似 iPhone 自带的联系人和闹钟界面,点击右上角加号可添加一个 item,点击左上角Edit可以删除一个 item,所以无论是从界面还是操作来看,与原生应用基本没有区别。

《写给 iOS 程序员的 Xamarin 入门教程》 应用操作示意

四、小结

通过以上的内容,基本可以对 Xamarin 这个东西有个基本的了解,如果想要深入学习的话,目前来说只能去 Xamarin 官网的开发者中心了,基本全英文文档,而且开发过程中遇到的很多问题,你用百度搜索会发现中文的资料相当少,基本都是一个入门或者介绍,而且都比较老了。过去的一年 Xamarin 也算大发展了,完全打通了在 Mac 上开发的屏障,基本可以做到与原生开发类似的体验:比如在模拟器上运行,断点调试程序,连接真机测试,包括证书、设备、App ID和描述文件都跟 Xcode 差不多,做过 iOS 开发的人很容易上手,推送的话我公司的项目用的是极光推送,效果也还行。

想来想去,最大的差距大概就是开发体验了,做过 iOS 的人都应该知道,苹果给开发者提供的开发生态太完善了,尤其是在接触了安卓的小伙伴之后更觉得如此。关于 Xamarin 开发 iOS 应用中遇到的坑,最能描述的大概是历史书上的一句话:

我们走了一些弯路。

虽然只有短短的几个字,但是学过历史的人都知道,这几个字包含了多少心酸和无奈。同样,现在做 Xamarin 的这一批人,他们所遇到的坑和折磨也不会少。

以上所说,都是我做 Xamarin.iOS 项目几个月来的心得体会,下面来做个关于 Xamarin.iOS 的总结吧。

  1. 学习途径单一,基本纯英文文档,仅限官网;
  2. 使用第三方库步骤繁琐,报错无从查起,有的根本就无法转换;
  3. 开发工具也不稳定,iOS Designer 可用性太差,体验不够友好(相对 Xcode);
  4. 控制台报错信息网上很少找到一样的,有也仅限官方论坛和 Stack Overflow 上少量问题,出错你都不知道找谁解决,只能摊手;
  5. 整个开发生态还很不完善,虽说 Xamarin 也发展了这么多年,但只能说还处在初级阶段;
  6. 国内使用 Xamarin 进行移动端开发的公司少之又少,不排除抱着少招人的心态,动员后端小伙伴搞这个,结果往往都是悲剧。

最后,有一个常见的误区,有些人认为既然 Xamarin 可以跨平台那就只学 Xamarin 就可以开发 iOS 和安卓应用了,借用一位长者的话来说,Naive!跨平台不意味着你在编程语言这块打通了,但不意味着你可以不去学习其他平台的特性,所以仅仅指望 .NET 程序员们看几篇官方文档就能上手开发 iOS 应用,这是想多了。且不说 Xamarin.iOS 的方法基本就是按照格式仿写了 OC 的原生方法,iOS 系统的很多特性都不了解是写不出来高质量的程序的,甚至还得要求开发者掌握一些 OC 的语法,比如做 Binding 项目的时候,不懂两种语言和 OC 中静态库和动态库的特性,就无法完成绑定和转换,更别提调用了。

    原文作者:jimoruxue
    原文地址: https://www.jianshu.com/p/d8c507ad244a
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞