寫給 iOS 程序員的 Xamarin 入門教程

今天要寫的內(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)行起來浦夷。

Mono 官網(wǎng)的介紹
Mono 官網(wǎng)的介紹

另外辖试,雖然官方宣稱他們重寫了 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 報錯只好求助于官方改艇,他們研究兩天之后給出了答案:


聽云官方最終的排查結(jié)果和解釋
聽云官方最終的排查結(jié)果和解釋

這個解釋與我在網(wǎng)上搜索的結(jié)果不謀而合收班,可見 Xamarin 確實(shí)沒有實(shí)現(xiàn) NSProxy 這個類。


我在網(wǎng)上搜索的結(jié)果
我在網(wǎng)上搜索的結(jié)果

GitHub 上面可以找到類似的問題
GitHub 上面可以找到類似的問題

背景知識介紹完畢谒兄,下面直接開始 Xamarin.iOS 的學(xué)習(xí)摔桦。

二、開發(fā) Xamarin.iOS 之前的準(zhǔn)備工作

首先是安裝開發(fā)工具承疲,這里官方提供了兩種:Xamarin Studio 和 Visual Studio for Mac Preview 版邻耕,我選擇安裝后者,在 下載地址 下載到 Visual Studio 安裝程序燕鸽,直接雙擊打開安裝即可兄世。

Xamarin Studio 的界面

Visual Studio for Mac 的界面

啟動安裝程序,勾選同意協(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

下載完成之后的文件列表
下載完成之后的文件列表
安卓 SDK&NDK 配置成功界面
安卓 SDK&NDK 配置成功界面

原來不想把文章寫得這樣又臭又長脚粟,但是沒辦法覆旱,不用這么多圖片和文字講不清楚。事實(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)用名稱;

輸入應(yīng)用名稱
輸入應(yīng)用名稱

點(diǎn)擊下一步湃密,勾選相關(guān)選項(xiàng)诅挑,跟在 Xcode 里面新建 iOS 應(yīng)用差不多;

勾選相關(guān)選項(xiàng)
勾選相關(guān)選項(xiàng)

點(diǎn)擊創(chuàng)建泛源,可以看到新建完成的項(xiàng)目目錄拔妥;

新建的項(xiàng)目目錄
新建的項(xiàng)目目錄

然后選擇相應(yīng)的模擬器,在點(diǎn)擊左上角運(yùn)行按鈕达箍,稍等片刻即可看到應(yīng)用的運(yùn)行界面没龙;

運(yùn)行之后的應(yīng)用界面
運(yùn)行之后的應(yīng)用界面

這是一個類似 iPhone 自帶的聯(lián)系人和鬧鐘界面,點(diǎn)擊右上角加號可添加一個 item幻梯,點(diǎn)擊左上角Edit可以刪除一個 item兜畸,所以無論是從界面還是操作來看,與原生應(yīng)用基本沒有區(qū)別碘梢。

應(yīng)用操作示意
應(yīng)用操作示意

四咬摇、小結(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é)吧倦卖。

  1. 學(xué)習(xí)途徑單一洒擦,基本純英文文檔,僅限官網(wǎng)怕膛;
  2. 使用第三方庫步驟繁瑣熟嫩,報錯無從查起,有的根本就無法轉(zhuǎn)換褐捻;
  3. 開發(fā)工具也不穩(wěn)定掸茅,iOS Designer 可用性太差椅邓,體驗(yàn)不夠友好(相對 Xcode);
  4. 控制臺報錯信息網(wǎng)上很少找到一樣的昧狮,有也僅限官方論壇和 Stack Overflow 上少量問題景馁,出錯你都不知道找誰解決,只能攤手逗鸣;
  5. 整個開發(fā)生態(tài)還很不完善合住,雖說 Xamarin 也發(fā)展了這么多年,但只能說還處在初級階段撒璧;
  6. 國內(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)用了纫普。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末阅悍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子昨稼,更是在濱河造成了極大的恐慌节视,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件假栓,死亡現(xiàn)場離奇詭異寻行,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)但指,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門寡痰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抗楔,“玉大人,你說我怎么就攤上這事拦坠×铮” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵贞滨,是天一觀的道長入热。 經(jīng)常有香客問我,道長晓铆,這世上最難降的妖魔是什么勺良? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮骄噪,結(jié)果婚禮上尚困,老公的妹妹穿的比我還像新娘。我一直安慰自己链蕊,他們只是感情好事甜,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著滔韵,像睡著了一般逻谦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上陪蜻,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天邦马,我揣著相機(jī)與錄音,去河邊找鬼宴卖。 笑死滋将,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的嘱腥。 我是一名探鬼主播耕渴,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼齿兔!你這毒婦竟也來了橱脸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤分苇,失蹤者是張志新(化名)和其女友劉穎添诉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體医寿,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡栏赴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了靖秩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片须眷。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡竖瘾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出花颗,到底是詐尸還是另有隱情捕传,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布扩劝,位于F島的核電站庸论,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏棒呛。R本人自食惡果不足惜聂示,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望簇秒。 院中可真熱鬧鱼喉,春花似錦、人聲如沸趋观。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拆内。三九已至,卻和暖如春宠默,著一層夾襖步出監(jiān)牢的瞬間麸恍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工搀矫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抹沪,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓瓤球,卻偏偏與公主長得像融欧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子卦羡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容