react native之App集成以及高度自適應(yīng)

集成

與現(xiàn)有App集成拍鲤,以及高度適應(yīng)問題剩檀,官方文檔中都有說明憋沿,單拉一篇文章出來旺芽,主要是想記錄一下其中的問題點(diǎn)沪猴,給大家做些參考。

集成到現(xiàn)有App采章,無非是把react界面放到現(xiàn)有App中的某個(gè)頁面中运嗜,那么第一點(diǎn)是要把react native加到現(xiàn)有工程,第二點(diǎn)創(chuàng)建RCTRootView并添加到某頁面悯舟。

react native添加到現(xiàn)有工程担租,有兩種方式:

1、使用cocoapods抵怎,自動化管理奋救;
2岭参、手工集成,即將react native各個(gè)子工程手動添加到項(xiàng)目中尝艘;

但是演侯,在此之前,還有一件至關(guān)重要的事:下載react native工程背亥。

react native使用node.js作為工程集成環(huán)境秒际,包管理使用npm工具,所以這一步也比較簡單:

//在現(xiàn)有App工程目錄中創(chuàng)建package.json文件狡汉,執(zhí)行npm install:
{
  "name": "reactDemo",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node node_modules/react-native/local-cli/cli.js start"
  },
  "dependencies": {
    "react": "^15.2.1",
    "react-native": "^0.29.2"
  }
}

當(dāng)前目錄就會創(chuàng)建node_modules娄徊,react native所有依賴項(xiàng)都存在此目錄中。

使用cocoapods集成比較方便:

//創(chuàng)建podfile盾戴,配置工程依賴項(xiàng)寄锐,注意:path路徑要設(shè)置自己的node_modules正確路徑

target 'App工程名稱' do

  pod 'React', :path => './node_modules/react-native', :subspecs => [
    'Core',
    'RCTText',
    'RCTWebSocket', # needed for debugging
    # Add any other subspecs you want to use in your project
    'RCTImage',
    'RCTNetwork',
    'RCTActionSheet',
    'RCTGeolocation',
    'RCTLinkingIOS',
    'RCTVibration',
    'RCTSettings',
  ]

end

執(zhí)行: pod install, 即可集成react native到現(xiàn)有工程尖啡。

手動添加react native锐峭,就要麻煩一下,進(jìn)入node_modules目錄查找相應(yīng)react工程可婶,即project沿癞,將project添加到現(xiàn)有工程中即可。

下一步矛渴,創(chuàng)建react頁面椎扬,并作為子頁面添加到現(xiàn)有項(xiàng)目中:

    NSURL *jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle?platform=ios&dev=true"];

    jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
    
    _rctView = [[RCTRootView alloc] initWithBundleURL: jsCodeLocation moduleName:@"reactDemo" initialProperties:@{} launchOptions:nil];
    
    [self.view addSubview: _rctView];

到這一步,算是整體集成完畢具温,可以啟動服務(wù)看頁面是否能正常展示蚕涤。

react高度適應(yīng)

react頁面高度是不定的,這就給react頁面的父頁面設(shè)定帶來一些問題铣猩。官方也給出了解決方案揖铜,就是父頁面使用UIScrollView,并監(jiān)聽react頁面高度變化达皿,使父頁面隨react頁面變化而變化天吓。

設(shè)置監(jiān)聽RCTRootView的高度變化:


    _rctView.delegate = self;
    _rctView.sizeFlexibility = RCTRootViewSizeFlexibilityHeight;

#pragma mark - RCTRootViewDelegate
- (void)rootViewDidChangeIntrinsicSize:(RCTRootView *)rootView {

    CGRect newFrame = rootView.frame;
    newFrame.size = rootView.intrinsicSize;
    
    rootView.frame = newFrame;
    self.view.frame = newFrame;
    
    if (self.delegate) {
        [self.delegate didChangeHeight: newFrame.size.height];
    }
}    

ok,集成和高度適應(yīng)都完畢了峦椰,下來還有什么問題龄寞?

touchable與UIScrollView事件沖突問題

