iOS原生混合RN开发详解

做过原生iOS开发或者Android开发的同学们肯定也都了解Hybrid,有一些Hybrid的开发经验,目前我们企业开发中运用最广泛的Hybrid App技术就是原生与H5 hybrid,在早期的时候,可能部分同学也接触过PhoneGap等hybrid技术,今天我们就简单来聊下一种比较新的Hybrid技术方案,原生App与ReactNativie Hybrid,如果有同学们对React Native技术不熟悉的同学,可以查看作者简书中对React Native基础的讲解:React Native入门到实战讲解

示例Demo地址

  • 初级Demo示例
  • 高级Demo示例

image

具体步骤

  • 创建一个iOS原生项目
  • 将iOS原生项目支持pod
  • 调整目前项目工程的文件夹结构
  • 添加RN依赖相关文件
  • 安装React Native
  • 修改Podfile文件,原生安装React Native依赖库
  • 在iOS原生页面填加RN页面入口
  • 修改RN入口文件 index.ios.js
  • 执行npm start 运行项目

创建一个iOS原生项目

使用Xcode创建一个空的项目,这个应该不用多说了

image

项目支持pod

这一操作步骤同样也很简单,我们只需要执行下面的几条命令即可,如果对cocoapods 安装使用不熟悉的同学请参照作者简书

  • 创建podfile文件,我们在有xcodeproj文件的同级目录下执行下面命令,这时我们的项目文件中就多了一个Podfile文件
$ pod init
  • 执行pod install 命令来安装pod,同样,这个命令也是在有xcodeproj同级目录下,安装完成后,我们的项目多了一个
$ pod install

image

image

注意: 这里对原生iOS不熟悉的同学们需要注意了,当我们使用pod来作为库管理工具,后面我们打开项目运行,我们就需要打开上图所示的xcworkspace文件了

调整目前项目工程的文件夹结构

这里对文件夹做结构调整是为了后期更好的将Android原始项目也使用RN Hybrid,使iOS和Android共享一份React Native框架,共享同一份JS文件,调整的后的文件夹结构如下

image

添加RN依赖相关文件

到这里,我们原生的iOS项目目录结构已近调整完毕,后面我们需要处理的都是RN相关的内容了,这里需要创建的文件有点多,大家可以直接将示例Demo中的这几个文件直接拖到自己的项目中,然后在做修改即可

  • 首先我们需要创建package.json文件
  • 创建index.ios.js文件
  • 创建index.android.js文件
  • 创建bundle文件夹,注意这个文件夹是后面我们接入CodePush热更新时使用的

安装React Native

安装React Native这个也很简单,我们也是简单的执行下面的命令即可,注意:执行npm 系列的命令,我们都需要在项目根目录(有package.json文件的目录)下执行

$ npm install

package.json文件内容如下

{"name": "iOSHybridRNDemo","version": "0.0.1","private": true, "scripts": { "start": "node node_modules/react-native/local-cli/cli.js start" }, "dependencies": { "prop-types": "^15.6.1", "react": "16.0.0", "react-native": "0.50.3", "react-native-code-push": "^5.2.2", "react-native-root-toast": "^1.3.0", "react-native-router-flux": "^4.0.0-beta.24", "react-native-simple-store": "^1.3.0", "react-native-storage": "^0.2.2", "react-native-vector-icons": "^4.3.0", "react-redux": "^5.0.6", "redux": "^3.7.2", "redux-actions": "^2.2.1", "redux-promise-middleware": "^4.4.1", "redux-thunk": "^2.2.0" }, "devDependencies": { "babel-jest": "22.4.1", "babel-preset-react-native": "4.0.0", "jest": "22.4.2", "react-test-renderer": "16.0.0" }, "jest": { "preset": "react-native" } } 

注意:因为我们项目中使用到了react-native-vector-icons 这个iconFont组件需要依赖原生,所以我们执行完 npm install 之后,我们还需要 再执行一个 react-native link react-native-vector-icons 命令来安装原生依赖

$ react-native link react-native-vector-icons

image

当我们执行完npm install 命令之后,我们再打开项目目录,发现多了一个 node_modules 文件夹,这个文件夹就是我们安装的React Native所有的依赖库

修改Podfile文件,原生安装React Native依赖库

后面我们都是使用Pod来管理原生的依赖库,安装React Native依赖库,我们只需要将下面的Podfile文件中的内容添加进去,执行 pod install 安装即可

