iOSer邁向前端一小步--OC/Swift與RN混編Demo

Demo簡(jiǎn)單流程就是:?

? ? ① 進(jìn)入原生代碼的首頁(yè)【一個(gè)按鈕(跳轉(zhuǎn)): 兩個(gè)輸出label(測(cè)試回調(diào)輸出)】

? ? ② 通過(guò)按鈕點(diǎn)擊進(jìn)入RN渲染UI頁(yè)【控制器原生管理,兩個(gè)按鈕(帶參數(shù)返回---如果修改index.ios.js中的代碼,則不一定是返回茅撞,也可能跳轉(zhuǎn)詳情請(qǐng)下載demo(index.ios.js文件中39-40注釋說(shuō)明);從原生拿參數(shù)再次渲染)颜阐,兩個(gè)輸出label(測(cè)試從原生拿到參數(shù)回調(diào)輸出)】

? ? ③ 點(diǎn)擊RN渲染的按鈕挖息,響應(yīng)兩個(gè)不同的事件

壓縮過(guò)有點(diǎn)模糊..


我是本篇文章的Demo代碼卑雁,請(qǐng)狠狠點(diǎn)我M厥邸?恪!


一础淤、準(zhǔn)備

混編之前請(qǐng)確保您的電腦必須安裝有以下兩個(gè)環(huán)境:

1. react-native

2. CocoaPods ?也許有很多剛玩的人說(shuō)不會(huì)安裝崭放? 解決1 ?解決2

terminal確認(rèn)是否成功安裝

如果已經(jīng)有工程,并且已經(jīng)使用CocoaPods值骇,只需要看以下注意的地方即可查看第二步莹菱。

需注意的地方:

OC項(xiàng)目中注意Podfile文件不要打開(kāi)# use_frameworks! 這個(gè)注釋?zhuān)?a target="_blank" rel="nofollow">區(qū)別:

use_frameworks! -> dynamic frameworks 方式 -> .framework

#use_frameworks! -> static libraries 方式 -> .a

否則編譯OC項(xiàng)目會(huì)出現(xiàn) RCTConvert.h yoga/Yoga.h file not found 而導(dǎo)致編譯失斠乒吱瘩;詳情請(qǐng)看

Swift項(xiàng)目 CocoaPods 要使用use_frameworks!解決辦法Swift解決編譯錯(cuò)誤(yoga/Yoga.h file not found)大概操作如下:

一迹缀、修改(存放ReactNative支持文件的地方)package.json文件中的"react-native": "0.42.3" (官方最新)使碾。 命令行cd到當(dāng)前目錄蜜徽,進(jìn)行npm install

二票摇、修改Podfile文件拘鞋,保存,命令行執(zhí)行pod update --no-repo-update矢门。

# react_path 是你react-native文件夾路徑盆色。

react_path = './RNUtil/node_modules/react-native'

yoga_path = File.join(react_path, 'ReactCommon/yoga')

pod 'React', :path => react_path, :subspecs => [

'Core',

'RCTText',

'RCTImage',

'RCTWebSocket', # needed for debugging

'RCTNetwork'

]

pod 'Yoga', :path => yoga_path

swift解決編譯錯(cuò)誤,重新打開(kāi)就可以成功編譯了

如果你沒(méi)有項(xiàng)目祟剔,完全是一個(gè)小白隔躲。那么很高興,跟著我從無(wú)到有物延!


? ? 1?? ?Xcode創(chuàng)建一個(gè)新的項(xiàng)目宣旱,命令行 cd 到你剛創(chuàng)建好的項(xiàng)目文件夾

? ? 2?? ?命令行 執(zhí)行: pod init ?后再執(zhí)行 pod install

? ? 3?? ?在你的項(xiàng)目文件夾新建一個(gè)管理RN支持文件的文件夾(RNUtil)

? ? 4?? ?進(jìn)入該文件夾(RNUtil),創(chuàng)建package.json文件叛薯。簡(jiǎn)書(shū)富文本編輯沒(méi)有代碼框浑吟,只能截圖。不想敲這代碼可以去我github下載demo代碼耗溜,去拷貝

package.json文件

? ? 5?? ?命令cd到RNUtil里组力,執(zhí)行npm install安裝react-native支持

? ? 6?? ?修改你項(xiàng)目文件夾中Podfile文件,添加React保存抖拴,命令行cd到項(xiàng)目文件夾執(zhí)行 pod update --no-repo-update 忿项,

