美文网首页RNReact Native开发iOS Developer
(iOS)React-Native集成到本地,实现与Native

(iOS)React-Native集成到本地,实现与Native

作者: 程序猿孙哥哥 | 来源:发表于2017-11-20 15:40 被阅读59次

一、新建一个工程,名为RNAndiOS(名字随便)

image.png

二、创建一个存放react-native的文件夹RN(名字随意)

image.png

三、RN文件夹下新建一个名为package.json的文件和一个index.ios.js的文件

package.json:
{
    "name": "RNAndiOS",
    "version": "0.0.1",
    "private": true,
    "scripts": {
        "start": "node node_modules/react-native/local-cli/cli.js start",
        "test": "jest"
    },
    "dependencies": {
        "react": "^16.0.0-alpha.12",
        "react-native": "^0.47.2"
    },
    "devDependencies": {
        "babel-jest": "20.0.3",
        "babel-preset-react-native": "3.0.2",
        "jest": "20.0.4",
        "react-test-renderer": "16.0.0-alpha.12"
    },
    "jest": {
        "preset": "react-native"
    }
}
index.ios.js:
import React, { Component } from 'react';
import {
    AppRegistry,
    StyleSheet,
    Text,
    View
} from 'react-native';

export default class RNAndiOS extends Component {
    render() {
        return (
            <View style={styles.container}>
                <Text style={styles.welcome}>
                    iOS RN  混合开发的Demo
                </Text>
            </View>
        )
    }
}

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

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

五、cd到RN文件夹,执行npm install命令,安装成功后文件夹如下:

image.png

六、在项目根目录下创建Podfile(需要cocoapods,版本要最新的,不是的更新一下,不然会报错),然后执行pod install命令

Podfile:
platform :ios, '8.0'
target "RNAndiOS" do

pod 'Yoga',  :path => ‘./RN/node_modules/react-native/ReactCommon/yoga'
pod 'React', :path => ‘./RN/node_modules/react-native', :subspecs => [
 'Core',
 'RCTText',
 'RCTImage',
 'RCTAnimation',
 'RCTNetwork’,
 'RCTWebSocket',
 'BatchedBridge' 
]

end

七、安装完成后文件夹如下:

image.png

八、打开RNAndiOS.xcworkspace(不是RNAndiOS.xcodeproj),为了方便测试后面的RN与原生的互调,我们在项目里放一个导航控制器。

项目结构:
image.png
AppDelegate:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    ViewController *root = [[ViewController alloc] init];
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:root];
    self.window.rootViewController = nav;
    [self.window makeKeyAndVisible];
    return YES;
}
ViewController:
#import "ViewController.h"
#import "SecondViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor lightGrayColor];
    
    UIButton *pushButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [pushButton setTitle:@"点我去RN" forState:UIControlStateNormal];
    pushButton.frame = CGRectMake(100, 100, 100, 100);
    [pushButton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
    [pushButton addTarget:self action:@selector(pushToRN) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:pushButton];
}

- (void)pushToRN {
    SecondViewController *second = [[SecondViewController alloc] init];
    [self.navigationController pushViewController:second animated:YES];
}

@end
SecondViewController:
#import "SecondViewController.h"
#import <React/RCTRootView.h>
#import "RNSendBridgeModule.h"

#define KMainScreenW [UIScreen mainScreen].bounds.size.width
#define KMainScreenH [UIScreen mainScreen].bounds.size.height
#define isIphoneX (KMainScreenH == 812 ? YES : NO)

@interface SecondViewController ()

@end

@implementation SecondViewController

- (void)viewDidLoad {
    [super viewDidLoad]; 
    self.view.backgroundColor = [UIColor whiteColor];

    NSURL *jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle?platform=ios&dev=true"];
    RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation moduleName:@"RNAndiOS" initialProperties:nil launchOptions:nil];
    rootView.backgroundColor = [UIColor whiteColor];
    rootView.frame = CGRectMake(0, isIphoneX?88:64, KMainScreenW, isIphoneX?KMainScreenH-122:KMainScreenH-64);//简单适配一下iPhone X
    [self.view addSubview:rootView];
}
@end
至此,准备工作结束。ViewController是原生,SecondViewController是react-native界面

九、cd到RN目录,执行 react-native start 命令,执行成功后直接运行项目。运行项目前记得在info.plist中配置允许http请求,不然会大红屏。也许会加载的有点慢,这很正常,因为debug模式的RN和release模式的RN简直不是同一个东西。

react-native start成功运行后是这样的:
image.png
iPhone X模拟器截图:
Simulator Screen Shot - iPhone X - 2017-11-20 at 15.35.16.png

至此React-Native已经集成到本地,RN和Native的交互在下一篇文章文章链接

遇到红屏不要急,网上查错误信息,查不到看一下npm install有没有警告,是不是少安装了什么组件。还有cocoapod是不是最新的,info.plist有没有配置允许http请求,Podfile,packa.json,SecondViewController里的项目名有没有写错。

相关文章

网友评论

    本文标题:(iOS)React-Native集成到本地,实现与Native

    本文链接:https://www.haomeiwen.com/subject/plsvvxtx.html