ReactNative 集成到 iOS原生應(yīng)用 Cocoapods管理

long time no see,最近在折騰RN。找了一些書,看了結(jié)果各種錯(cuò)誤各種坑。于是我還是依然決然的到React Native官網(wǎng)和ReactNative中文網(wǎng) 去尋求答案,實(shí)在不行直接github issues得了。


一、pod install (RN) 導(dǎo)致第三方報(bào)錯(cuò)。

WTF啥情況,先查看了cocoapods,無意間發(fā)現(xiàn)了Ruby的taobao鏡像停止更新,機(jī)智的我換成了rubychina源。

$ gem sources --add https://gems.ruby-china.org/ --remove https://rube.taobao.org/

這邊假設(shè)都了解更新過后podfile的寫法。

platform :ios, '7.0'
target 'cocoapodsMangeRN' do
pod 'React', :path => './node_modules/react-native', :subspecs => [
  'Core',
  'RCTImage',
  'RCTNetwork',
  'RCTText',
  'RCTWebSocket',
  # Add any other subspecs you want to use in your project
]
end

然后發(fā)現(xiàn)換成rubychina之后,pod install就好了。

RN安裝成功

如果想折騰cocopods,降級(jí)以適應(yīng)第三方庫請(qǐng)點(diǎn)擊這里

二、明知書上的Demo會(huì)出錯(cuò),還是毅然決然地入坑。

講在前面:RN Version(0.37.0),React Version (15.3.1)

  • 看一下工程目錄:

    文件目錄圖.png
  • **NPM **和 Node Project Modules的區(qū)別和相關(guān)知識(shí),這邊不介紹有興趣的可以去調(diào)研一下。

根據(jù)上面的目錄結(jié)構(gòu),大家應(yīng)該也注意到了兩個(gè)文件index.ios.jspackage.json兩個(gè)文件

  • 注意兩文件的位置是在Xcode工程的根目錄下。
  • 這邊我使用的文本編輯工具是Atom.
  • index.ios.js 前端代碼在iOS中的實(shí)現(xiàn)寫在其中。
Normally with React Native projects, you will put files like package.json, index.ios.js, etc. in the root directory of your project and then have your iOS specific native code in a subdirectory like ios/where your Xcode project is located (e.g., .xcodeproj
).
  • package.json:一些必要的依賴包記錄在其中,啥樣呢?
   {
   "name": "jjreact-native",
   "version": "1.0.0",
   "description": "ToDosthTest",
   "main": "index.js",
   "scripts": {
     "start": "node node_modules/react-native/local-cli/cli.js start"
   },
   "author": "jeversonjee",
   "license": "ISC",
   "dependencies": {

     "react": "15.3.1",
     "react-native": "^0.37.0"
   }
 }
  • S1:寫好package.json就用npm來安裝React和React Native模塊npm install
  • S2:就是上述的cocoapods的 pod install 了。
  • S3:在index.ios.js來一個(gè)簡(jiǎn)單的代碼了。
'use strict';
import React from 'react';
import {
  AppRegistry,
  StyleSheet,
  Text,
  View
} from 'react-native';

class cocoapodsMangeRN extends React.Component {
  render() {
    return (
      <View style={styles.container}>
        <Text>
          This is jeversonjee test
        </Text>
    </View>
    );
  }
}
const styles = StyleSheet.create({
container: {
  flex: 1,
  justifyContent: 'center',
  alignItems: 'center',
  backgroundColor: '#FFFFFF',
},

});

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

三、說了這么久是時(shí)候Xcode表演真正的技術(shù)了。

是時(shí)候引入RCTRootView了,可以像這輛理解

  • 1.ReactNative應(yīng)用的生存空間。
  • 2.RCTRootView對(duì)象加載RN(實(shí)際是index.ios.js 的js代碼完成)的內(nèi)容渲染出來。

這里偷了個(gè)懶用了書上的例子。

  • 自定義一個(gè)JJReactView:UIView的視圖
  • 在awakeFromNib將通過將RN渲染的內(nèi)容添加到視圖中
//
//  JJReactView.m
//  cocoapodsMangeRN
//
//  Created by JeversonJee on 2016/11/18.
//  Copyright ? 2016年 JerversonJee. All rights reserved.
//

#import "JJReactView.h"
#import <RCTRootView.h>

@implementation JJReactView

- (void)awakeFromNib {
  
    //
    NSString *urlStr = @"http://localhost:8081/index.ios.bundle?platform=ios";
    NSURL *jsCodeLocation = [NSURL URLWithString:urlStr];
    RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation     moduleName:@"cocoapodsMangeRN" initialProperties:nil launchOptions:nil];
    [self addSubview:rootView];
    rootView.frame = self.bounds;
    [super awakeFromNib];
}
  
@end
  • S5:打開終端cd:工程根目錄 & npm start
終端顯示結(jié)果.png
  • S6:然后再模擬器上運(yùn)行你的代碼吧。

四、你以為我寫demo就這么按部就班,然而是這樣的。

錯(cuò)誤3.png
  • 可以嘗試將package中的一些配置改改,整點(diǎn)事看看能報(bào)啥錯(cuò)。

其實(shí)買的這本書,在評(píng)論中久看到了書友說不好,寫上去一大堆代碼。為什么還要呢,對(duì)比之前的版本的寫法,理解上應(yīng)該會(huì)更好,可能我有些奇葩罷了。

  1. 其實(shí)代碼簡(jiǎn)單,還是給個(gè)傳送門吧點(diǎn)擊這里

我是有底線的,繼續(xù)爬坑吧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容