技术干货React Native开发iOS Developer

ReactNative嵌入iOS原生App

2016-11-16  本文已影响0人  KumLight

就现阶段而言 , 完全用ReactNative 构建App 还是不太现实 .
但其替代Web与原生App 进行交互, 还是很令我期待的 .
在网上查到了很多集成的方法 , 在此分享一下集成时遇到的一些坑 .

框架集成

集成方法大致分为以下几种

** 运用CocoaPod 集成 **
** 手动集成框架 **

1. CocoaPod 集成

参考文献: http://blog.csdn.net/l863784757/article/details/50592341

1.1 文件中创建 Podfile 文件

platform :ios, '7.0'

target 'ReactNativeProject' do
pod 'React', '~> 0.13.0-rc'
pod "React/RCTText"  
pod "React/RCTActionSheet"  
pod "React/RCTGeolocation"  
pod "React/RCTImage"  
pod "React/RCTLinkingIOS"  
pod "React/RCTNetwork"  
pod "React/RCTSettings"  
pod "React/RCTVibration"  
pod "React/RCTWebSocket"

end

在终端执行 pod install

几点注意的是

  • 目前使用Pod 只能集成React-Native 0.13版本 .
    (版本偏低 , 目前版本都到0.37 , 期待Pod更新新版本)
  • 下载架包的时候还是需要翻墙, 否则下载不下来. 而且下载时间也比较长.

1.2 添加头文件搜索路径


添加头文件搜索路径

头文件搜索路径 : $(PODS_ROOT)/React/React

1.3 在工程中 创建index.iOS.js文件

'use strict';  
  
var React = require('react-native');  
var {  
  AppRegistry,  
  StyleSheet,  
  Text,  
  View,  
} = React; 

var ReactNativeProject = React.createClass({  
  render: function() {  
    return (  
      <View style={styles.container}>  
        <Text style={styles.welcome}>  
          Welcome to React Native!  
        </Text>  
        <Text style={styles.instructions}>  
          To get started, edit index.android.js  
        </Text>  
        <Text style={styles.instructions}>  
          Shake or press menu button for dev menu  
        </Text>  
      </View>  
    );  
  }  
});

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

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

因为导入的是0.13 版本框架 , 所以只支持ES5 的写法 , 不支持ES6 .

1.4 在原生代码中添加RCTRootView 页面

- (void)createReactNativeView{

    NSURL *jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle?platform=ios&dev=true"];
    
    RCTRootView *rnView = [[RCTRootView alloc]
                             initWithBundleURL:jsCodeLocation
                             moduleName:@"ReactNativeProject"
                             initialProperties:nil
                             launchOptions:nil];
    
    rnView.frame = CGRectMake(0, 150 , SCREEN_WIDTH , SCREEN_HEIGHT-150);

    [self.view addSubview:rnView];
}

并打开网络请求

打开网络请求

1.5 启动服务器
创建 run.sh 文件

#! /bin/bash
(cd Pods/React; npm run start)

然后给run.sh添加可执行权限:

chmod +x run.sh

启动服务器:

./run.sh
效果图

2. 手动集成框架

参考文献 : https://segmentfault.com/a/1190000004253916

手动集成框架的好处

2.1 将架包导入项目.
node_modules文件夹放到工程文件夹中
创建Libraries文件夹

项目文件夹

2.2 将.xcodeproj文件 拖拽到工程


.xcodeproj文件

.xcodeproj文件清单
node_modules/react-native/React/React.xcodeproj
node_modules/react-native/Libraries/Image/RCTImage.xcodeproj
node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj
node_modules/react-native/Libraries/Text/RCTText.xcodeproj
node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj
node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj
node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj
node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj
node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj
node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj

2.3 添加 .a 文件


添加 .a 文件

2.4 修改 Build Settings 配置文件


添加头文件搜索路径

头文件搜索路径 : $(SRCROOT)/node_modules/react-native/React

修改Other Linker Flags 配置

添加为 -ObjC

2.5 在工程中 创建index.iOS.js文件

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

export default class ReactNativeProject2 extends React.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.android.js  
        </Text>  
        <Text style={styles.instructions}>  
          Shake or press menu button for dev menu  
        </Text>  
      </View>  
    );  
  }  
};

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

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

因为集成的框架是0.37版本 , 所以只支持ES6 的写法 , 不支持ES5 (很坑)

2.6 在原生代码中添加RCTRootView 页面

- (void)createReactNativeView{
    //RCTBundleURLProvider 是0.29版本新添加的类
    NSURL *jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil];;
    
    RCTRootView *rnView = [[RCTRootView alloc]
                             initWithBundleURL:jsCodeLocation
                             moduleName:@"ReactNativeProject2"
                             initialProperties:nil
                             launchOptions:nil];
    
    rnView.frame = CGRectMake(0, 150 , SCREEN_WIDTH , SCREEN_HEIGHT-150);

    [self.view addSubview:rnView];

}

关于RCTBundleURLProvider

并打开网络请求

打开网络请求

至此手动加载框架也大功告成


下一篇准备分享 原生App 与 ReactNative的 数据交互
如果感觉还不错 , 点击喜欢鼓励一下哦 👇👇👇👇

上一篇下一篇

猜你喜欢

热点阅读