這里說的事件沖突,倒不是說UIScrollView截獲了Touchable的點(diǎn)擊事件汤功,而是Touchable會把UIScrollView的滾動事件誤認(rèn)為是點(diǎn)擊事件物邑。所以造成的現(xiàn)象就是,當(dāng)滾動UIScrollView時(shí),同時(shí)會出發(fā)Touchable點(diǎn)擊事件色解,這種體驗(yàn)糟糕的不要不要的茂嗓。

react native自身也封裝了ScrollView,在使用react native的ScrollView時(shí)不會存在這個(gè)問題科阎,明顯react native發(fā)現(xiàn)并解決了該問題在抛。react native的點(diǎn)擊事件又必須依賴Touchable,我們又不能使用react native的ScrollView萧恕,所以這個(gè)問題不能靠框架解決刚梭。

解決思路:

Touchable是完全依賴事件模擬的點(diǎn)擊操作,發(fā)生混亂的原因是UIScrollView滾動相關(guān)事件傳遞給了js側(cè)的Touchable票唆,所以只要把滾動的相關(guān)事件屏蔽調(diào)就可以實(shí)現(xiàn)目標(biāo)朴读。

解決方法:

RCTRootView是native與js側(cè)的橋梁,所有UI觸摸事件都是通過該View傳遞給js走趋,該View有個(gè)cancelTouches方法衅金,用來取消當(dāng)前的觸摸事件,所以簿煌,只要在scrollViewWillBeginDragging方法中調(diào)用[_rctView cancelTouches]即可氮唯。

交互與擴(kuò)展

既然集成react native到本地項(xiàng)目中,那么必然還存在兩者之間的交互姨伟。react native核心技術(shù)是javascriptCore惩琉,交互必然也是通過它了。與WebView不同夺荒,javascriptCore是獨(dú)立存在項(xiàng)目中瞒渠,整個(gè)react native都是通過一個(gè)單獨(dú)的jscontext建立之間的聯(lián)系,也就無法截獲WebView的請求消息進(jìn)行通信技扼。好消息是伍玖,無論舊的WebView方式還是新的javascriptCore方式,只需要封裝一下甚至無需封裝剿吻,就可以將舊的jsbridge接口移植到react native項(xiàng)目中窍箍。

有關(guān)jsbridge和javascriptCore可以參考之前的文章:

H5與native之間的通信

javascriptCore 詳解

如何注入到react native可以參考這篇文章:

react native之OC與js之間交互

如何注入到react native中的WebView,可以參考這篇文章:

react native之WebView中注入js接口

如何讓你的項(xiàng)目可以隨意更換react native服務(wù)器地址丽旅,可以參考這個(gè)工具:

react-native-debug-server-host

需要注意一點(diǎn):react native的jscontext是在子線程中創(chuàng)建執(zhí)行椰棘,所以如果你的接口中有UI的操作,需要手動指定到UI線程執(zhí)行魔招。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末晰搀,一起剝皮案震驚了整個(gè)濱河市五辽,隨后出現(xiàn)的幾起案子办斑,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乡翅,死亡現(xiàn)場離奇詭異鳞疲,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蠕蚜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門尚洽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人靶累,你說我怎么就攤上這事腺毫。” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長逗威。 經(jīng)常有香客問我恒界,道長,這世上最難降的妖魔是什么鳖枕? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上勃教,老公的妹妹穿的比我還像新娘。我一直安慰自己匠抗,他們只是感情好故源,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著汞贸,像睡著了一般心软。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上著蛙,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天删铃,我揣著相機(jī)與錄音,去河邊找鬼踏堡。 笑死猎唁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的顷蟆。 我是一名探鬼主播诫隅,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼帐偎!你這毒婦竟也來了逐纬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤削樊,失蹤者是張志新(化名)和其女友劉穎豁生,沒想到半個(gè)月后兔毒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡甸箱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年育叁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芍殖。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡豪嗽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出豌骏,到底是詐尸還是另有隱情龟梦,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布窃躲,位于F島的核電站变秦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏框舔。R本人自食惡果不足惜蹦玫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望刘绣。 院中可真熱鬧樱溉,春花似錦、人聲如沸纬凤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽停士。三九已至挖帘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間恋技,已是汗流浹背拇舀。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜻底,地道東北人骄崩。 一個(gè)月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像薄辅,于是被迫代替她去往敵國和親要拂。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

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