搭建环境:https://reactnative.cn/docs/getting-started/,
分mac/win/linux,平台分android/ios。node
使用rn建立一个项目和把rn技术集成到一个现有的原生项目是有差异的。react
//建立和运行一个rn项目: react-native init AwesomeProject cd AwesomeProject react-native run-ios
编译和运行须要一段时间...耐心等待..根据rn版本的不一样,ios虚拟机也不不一样,好比最新的0.57版本的是iphoneX,低版本的rn默认创造的ios虚拟机就老一点。linux
注意官网中特别提到:android
!!!注意!!!:init 命令默认会建立最新的版本,而目前最新的 0.45 及以上版本须要下载 boost
等几个第三方库编译。这些库在国内即使FQ也很难下载成功,致使不少人没法运行iOS项目!!!中文网在论坛中提供了这些库的国内下载连接。若是你嫌麻烦,又没有对新版本的需求,那么能够暂时建立0.44.3的版本。webpack
我在rn版本0.57.5,react-cli版本2.0.1直接init建立项目没有遇到以上问题。ios
https://github.com/ZhangMingZhao1/react-native-pratice/tree/master/earphone_guidegit
这里以一个rn集成到ios object-c为例,现实中这种状况可能也更多一些。github
用xcode新建一个单页面应用,语言选择object-c,名字为ReactNativeDemo,在项目根目录下,新建ReactNative文件夹,用于存放跟reactnative相关文件。(后面简称rn)web
在rn文件夹中新建一个package.json,内容为:npm
{ "name": "ReactNativeDemo", "version": "0.0.1", "private": true, "scripts": { "start": "node node_modules/react-native/local-cli/cli.js start" }, "dependencies": { "react": "16.0.0", "react-native": "0.51.0" } }
注意版本严格规定
进入rn文件夹,npm install,在rn文件夹新建index.js,之前版本是inex.ios.js。
内容为:
import React, { Component } from 'react'; import { AppRegistry, StyleSheet, Text, View } from 'react-native'; class ScoresView extends React.Component { render() { var contents = this.props['scores'].map((score) => ( <Text key={score.name}> {score.name}:{score.value} {'\n'} </Text> )); return ( <View style={styles.container}> <Text style={styles.highScoresTitle}>2048 High Scores!</Text> <Text style={styles.scores}>{contents}</Text> </View> ); } } const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: '#FFFFFF', }, highScoresTitle: { fontSize: 20, textAlign: 'center', margin: 10, }, scores: { textAlign: 'center', color: '#333333', marginBottom: 5, }, }); // 注册组件,程序入口 // 第一个参数:注册模块名称,这里亲测不和项目名一致也能够,可是好多资料说名字要和项目名一致 // 第二个参数:函数,此函数返回组件类名,程序启动就会自动去加载这个组件 AppRegistry.registerComponent('App', () => ScoresView);
进入项目根目录,安装cocoapods,
brew install cocoapods
个人mac下会报个错,在一个文件下没有权限写入,而homebrew如今禁止使用sudo执行,根据提示的指令能够收回那个文件的权限,复制粘贴执行就好。
安装好后,在根目录使用pod init,在生成的Podfile中内容改成:
source 'https://github.com/CocoaPods/Specs.git' react_native_path = './ReactNative/node_modules/react-native' platform :ios, ‘9.0’ use_frameworks! target 'ReactNativeDemo' do # 'node_modules'目录通常位于根目录中 # 可是若是你的结构不一样,那你就要根据实际路径修改下面的`:path` pod 'React', :path => react_native_path, :subspecs => [ 'Core', #'BatchedBridge', # 0.45 版本之后须要添加 'CxxBridge', 'DevSupport', # 若是RN版本 >= 0.43,则须要加入此行才能开启开发者菜单 'RCTText', 'RCTImage', 'RCTNetwork', 'RCTWebSocket', # 这个模块是用于调试功能的 # 在这里继续添加你所须要的模块 ] # 若是你的RN版本 >= 0.42.0,则加入下面这行 pod 'yoga', :path => react_native_path + '/ReactCommon/yoga' # Third party deps pod 'DoubleConversion', :podspec => react_native_path + '/third-party-podspecs/DoubleConversion.podspec' pod 'GLog', :podspec => react_native_path + '/third-party-podspecs/GLog.podspec' pod 'Folly', :podspec => react_native_path + '/third-party-podspecs/Folly.podspec' end
这个文件相似npm的package.json,记录了所需文件的依赖,因此下一步就是
pod install
在总ios项目中修改http的安全策略,在info.plist加上:
<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>localhost</key> <dict> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> </dict> </dict>
用xcode打开项目,在Main.storyboard拖入一个按钮,在ViewController.m中加入头文件:
#import <React/RCTRootView.h>
再增长一个按钮的跳转方法:
- (IBAction)pushToReactNativeView:(id)sender { NSURL *jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.bundle?platform=ios"]; RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL: jsCodeLocation moduleName: @"App" initialProperties: @{ @"scores" : @[ @{ @"name" : @"Alex", @"value": @"42" }, @{ @"name" : @"Joel", @"value": @"10" } ] } launchOptions: nil]; UIViewController *vc = [[UIViewController alloc] init]; vc.view = rootView; [self presentViewController:vc animated:YES completion:nil]; }
可能会出现加载出错,这是由于pod install安装的文件没有加载进来,重启xcode项目,从新打开项目便可。
而后把ViewController.m文件中的#import <fishhook/fishhook.h> 改成 #import "fishhook.h",否则后面运行可能会报错。
给这个按钮和这个方法绑定起来,进入keyboard,按住 ctrl,点击按钮会出现一个箭头,指向左上角的ViewContrller,可出现一个框,选择刚才写的pushToReactNativeView方法,会在右下角看到关联了。
这部可详见iOS学习之基础控件添加和事件绑定,推荐一个连接:https://www.jianshu.com/p/6eb302a62956
进入到rn文件夹,npm start 启动node服务器,这时会进入dev状态,动态打包。回到xcode,运行项目,点击按钮,就会看到跳转到rn写的页面。
在rn项目根目录中建立release_ios 文件夹,(打包必须建立文件夹)具体能够本身命名,做为资源目标的输出文件目录。
在根目录下执行打包命令:
react-native bundle --entry-file index.js --platform ios --dev false --bundle-output release_ios/main.jsbundle --assets-dest release_ios/
会看到release_ios下多出assets文件夹(若是有图片),和两个jsbindle文件.
将main.jsbundle和assets拖入Xcode的项目导航面板中,选择默认导入便可(位置和里面的文件夹同级)
修改上面的ViewController,m,
将端口动态引入改成本地,让React Native去使用咱们刚才导入的jsbundle,这样以来咱们就摆脱了对本地nodejs服务器的依赖。固然也能够将jsbundle 放到本身的远程服务器中,更换远程的服务器文件就能够加载jsbundle,为了提升性能咱们能够在本地作一次缓存。@后面是本身打包文件的名字不加后缀。
ios app的打包就能够看官网了:https://developer.apple.com/support/app-store-connect/