這里有個(gè)注意點(diǎn):path路徑要對(duì)應(yīng)你項(xiàng)目文件中的react-native文件夾,就是npm install下載下來(lái)node_modules文件夾里城舞,還要記得要添加所有你需要的依賴轩触!舉例來(lái)說(shuō),元素如果不添加RCTText依賴就不能運(yùn)行家夺。

Podfile文件

? ? 7?? ?打開(kāi)文件脱柱,寫(xiě)代碼。(恭喜你拉馋,準(zhǔn)備完畢榨为,可以繼續(xù)打怪升級(jí)了!;蛙睢)

命令行操作1-5



二随闺、原生VC攜帶參數(shù)(字典)跳轉(zhuǎn)VC(view is RN)

注意事項(xiàng):iOS9中新增App Transport Security(簡(jiǎn)稱(chēng)ATS)特性,在iOS 9以上的系統(tǒng)中默認(rèn)網(wǎng)絡(luò)只能訪問(wèn)https協(xié)議的鏈接蔓腐,除非明確指明矩乐,否則應(yīng)用無(wú)法通過(guò)http協(xié)議連接到localhost主機(jī)。

我建議你在Info.plist文件中將localhost列為App Transport Security的例外,或者打開(kāi)ATS(Allow Arbitrary Loads 設(shè)為 YES)散罕,如果不這樣做分歇,應(yīng)用在嘗試通過(guò)http連接到服務(wù)器時(shí),會(huì)遭遇這個(gè)錯(cuò)誤 - Could not connect to development server欧漱。

ATS setting

在RNUtil文件夾中創(chuàng)建index.ios.js文件职抡,也就是即將和原生交互的前端文件(不會(huì)寫(xiě)的,先把我github的文件拷貝误甚,運(yùn)行起來(lái)看看效果然后好奇心會(huì)指導(dǎo)你學(xué)習(xí)的)缚甩。它會(huì)使用 React.createElement 來(lái)構(gòu)建應(yīng)用 UI, React會(huì)將其轉(zhuǎn)換到原生環(huán)境中,綁定在我們創(chuàng)建的RN管理VC view中窑邦。

這里需要注意:

使用命令行 cd到 RNUtil(react-native start 或者 npm start)開(kāi)啟本地服務(wù)蹄胰,這樣項(xiàng)目才能訪問(wèn)你的js文件并渲染到你想它在的地方。命令行關(guān)閉服務(wù)快捷鍵(control + C)

RCTRootView的初始化方法中moduleName(RNTestViewModule)參數(shù)要對(duì)應(yīng)index.ios.js文件中的

AppRegistry.registerComponent('RNTestViewModule', () => RNTestViewModule);

按鈕事件中代碼截圖


三奕翔、RN傳出參數(shù)(字符串或者字典)跳轉(zhuǎn)原生VC

index.ios.js文件 - 部分預(yù)覽

1裕寨、創(chuàng)建Module處理RN傳出參數(shù)以及回調(diào)

2、如果需要進(jìn)行跳轉(zhuǎn)操作派继,發(fā)送通知到RN View所管理的VC

新建OC文件處理RN (index.ios.js文件)宾袜,傳出參數(shù)以及回調(diào)類(lèi)名叫 RNBrageModule,h文件要繼承RCTBridgeModule協(xié)議驾窟,m文件就要實(shí)現(xiàn)兩個(gè)宏封裝好的方法庆猫。

.h文件

注意的地方:RCT_EXPORT_MODULE(hans); 這個(gè)RCT協(xié)議的實(shí)現(xiàn)宏,就是要和index.ios.js文件中的兩端交互對(duì)象一致绅络,如果不寫(xiě)hans月培,則使用類(lèi)名(當(dāng)前為:RNBridgeModule)作為兩端交互對(duì)象,js文件要使用的也是你類(lèi)名恩急,不再是你自定義的杉畜。

處理RN傳出參數(shù)以及回調(diào)

3、RN View所管理的VC 收到通知衷恭,處理通知

RN管理VC跳轉(zhuǎn)處理

這里有個(gè)需要注意的地方此叠,就是收到通知回來(lái)的處理函數(shù)是一條RN的特殊線程,需要跳轉(zhuǎn)控制器必須在主線程中實(shí)現(xiàn)随珠。

通知處理方法

