今天要寫的內(nèi)容析孽,是在我之前的一篇文章 2016 年技術(shù)路徑 里已經(jīng)提到的內(nèi)容厂画,今天來詳細(xì)寫下對于一個 iOS 程序員來說,如何更快地入門 Xamarin.iOS 并進(jìn)行實(shí)際開發(fā)脱盲。
一闽烙、Xamarin 是什么
有時候官方對自己的介紹可能是最準(zhǔn)確的,但不一定是最容易讓人明白的捷泞。比如 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.
其實(shí)就一句話足删,Xamarin 可以讓你用 C# 開發(fā)跨平臺的手機(jī) APP。
它的原理是 Xamarin 團(tuán)隊(duì)用 C# 語言重寫了 iOS 和 Android 原生 API锁右,使得開發(fā)者可以通過相應(yīng)的 C# 代碼去調(diào)用原生平臺的 API失受,然后將 C# 代碼封裝之后直接編譯為二進(jìn)制文件,因此執(zhí)行效率也很高骡湖。而 C# 代碼之所以能夠在 Mac 上運(yùn)行贱纠,則離不開 Mono,這是一個開源的 .NET framework 跨平臺軟件响蕴,其具體實(shí)現(xiàn)原理我們今天不管谆焊,只需要知道安裝了 Mono 之后,C# 就可以在 Mac 上編譯運(yùn)行起來浦夷。
另外辖试,雖然官方宣稱他們重寫了 iOS 和 Android 的所有 API,任何 Objective-C 和 Java 可以實(shí)現(xiàn)的劈狐, Xamarin 都可以實(shí)現(xiàn)罐孝,但據(jù)我所知并非如此,比如我上次在 Xamarin.iOS 集成第三方庫 一文中提到的集成第三方原生 SDK 的時候肥缔,在實(shí)際調(diào)用中聽云 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 導(dǎo)致點(diǎn)擊 WebView 應(yīng)用會閃退莲兢,必現(xiàn),我嘗試了幾種方法無論如何都無法解決,后來意識到這是聽云 SDK 報錯只好求助于官方改艇,他們研究兩天之后給出了答案:
這個解釋與我在網(wǎng)上搜索的結(jié)果不謀而合收班,可見 Xamarin 確實(shí)沒有實(shí)現(xiàn) NSProxy 這個類。
背景知識介紹完畢谒兄,下面直接開始 Xamarin.iOS 的學(xué)習(xí)摔桦。
二、開發(fā) Xamarin.iOS 之前的準(zhǔn)備工作
首先是安裝開發(fā)工具承疲,這里官方提供了兩種:Xamarin Studio 和 Visual Studio for Mac Preview 版邻耕,我選擇安裝后者,在 下載地址 下載到 Visual Studio 安裝程序燕鸽,直接雙擊打開安裝即可兄世。
啟動安裝程序,勾選同意協(xié)議绵咱,會出現(xiàn) Checking network connectivity 界面碘饼,轉(zhuǎn)半天之后,會給你一堆錯誤悲伶,這才符合微軟一向的尿性艾恼。如下圖所示,提示你這個沒有安裝那個目錄缺少麸锉,總之就是安裝失敗钠绍,先去下載圖中所需的軟件才能安裝 Visual Studio for Mac,很好花沉。這是當(dāng)年在 Windows 上做軟件開發(fā)的標(biāo)配環(huán)節(jié)了柳爽,沒想到現(xiàn)在跑到 Mac 平臺還能被微軟追著虐,厲害了碱屁。
根據(jù)每個人電腦的情況磷脯,具體報錯可能不太一樣,或多或少娩脾,不過按照報錯界面的鏈接和提示下載安裝就行了赵誓,這里值得********注意********的是 android-ndk 文件并不能直接雙擊解壓,需要在終端里執(zhí)行兩條命令才能正確解壓柿赊,然后復(fù)制解壓的內(nèi)容到相應(yīng)的目錄俩功,如果沒有就創(chuàng)建。還有一點(diǎn)需要提示碰声,下載安卓 SDK 的時候盡量只下載一定需要的诡蜓,因?yàn)槟M器鏡像文件實(shí)在太大了,我當(dāng)時不知天高地厚把從 14 到 25 全都下載了胰挑,一共 130G 還要多的鏡像文件蔓罚,平均大概 4M/s 的速度下了一下午才差不多下完椿肩,請大家引以為戒。
chmod a+x android-ndk-r10e-darwin-x86_64.bin
./android-ndk-r10e-darwin-x86_64.bin
原來不想把文章寫得這樣又臭又長脚粟,但是沒辦法覆旱,不用這么多圖片和文字講不清楚。事實(shí)上核无,我自己在這個過程就放棄了 2 次,第 3 次才下決心全部搞清楚藕坯。不過后來我發(fā)現(xiàn)一個簡單的方法团南,因?yàn)槲覀冎婚_發(fā) Xamarin.iOS,所以安卓的 SDK 和 NDK 目錄完全不用管炼彪,只需要安裝 Xamarin.iOS 吐根,然后下載 Visual Studio 的離線版安裝包即可,完全不影響調(diào)用模擬器和進(jìn)行真機(jī)調(diào)試辐马,親測有效拷橘。
三、Xamarin.iOS 之 Hello World
通過前面兩節(jié)已經(jīng)基本把 Xamarin 的來龍去脈和開發(fā)環(huán)境搞定了喜爷,下面我們動手來做個 Xamarin.iOS 的 上手程序冗疮。
打開 Visual Studio, CMD + Shift + N 新建一個 iOS 的 Master-Detail 應(yīng)用檩帐,點(diǎn)擊下一步术幔,輸入應(yīng)用名稱;
點(diǎn)擊下一步湃密,勾選相關(guān)選項(xiàng)诅挑,跟在 Xcode 里面新建 iOS 應(yīng)用差不多;
點(diǎn)擊創(chuàng)建泛源,可以看到新建完成的項(xiàng)目目錄拔妥;
然后選擇相應(yīng)的模擬器,在點(diǎn)擊左上角運(yùn)行按鈕达箍,稍等片刻即可看到應(yīng)用的運(yùn)行界面没龙;
這是一個類似 iPhone 自帶的聯(lián)系人和鬧鐘界面,點(diǎn)擊右上角加號可添加一個 item幻梯,點(diǎn)擊左上角Edit可以刪除一個 item兜畸,所以無論是從界面還是操作來看,與原生應(yīng)用基本沒有區(qū)別碘梢。
四咬摇、小結(jié)
通過以上的內(nèi)容,基本可以對 Xamarin 這個東西有個基本的了解煞躬,如果想要深入學(xué)習(xí)的話肛鹏,目前來說只能去 Xamarin 官網(wǎng)的開發(fā)者中心了逸邦,基本全英文文檔,而且開發(fā)過程中遇到的很多問題在扰,你用百度搜索會發(fā)現(xiàn)中文的資料相當(dāng)少缕减,基本都是一個入門或者介紹,而且都比較老了芒珠。過去的一年 Xamarin 也算大發(fā)展了桥狡,完全打通了在 Mac 上開發(fā)的屏障,基本可以做到與原生開發(fā)類似的體驗(yàn):比如在模擬器上運(yùn)行皱卓,斷點(diǎn)調(diào)試程序裹芝,連接真機(jī)測試,包括證書娜汁、設(shè)備嫂易、App ID和描述文件都跟 Xcode 差不多,做過 iOS 開發(fā)的人很容易上手掐禁,推送的話我公司的項(xiàng)目用的是極光推送怜械,效果也還行。
想來想去傅事,最大的差距大概就是開發(fā)體驗(yàn)了缕允,做過 iOS 的人都應(yīng)該知道,蘋果給開發(fā)者提供的開發(fā)生態(tài)太完善了享完,尤其是在接觸了安卓的小伙伴之后更覺得如此灼芭。關(guān)于 Xamarin 開發(fā) iOS 應(yīng)用中遇到的坑,最能描述的大概是歷史書上的一句話:
我們走了一些彎路般又。
雖然只有短短的幾個字彼绷,但是學(xué)過歷史的人都知道,這幾個字包含了多少心酸和無奈茴迁。同樣寄悯,現(xiàn)在做 Xamarin 的這一批人,他們所遇到的坑和折磨也不會少堕义。
以上所說猜旬,都是我做 Xamarin.iOS 項(xiàng)目幾個月來的心得體會,下面來做個關(guān)于 Xamarin.iOS 的總結(jié)吧倦卖。
- 學(xué)習(xí)途徑單一洒擦,基本純英文文檔,僅限官網(wǎng)怕膛;
- 使用第三方庫步驟繁瑣熟嫩,報錯無從查起,有的根本就無法轉(zhuǎn)換褐捻;
- 開發(fā)工具也不穩(wěn)定掸茅,iOS Designer 可用性太差椅邓,體驗(yàn)不夠友好(相對 Xcode);
- 控制臺報錯信息網(wǎng)上很少找到一樣的昧狮,有也僅限官方論壇和 Stack Overflow 上少量問題景馁,出錯你都不知道找誰解決,只能攤手逗鸣;
- 整個開發(fā)生態(tài)還很不完善合住,雖說 Xamarin 也發(fā)展了這么多年,但只能說還處在初級階段撒璧;
- 國內(nèi)使用 Xamarin 進(jìn)行移動端開發(fā)的公司少之又少聊疲,不排除抱著少招人的心態(tài),動員后端小伙伴搞這個沪悲,結(jié)果往往都是悲劇。
最后阱表,有一個常見的誤區(qū)殿如,有些人認(rèn)為既然 Xamarin 可以跨平臺那就只學(xué) Xamarin 就可以開發(fā) iOS 和安卓應(yīng)用了,借用一位長者的話來說最爬,Naive涉馁!跨平臺不意味著你在編程語言這塊打通了,但不意味著你可以不去學(xué)習(xí)其他平臺的特性爱致,所以僅僅指望 .NET 程序員們看幾篇官方文檔就能上手開發(fā) iOS 應(yīng)用烤送,這是想多了。且不說 Xamarin.iOS 的方法基本就是按照格式仿寫了 OC 的原生方法糠悯,iOS 系統(tǒng)的很多特性都不了解是寫不出來高質(zhì)量的程序的帮坚,甚至還得要求開發(fā)者掌握一些 OC 的語法,比如做 Binding 項(xiàng)目的時候互艾,不懂兩種語言和 OC 中靜態(tài)庫和動態(tài)庫的特性试和,就無法完成綁定和轉(zhuǎn)換,更別提調(diào)用了纫普。