React Native 嵌入到iOS原生項目

如果你正準備從頭開始制作一個新的應用,那么React Native會是個非常好的選擇。但如果你只想給現有的原生應用中添加一兩個視圖或是業務流程,React Native也同樣不在話下。只需簡單幾步,你就可以給原有應用加上新的基于React Native的特性、畫面和視圖等。

把React Native組件植入到iOS應用中有如下幾個主要步驟:

  1. 首先當然要了解你要植入的React Native組件。
  2. 創建一個Podfile,在其中以subspec的形式填寫所有你要植入的React Native的組件。
  3. 創建js文件,編寫React Native組件的js代碼。
  4. 添加一個事件處理函數,用于創建一個RCTRootView。這個RCTRootView正是用來承載你的React Native組件的,而且它必須對應你在index.ios.js中使用AppRegistry注冊的模塊名字。
  5. 啟動React Native的Packager服務,運行應用。
  6. 根據需要添加更多React Native的組件。
  7. 調試
  8. 準備部署發布 (比如可以利用react-native-xcode.sh腳本)。
  9. 發布應用,升職加薪,走向人生巔峰!??

1. 創建一個原生應用

這個就不多說。

2. 添加依賴包

React Native的植入過程同時需要ReactReact Native兩個node依賴包。我們把具體的依賴包記錄在package.json文件中。如果項目根目錄中沒有這個文件,那就自己創建一個。

2.1 package.json

我這里的做法是在項目的根目錄下創建一個專門存放react native相關的文件夾,就像這樣:

RNComponent文件夾

然后在這個文件夾下創建一個package.json文件,就像這樣:

package.json文件

package.json文件中的內容是這樣的:

{
    "name": "NativeRN",
    "version": "0.0.1",
    "private": true,
    "scripts": {
        "start": "node node_modules/react-native/local-cli/cli.js start"
    },
    "dependencies": {
        "react": "16.0.0-alpha.6",
        "react-native": "0.44.0"
    }
}

解釋一下:

  • version字段沒有太大意義(除非你要把你的項目發布到npm倉庫)。
  • scripts中是用于啟動packager服務的命令。
  • dependencies中的reactreact-native的版本取決于你的具體需求。一般來說我們推薦使用最新版本。你可以使用npm info reactnpm info react-native來查看當前的最新版本。另外,react-nativereact的版本有嚴格要求,高于或低于某個范圍都不可以。

本文無法在這里列出所有react native和對應的react版本要求,只能提醒讀者先嘗試執行npm install,然后注意觀察安裝過程中的報錯信息,例如require react@某.某.某版本, but none was installed,然后根據這樣的提示,執行npm i -S react@某.某.某版本。

2.2 安裝依賴包

使用npm(node包管理器,Node package manager)來安裝React和React Native模塊。這些模塊會被安裝到項目根目錄下的node_modules/目錄中。 在包含有package.json文件的目錄(一般也就是項目根目錄,我這里因為創建了RNComponent文件夾,所以是在這個文件夾目錄下執行這個命令)中運行下列命令來安裝:

$ npm install

運行完成后會出現node_modules這樣一個文件夾,這個文件夾下包含了RN的一些模塊,就像這樣:

執行命令安裝模塊

3. React Native框架

React Native框架整體是作為node模塊安裝到項目中的。下一步我們需要在CocoaPods的Podfile中指定我們所需要使用的組件。

3.1 Subspecs

在你開始把React Native植入到你的應用中之前,首先要決定具體整合的是React Native框架中的哪些部分。而這就是subspec要做的工作。在創建Podfile文件的時候,需要指定具體安裝哪些React Native的依賴庫。所指定的每一個庫就稱為一個subspec

可用的subspec都列在node_modules/react-native/React.podspec中,基本都是按其功能命名的。一般來說你首先需要添加Core,這一subspec包含了必須的AppRegistryStyleSheetView以及其他的一些React Native核心庫。如果你想使用React NativeText庫(即<Text>組件),那就需要添加RCTTextsubspec。同理,Image需要加入RCTImage,等等。

3.2 Podfile

ReactReact Native模塊成功安裝到node_modules目錄之后,你就可以開始創建Podfile以便選擇所需的組件安裝到應用中。

創建podfile在這里不在多說,相信只要用過cocoapods的朋友都知道。

podfile創建完成之后,在文件里添加一下內容:

# target的名字一般與你的項目名字相同
target 'NativeRN' do

  # 'node_modules'目錄一般位于根目錄中
  # 但是如果你的結構不同,那你就要根據實際路徑修改下面的`:path`
  pod 'React', :path => './RNComponent/node_modules/react-native', :subspecs => [
    'Core',
    'RCTText',
    'RCTNetwork',
    'RCTWebSocket', # 這個模塊是用于調試功能的
    # 在這里繼續添加你所需要的模塊
  ]
  # 如果你的RN版本 >= 0.42.0,請加入下面這行
  pod "Yoga", :path => "./RNComponent/node_modules/react-native/ReactCommon/yoga"

end

然后執行下面的??命令,開始安裝React Native的pod包。

$ pod install

4. 代碼集成

4.1 index.ios.js

首先創建一個空的index.ios.js文件。一般來說我們把它放置在項目根目錄下。就像??:

index.ios.js

index.ios.js是React Native應用在iOS上的入口文件。而且它是不可或缺的!它可以是個很簡單的文件,簡單到可以只包含一行require/import導入語句。

# 在項目根目錄執行以下命令創建文件:
$ touch index.ios.js

4.2 添加你自己的React Native代碼

import React, { Component } from 'react';
import {
  AppRegistry,
  StyleSheet,
  Text,
  View
} from 'react-native';

export default class NativeRN extends Component {
  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.welcome}>
          Welcome to React Native!
        </Text>
        <Text style={styles.instructions}>
          To get started, edit index.ios.js
        </Text>
        <Text style={styles.instructions}>
          Press Cmd+R to reload,{'\n'}
          Cmd+D or shake for dev menu
        </Text>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
  welcome: {
    fontSize: 20,
    textAlign: 'center',
    margin: 10,
  },
  instructions: {
    textAlign: 'center',
    color: '#333333',
    marginBottom: 5,
  },
});

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

4.3 集成到原生項目中

我這里先創建了一個ViewController,??這樣:

RNViewController

然后導入#import <RCTRootView.h>頭文件,??這樣:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    NSString * strUrl = @"http://localhost:8081/index.ios.bundle?platform=ios&dev=true";
    NSURL * jsCodeLocation = [NSURL URLWithString:strUrl];
    
    RCTRootView * rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
                                                         moduleName:@"NativeRN"
                                                  initialProperties:nil
                                                      launchOptions:nil];
    self.view = rootView;
    
}

4.4 配置info.plist

還需要在info.plist文件中配置一下:

<key>NSAppTransportSecurity</key>
  <dict>
    <key>NSExceptionDomains</key>
    <dict>
      <key>localhost</key>
      <dict>
       <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
       <true/>
      </dict>
    </dict>
  </dict>

配置后的效果:

配置info.plist

5. 運行項目

在運行項目前,先在react native文件夾目錄下,啟動開發服務器。也就是在本文中的RNComponent目錄下,啟動命令行:

$ npm start

運行項目,看到效果:

效果圖

博客地址

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容