將React Native0.53與現(xiàn)有的iOS整合

# 將React Native0.53與現(xiàn)有的iOS整合

版本

  • xcode 9.2(9C40b)
  • react-native 0.53.0
  • react 16.0.0-beta.5

參考

前言

這版本在與原專案集成的坑真的不是普通的多...希望下一版能全部修復(fù)

步驟

  1. 新建一個iOS single view app,如果已經(jīng)有iOS專案,可以跳到第三步

  2. 初始化pod

     > pod init
    
  3. 新增一個資料夾,然後在裡面新建一個ios資料夾,把iOS專案拉進來,這時目錄應(yīng)該是這樣

     - RNFloder
         - ios
             - iosProjectName
                 - ...
                 - Assets.xcassets
                 - ...
             - iosProjectName.xcodeproj
             - iosProjectName.xcworkspace
             - ... 
    
  4. 在React Native根目錄初始化npm,npm是js的CocoaPods,一般只要一直按enter就好了,他會在你的目錄下多出一個package.json檔案,作用等同於Podfile

     > npm init
    
  5. 接著安裝React Native相關(guān)的js lib,根據(jù)官方文件,必須要以下react版本,因為rn對react版本很敏感

     > npm install --save react@16.0.0-beta.5 react-native
    
  6. 在Podfile中將React Native lib引入到專案

     target 'ReactNativeiOSHybrid' do
               use_frameworks!
       # 'node_modules'目錄一般位於根目錄中
       # 但是如果你的結(jié)構(gòu)不同嘶伟,那你就要根據(jù)實際路徑修改下面的`:path`
       pod 'React', :path => '../node_modules/react-native', :subspecs => [
         'Core',
         'DevSupport', # Include this to enable In-App Devmenu if RN >= 0.43
         'RCTText',
         'RCTNetwork',
         'RCTWebSocket', # needed for debugging
         'CxxBridge',
         # Add any other subspecs you want to use in your project
       ]
       # Explicitly include Yoga if you are using RN >= 0.42.0
       pod 'yoga', :path => '../node_modules/react-native/ReactCommon/yoga'
     
       # Third party deps podspec link
       pod 'DoubleConversion', :podspec => '../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec'
       pod 'GLog', :podspec => '../node_modules/react-native/third-party-podspecs/GLog.podspec'
       pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec'
    
     end
     
     # 這裡要注意,如果CocoaPods在install的時候出了問題,記得下pod cache clean --all,不然會有緩存導(dǎo)致之後改動Podfile還是會install失敗
    
  7. CD到React Native目錄下的iOS目錄,安裝相關(guān)iOS lib

     > pod install
    
  8. 啟動Xcode,run app

  9. 這時候會發(fā)現(xiàn)有錯誤

     Yoga-internal.h:11:10 : fatal error: 'algorithm' file not found: #include 
    
  10. 這是因為react native(或是yoga?反正都是facebook)官方podspec沒配置好

  11. 接著按照github有一個還沒過的PR改動,打開以下文件

    > cd RNProject/node_modules/react-native/ReactCommon/yoga
    > vim yoga.podspec
    
  12. 在最後面補上

        ...
        ...
      # Set this environment variable when not using the `:path` option to install the pod.
      # E.g. when publishing this spec to a spec repo.
      source_files = 'yoga/**/*.{cpp,h}'
      source_files = File.join('ReactCommon/yoga', source_files) if ENV['INSTALL_YOGA_WITHOUT_PATH_OPTION']
      spec.source_files = source_files
    
      # 補上以下兩句
      spec.public_header_files = 'yoga/Yoga.h', 'yoga/YGEnums.h', 'yoga/YGMacros.h'
    
    end
    
  13. 這樣就解決了algorithm.h找不到的問題,問題解決,想了解更多可以看一下這個issue:React Native iOS Pod issues: fatal error: 'algorithm' file not found

  14. 接著運行,還會報一個fishhook/fishhook.h頭文件找不到的問題

  15. 找到該報錯文件,將報錯的import改成以下

    #import fishhook/fishhook.h -> #import fishhook.h
    
  16. 問題解決,想了解更多可以看一下這個issue:React Native iOS issues: Fishhook error

  17. 然後在React Native根目錄新增一個index.js文件,這個是用來測試的React Native頁面

    import React from 'react';
    import { AppRegistry, StyleSheet, Text, View } from 'react-native';
    
    class RNHighScores extends React.Component {
      render() {
        var contents = this.props['scores'].map((score) => (
          <Text key={score.name}>
            {score.name}:{score.value}
            {'\n'}
          </Text>
        ));
        return (
          <View style={styles.container}>
            <Text style={styles.highScoresTitle}>2048 High Scores!</Text>
            <Text style={styles.scores}>{contents}</Text>
          </View>
        );
      }
    }
    
    const styles = StyleSheet.create({
      container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#FFFFFF',
      },
      highScoresTitle: {
        fontSize: 20,
        textAlign: 'center',
        margin: 10,
      },
      scores: {
        textAlign: 'center',
        color: '#333333',
        marginBottom: 5,
      },
    });
    
    // Module name
    AppRegistry.registerComponent('RNHighScores', () => RNHighScores);
    
  18. 然後在React Native根目錄執(zhí)行以下指令,他會在local端開啟一個server,供React Native讀取我們開發(fā)中的Reat Native文件,他會自動打包成bundle

    > npm start 
    
  19. 然後執(zhí)行Xcode->run iOS專案,或是在根目錄

    > react-native run-ios
    
  20. 如果你使用的是0.53.0版的React Native,你會出現(xiàn)以下錯誤

    No component found for view with name "RCTText"
    
  21. 這是由於我們facebook工程師一個美妙的錯誤,詳情可以看以下issue:React Native iOS issue: No component found for view with name "RCTText"

  22. 依照以上issue的解決方案,打開./node_modules/react-native/React.podspec

      s.subspec "RCTText" do |ss|
        ss.dependency             "React/Core"
    -   ss.source_files         = "Libraries/Text/*.{h,m}"
    +   ss.source_files         = "Libraries/Text/**/*.{h,m}"
      end
    
  23. 在iOS目錄下重新 pod install

  24. OK,畫面出現(xiàn),歷經(jīng)了千辛萬苦,終於可以愉快地使用React Native了


