1. 程式人生 > >iOS原生專案(Objective-C)整合React Native(0.57.3版本)圖文教程--(2)整合過程

iOS原生專案(Objective-C)整合React Native(0.57.3版本)圖文教程--(2)整合過程

iOS原生專案(Objective-C)整合React Native(0.57.3版本)圖文教程–(1)基本環境

iOS原生專案(Objective-C)整合React Native(0.57.3版本)圖文教程–(2)整合過程

文章目錄

iOS原生專案(Objective-C)整合React Native(0.57.3版本)圖文教程–(2)整合過程

1. 先用react-native init RNDemo命令,建立個空的RN專案

目的是獲取package.json檔案配置
目的是獲取package.json檔案配置
目的是獲取package.json檔案配置
在這裡插入圖片描述
package.json檔案處理
在這裡插入圖片描述

2. 在iOS專案(RNDemo)根目錄下建立ReactComponent資料夾,將1的package.json檔案放進去

在這裡插入圖片描述

name是當前iOS原生專案資料夾的名稱,如此為RNDemo

{
  "name": "RNDemo",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node node_modules/react-native/local-cli/cli.js start",
    "test": "jest"
  },
  "dependencies": {
    "react": "16.6.0-alpha.8af6728",
    "react-native": "0.57.3"
  }
}

3. cd到ReactComponent檔案下,執行npm install,會生成node_modules資料夾和package-lock.json檔案: 如果特別慢,映象到國內

npm config set registry https://registry.npm.taobao.org --global
npm config set disturl https://npm.taobao.org/dist --global

在這裡插入圖片描述

4. ReactComponent資料夾裡面建立index.js,新增測試程式碼

在這裡插入圖片描述

在這裡插入圖片描述

import React, { Component } from 'react';
import {
  AppRegistry,
  StyleSheet,
  Text,
  View
} from 'react-native';
export default class RNDemo extends Component {
  render() {
    return <View style={styles.container}>
        <Text>This is a simple application.</Text>
      </View>;
  }
}
const styles = StyleSheet.create({
  container: {
    margin: 100,
    flex: 1,
    backgroundColor: 'red'
  }
});

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

5. Podfile檔案新增RN依賴庫

pod init獲取Podfile檔案
在這裡插入圖片描述
新增RN依賴庫,目前iOS12已出來,最低支援iOS9.0即可
在這裡插入圖片描述


platform :ios, '9.0'

target 'RNDemo' do
    # 'node_modules'目錄一般位於根目錄中,我放到了ReactComponent資料夾下了,修改如下對應的路徑
    # 但是如果你的結構不同,那你就要根據實際路徑修改下面的`:path`
    pod 'React', :path => './ReactComponent/node_modules/react-native', :subspecs => [
    'Core',
    'CxxBridge', # 如果RN版本 >= 0.45則加入此行
    #'BatchedBridge',    #RN版本高於0.45之後必須匯入
    'DevSupport', # 如果RN版本 >= 0.43,則需要加入此行才能開啟開發者選單
    'RCTImage',
    'RCTNetwork',
    'RCTText',
    'RCTWebSocket',     # 這個模組是用於除錯功能的
    # 在這裡繼續新增你所需要的RN模組
    #'ART',
    #'RCTActionSheet',
    #'RCTAdSupport',
    #'RCTCameraRoll',
    #'RCTGeolocation',
    #'RCTPushNotification',
    #'RCTSettings',
    #'RCTVibration',
    #'RCTLinkingIOS',
    #'RCTAnimation',
    ]

    # 如果你的RN版本 >= 0.42.0,則加入下面這行。
    pod 'yoga', :path => './ReactComponent/node_modules/react-native/ReactCommon/yoga'
    # 這裡注意: 如果是0.49以下的RN,則使用下面這條:
    # pod "Yoga", :path => "./ReactComponent/node_modules/react-native/ReactCommon/yoga"

    # 如果RN版本 >= 0.45則加入下面三個第三方編譯依賴
    pod 'DoubleConversion', :podspec => './ReactComponent/node_modules/react-native/third-party-podspecs/DoubleConversion.podspec'
    pod 'glog', :podspec => './ReactComponent/node_modules/react-native/third-party-podspecs/glog.podspec'
    # ios9.0以上版本才行
    pod 'Folly', :podspec => './ReactComponent/node_modules/react-native/third-party-podspecs/Folly.podspec'


  target 'RNDemoTests' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'RNDemoUITests' do
    inherit! :search_paths
    # Pods for testing
  end

end

6. pod install安裝完成

在這裡插入圖片描述

7. AppDelegate.m新增測試程式碼

在這裡插入圖片描述

#import "AppDelegate.h"
#import "ViewController.h"
#import <React/RCTRootView.h>

@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    ViewController *vcController = [[ViewController alloc] init];
    self.window.rootViewController = vcController;
    
    NSURL *url = [NSURL URLWithString:@"http://localhost:8081/index.bundle?platform=ios&dev=true"];
    RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:url moduleName:@"RNDemo" initialProperties:nil launchOptions:nil];
    vcController.view = rootView;
    
    [self.window makeKeyAndVisible];
    return YES;
}

8. 進入package.json檔案所在資料夾 執行npm start,啟動8081伺服器

在這裡插入圖片描述

9. 再用xcode執行工程即可

首次啟動會報錯,因為xcode目前後ATS設定,預設為NO,不允許HTTP請求,只允許HTTPS請求
在這裡插入圖片描述

10. Xcode的ATS配置

找到專案的info.plist檔案,原始碼開啟,新增如下程式碼,再次用xcode執行專案即可
在這裡插入圖片描述

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

在這裡插入圖片描述

11. 如果有如下報錯

說明上面AppDelegate.m檔案裡的註冊程式碼有誤
在這裡插入圖片描述
修改成RNDemo即可執行成功
在這裡插入圖片描述

12. 執行成功

在這裡插入圖片描述