我覺(jué)得發(fā)通知灭袁,利用自己的包裝控制器去做跳轉(zhuǎn),是不是個(gè)好辦法呢窗看?網(wǎng)友們有什么更好的建議呢茸歧?有沒(méi)有一種辦法是通過(guò)RN回調(diào)??(我也不清楚)獲得RCTRootView所在VC,然后直接跳轉(zhuǎn)(感覺(jué)越來(lái)越偏離什么鬼MVC/MVVM jio囧ng...)


四显沈、總結(jié)

? ? 由于本人所學(xué)較淺软瞎,也在由廣及深的學(xué)習(xí)中,本文只是簡(jiǎn)單的說(shuō)一下原生和RN的簡(jiǎn)單互動(dòng)以及途中碰到問(wèn)題后解決問(wèn)題的過(guò)程,僅廣面給大家一個(gè)前端邁腳的機(jī)會(huì)铜涉,深度方面就不誤人子弟了∷爝螅可以百度或者谷歌學(xué)習(xí)這方面的知識(shí)芙代。要想深入比如兩端的回調(diào),則需要看一篇大神的文章結(jié)合我的簡(jiǎn)單鞏固一下盖彭。馬上跳轉(zhuǎn)大神文章地址纹烹,請(qǐng)戳我!召边!铺呵, 如果想完全踏入前端的話盡量多學(xué)習(xí)一些RN或者Weex的思想,重要是多操作隧熙,RN的話有一篇轉(zhuǎn)行的踏坑路線片挂。說(shuō)實(shí)話,最近的移動(dòng)端飯碗很不好拿贞盯,成千上萬(wàn)人惦記著你們的飯碗音念,要想拿得穩(wěn)多學(xué)習(xí)是必須的。一直覺(jué)得“js才是打通我全棧任督二脈的一陽(yáng)指”躏敢。以后有丁點(diǎn)心得也會(huì)再次回來(lái)分享闷愤,借此鞏固。也為了后面復(fù)習(xí)件余,日后目光廣了回來(lái)調(diào)侃這時(shí)候自己的借口和理由讥脐。

? ? 有人可能會(huì)問(wèn)除了RN還有Weex或者其他,怎么把握呢啼器?那么我也反問(wèn)iOSer或其他: “除了OC還有Swift或者Android /Java/Python/GO等旬渠,你又怎么把握呢?只學(xué)其中一門(mén)能長(zhǎng)久端壳?坟漱?” 。話說(shuō)回來(lái)更哄,Weex我還沒(méi)開(kāi)始研究芋齿,只是看了一篇冰霜大神寫(xiě)的《Weex 是如何在 iOS 客戶端上跑起來(lái)的》,感覺(jué)兩門(mén)js差別不是很大成翩,相信你掌握了一門(mén)再去學(xué)另一門(mén)相對(duì)會(huì)比較容易觅捆,重要的是會(huì)分析他們各自機(jī)制在iOS端或者如何做到跨平臺(tái)的思想。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末麻敌,一起剝皮案震驚了整個(gè)濱河市栅炒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖赢赊,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乙漓,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡释移,警方通過(guò)查閱死者的電腦和手機(jī)叭披,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)玩讳,“玉大人涩蜘,你說(shuō)我怎么就攤上這事⊙浚” “怎么了同诫?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)樟澜。 經(jīng)常有香客問(wèn)我误窖,道長(zhǎng),這世上最難降的妖魔是什么秩贰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任贩猎,我火速辦了婚禮,結(jié)果婚禮上萍膛,老公的妹妹穿的比我還像新娘吭服。我一直安慰自己,他們只是感情好蝗罗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布艇棕。 她就那樣靜靜地躺著,像睡著了一般串塑。 火紅的嫁衣襯著肌膚如雪嘹履。 梳的紋絲不亂的頭發(fā)上镜粤,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼桐玻。 笑死忧设,一個(gè)胖子當(dāng)著我的面吹牛锄开,可吹牛的內(nèi)容都是我干的梳猪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼妆档,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼僻爽!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起贾惦,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤胸梆,失蹤者是張志新(化名)和其女友劉穎敦捧,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體碰镜,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兢卵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绪颖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秽荤。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖菠发,靈堂內(nèi)的尸體忽然破棺而出王滤,到底是詐尸還是另有隱情贺嫂,我是刑警寧澤滓鸠,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站第喳,受9級(jí)特大地震影響糜俗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜曲饱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一悠抹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扩淀,春花似錦楔敌、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至胜臊,卻和暖如春勺卢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背象对。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工黑忱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人勒魔。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓甫煞,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親冠绢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子危虱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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