author Iml1s

email ImL1s@outlook.com

若我的文章有幫助到你,可以考慮請我喝杯咖啡:D

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末怎憋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子九昧,更是在濱河造成了極大的恐慌绊袋,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铸鹰,死亡現(xiàn)場離奇詭異癌别,居然都是意外死亡,警方通過查閱死者的電腦和手機蹋笼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門展姐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人剖毯,你說我怎么就攤上這事圾笨。” “怎么了逊谋?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵擂达,是天一觀的道長。 經(jīng)常有香客問我胶滋,道長板鬓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任镀钓,我火速辦了婚禮穗熬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘丁溅。我一直安慰自己唤蔗,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布窟赏。 她就那樣靜靜地躺著妓柜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涯穷。 梳的紋絲不亂的頭發(fā)上棍掐,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音拷况,去河邊找鬼作煌。 笑死,一個胖子當著我的面吹牛粟誓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播病瞳,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼悲酷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了逗柴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤嚎于,失蹤者是張志新(化名)和其女友劉穎挟冠,沒想到半個月后袍睡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡控淡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年止潘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凭戴。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡么夫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出档痪,到底是詐尸還是另有隱情,我是刑警寧澤腐螟,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站衬廷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏泵督。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一救鲤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秩冈,春花似錦、人聲如沸入问。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惧互。三九已至租漂,卻和暖如春颊糜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背衬鱼。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蒜胖,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓翠勉,卻偏偏與公主長得像霉颠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蒿偎,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

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

  • React Native與Android交互 author: ImL1s email: iml1s@outlook...
    L1s閱讀 1,038評論 0 3
  • 用到的組件 1、通過CocoaPods安裝 2骑脱、第三方類庫安裝 3、第三方服務(wù) 友盟社會化分享組件 友盟用戶反饋 ...
    SunnyLeong閱讀 14,613評論 1 180
  • 核心概念 如果你正準備從頭開始制作一個新的應(yīng)用啤誊,那么React Native會是個非常好的選擇拥娄。但如果你只想給現(xiàn)有...
    made_China閱讀 1,381評論 1 2
  • 項目已經(jīng)迭代了很多版本,目前想在里面集成React native稚瘾。以下是操作步驟,由于一些坑已經(jīng)趟過摊欠,直接按照解決...
    兩個小棉襖閱讀 1,262評論 0 4
  • 讀的什么書:《大秦帝國》 閱讀有效時間:一個小時 閱讀中遇到了什么困難:上班日工作原因看書要找時間,不過堅持了下來...
    我是王曉陽閱讀 115評論 0 0