Podfile文件

# Uncomment the next line to define a global platform for your projectplatform :ios, '9.0'
# Uncomment the next line if you're using Swift or would like to use dynamic frameworks
# use_frameworks! target 'iOSHybridRNDemo' do # Pods for iOSHybridRNDemo #***********************************************************************# # 'node_modules'目录一般位于根目录中 # 但是如果你的结构不同,那你就要根据实际路径修改下面的`:path` pod 'React', :path => '../node_modules/react-native', :subspecs => [ 'Core', 'RCTText', 'RCTImage', 'RCTActionSheet', 'RCTGeolocation', 'RCTNetwork', 'RCTSettings', 'RCTVibration', 'BatchedBridge', 'RCTWebSocket', 'ART', 'RCTAnimation', 'RCTBlob', 'RCTCameraRoll', 'RCTPushNotification', 'RCTLinkingIOS', 'DevSupport' # 在这里继续添加你所需要的模块 ] # 如果你的RN版本 >= 0.42.0,请加入下面这行 pod "yoga", :path => "../node_modules/react-native/ReactCommon/yoga" #***********************************************************************# pod 'RNVectorIcons', :path => '../node_modules/react-native-vector-icons' end 

注意: #*************************# 中间的内容是我们需要添加的RN依赖库,后面我们所有pod 相关的命令,我们都需要iOS根目录(有Podfile文件的目录)下执行

  • 执行安装命令
$ pod install

image

在iOS原生页面填加RN页面入口

现在我就来实现从原生页面跳RN页面

  • 使用RN提供一个View视图代码如下
NSURL * jsCodeLocation;
#ifdef DEBUGNSString * strUrl = @"http://localhost:8081/index.ios.bundle?platform=ios&dev=true";jsCodeLocation = [NSURL URLWithString:strUrl]; #else jsCodeLocation = [CodePush bundleURL]; #endif NSDictionary *params = @{@"componentName":@"MeApp1", @"args":@{@"params":@"这是原生传递的参数"}}; RCTRootView * rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation moduleName:@"iOSRN" initialProperties:params launchOptions:nil]; self.view = rootView; 

修改RN入口文件 index.ios.js

修改RN页面的入口文件,这里当是iOS入口我们修改index.ios.js文件,当Android入口,我们修改index.android.js文件

  • index.ios.js文件
import React, {Component} from 'react'
import {Platform,StyleSheet,Text,View,AppRegistry
} from 'react-native'; const instructions = Platform.select({ ios: 'Press Cmd+R to reload,\n' + 'Cmd+D or shake for dev menu', android: 'Double tap R on your keyboard to reload,\n' + 'Shake or press menu button for dev menu', }); type Props = {}; export default class App extends Component<Props> { render() { return ( <View style={styles.container}> <Text style={styles.welcome}> Welcome to React Native! </Text> <Text style={styles.instructions}> To get started, edit App.js </Text> <Text style={styles.instructions}> {instructions} </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('iOSHybridRNDemo', () => App) 

执行npm start 运行项目

到这里,我们一个简单的原生嵌入RN开发工程就搭建完成了,我们执行下面命令来运行项目,查看效果

  • 开启node 服务
$ npm start
  • 运行效果

image

福利时间

  • 作者React Native开源项目OneM地址(按照企业开发标准搭建框架完成开发的):https://github.com/guangqiang-liu/OneM:欢迎小伙伴们 star
  • 作者简书主页:包含60多篇RN开发相关的技术文章http://www.jianshu.com/u/023338566ca5欢迎小伙伴们:多多关注,多多点赞
  • 作者React Native QQ技术交流群:620792950 欢迎小伙伴进群交流学习
  • 友情提示:在开发中有遇到RN相关的技术问题,欢迎小伙伴加入交流群(620792950),在群里提问、互相交流学习。交流群也定期更新最新的RN学习资料给大家,谢谢大家支持!

转载于:https://www.cnblogs.com/guangqiang/p/9595710.html

iOS原生混合RN开发最佳实践相关推荐

  1. iOS应用开发最佳实践

    <iOS应用开发最佳实践> 基本信息 作者: 王浩 出版社:电子工业出版社 ISBN:9787121207679 上架时间:2013-7-22 出版日期:2013 年8月 开本:16开 页 ...

  2. 《Web前端开发最佳实践》——1.2 Web前端开发现状

    本节书摘来自华章计算机<Web前端开发最佳实践>一书中的第1章,第1.2节,作者:党 建 更多章节内容可以访问云栖社区"华章计算机"公众号查看. 1.2 Web前端开发 ...

  3. QCon北京2015:移动开发最佳实践专题前瞻

    从社交到游戏,从电商到O2O,移动互联网已经深入渗透到各行各业,而外卖和打车市场,更是正在经历着一些深刻的变化.巨额的融资和庞大的用户群当然是吸引眼球的,但是小团队背后的故事或许也能让你眼前一亮.不同 ...

  4. web前端开发最佳实践_学习前端Web开发的最佳方法

    web前端开发最佳实践 为什么要进行网站开发? (Why web development?) Web development is a field that is not going anywhere ...

  5. Web前端开发最佳实践(3):前端代码和资源的压缩与合并

    一般在网站发布时,会压缩前端HTML.CSS.JavaScript代码及用到的资源文件(主要是图片文件),目的是加快文件在网络中的传输,让网页更快的展现.当然,CDN分发.缓存等方式也是加快代码或资源 ...

  6. android 首页接口设计方案,Android开发最佳实践——1.接口设计

    Android开发最佳实践--1.接口设计 一个项目刚开始的时候,最需要确认的就是接口设计了:数据如何传递,使用什么格式什么协议乃至如何保证安全性.如果一个项目的接口设计不合理--比如没有考虑到安全性 ...

  7. web前端开发最佳实践_Web开发人员和设计师的最佳黑色星期五优惠

    web前端开发最佳实践 As Black Friday 2016 is here, we thought that web developers and web designers should al ...

  8. 微信公众平台开发最佳实践(第2版)

    <微信公众平台开发最佳实践 第2版> 微信公众平台开发经典之作全新改版,精心挑选最经典的商业项目开发,成千上万人次微信公众平台开发者从中受益 前言 出版说明 自从方倍工作室在博客园推出微信 ...

  9. 微信公众平台开发最佳实践

    <微信公众平台开发最佳实践>共分10章,案例程序采用广泛流行的PHP.MySQL.XML.CSS.JavaScript.HTML5等程序语言及数据库实现.系统完整地介绍微信公众平台基础接口 ...

最新文章

  1. C#统计一段时间内有多少个星期几
  2. 【深度学习】手把手教你实现一个人工智能案例(蓄电池爬碱识别)
  3. PHP 常用函数及其它功能
  4. 友元函数 友元类 友元成员函数
  5. [js] 在不支持js的浏览器中如何隐藏JavaScript代码?
  6. 【剑指offer】面试题53 - II:0~n-1中缺失的数字(java)
  7. [luoguP3068] [USACO13JAN]派对邀请函Party Invitations(stl大乱交)
  8. vi/vim使用进阶: quickfix
  9. RSA攻击手法及相应例题解析
  10. 华为无线路由器信道怎么测试软件,华为路由WS5200怎么修改wifi信道
  11. Python初学笔记(4)
  12. 智能计算作业——差分进化算法求解函数最值
  13. 如何使用JS实现banner图滚动
  14. Linux的root权限安装nvm后可用,切换用户以后报nvm: command not found解决办法
  15. LT8522EX 是 Lontium 的矩阵开关芯片基于两路输入,输出 (VGA 和 HDMI)
  16. Ubuntu18.04人工智能环境搭建
  17. 地理信息系统(GIS)的前沿技术综述
  18. Python YouTube频道的终极清单
  19. Python 还原控制SCI论文算法系列1: 基于策略迭代的自适应最优控制器设计
  20. 解决Vivado HLS 高层综合失败

热门文章

  1. pagex,screenx,clientx的差别
  2. 使用 ODP.NET 访问 Oracle(.net如何访问Oracle)详解
  3. C#用户进行LDAP验证并返回员工信息
  4. Python模块学习 ---- zlib 数据压缩
  5. java 高性能代码_[Java教程]Javascript高性能代码(一)
  6. VMware15.5安装Linux虚拟机(Centos7)图文教程
  7. L1-076 降价提醒机器人 (10 分)-PAT 团体程序设计天梯赛 GPLT
  8. L1-011. A-B-PAT团体程序设计天梯赛(GPLT)
  9. AngularJS最理想开发工具WebStorm
  10. (亲测可行)vivo设备一键激活xposed框架方法