You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// 插件引入importRNFetchBlobfrom'rn-fetch-blob';// 下载方法asyncactualDownload(item){letdirs=RNFetchBlob.fs.dirs;constandroid=RNFetchBlob.android;RNFetchBlob.config({fileCache : true,path: `${dirs.DownloadDir}/${item.name}`,// android only options, these options be a no-op on IOSaddAndroidDownloads : {// Show notification when response data transmittednotification : true,// Title of download notificationtitle : '下载完成',// File description (not notification description)description : 'An file.',mime : getMimeType(item.name.split('.').pop()),// Make the file scannable by media scannermediaScannable : true,}}).fetch('GET',`${CONSTANT.SERVER_URL}${item.path}`).then(async(res)=>{awaitandroid.actionViewIntent(res.path(),getMimeType(item.name.split('.').pop()));});}
importRNFetchBlobfrom'rn-fetch-blob';checkUpdate=()=>{constandroid=RNFetchBlob.android;//下载成功后文件所在pathconstdownloadDest=`${RNFetchBlob.fs.dirs.DownloadDir}/app_release.apk`;RNFetchBlob.config({//配置手机系统通知栏下载文件通知,下载成功后点击通知可运行apk文件addAndroidDownloads: {useDownloadManager: true,title: 'RN APP',description: 'An APK that will be installed',mime: 'application/vnd.android.package-archive',path: downloadDest,mediaScannable: true,notification: true}}).fetch('GET',CONSTANT.SERVER_URL+'/appVersion/download?path='+this.newVersionInfo.path).then(res=>{//下载成功后自动打开运行已下载apk文件android.actionViewIntent(res.path(),'application/vnd.android.package-archive');});}
前言
本文基于 React Native 的实践项目进行总结, 该项目基于 React Native 和 H5 在开发效率、功能性能、用户体验等方面的差异性,对功能模块进行精心设计,主要基于我们现在实际项目的业务,结合移动端特有的特性。
本文围绕 React Native 项目的环境配置、运行,React Native 介绍,项目的主要功能介绍,React Native 开发存在的坑等多个方面进行展开。如果你还没有 React Native 开发经验,那么这篇文章将很好的向你展示 React Native 的各方面,包括官方文档、生态、兼容性等等,希望你在这篇文章中找到你想要的答案。
辛苦整理良久,还望手动点赞鼓励~
博客 github地址为:https://github.com/fengshi123/blog ,汇总了作者的所有博客,也欢迎关注及 star ~
本项目 github 地址为:https://github.com/fengshi123/react_native_project
配套的服务端 express 项目 github 地址为:https://github.com/fengshi123/express_project
一、启动项目
1.1、环境配置
在这个 React Native App 开发中,我的开发环境相关配置如下:
1.2、运行项目
(1)安装 yarn、react-native 命令行工具
(2)设置 yarn 镜像源
(3)安装第三方插件
进入到 react_native_project 目录底下,安装第三方插件:
(4)Android Studio 配置
Android Studio 的配置这里不再做介绍,可以参考 react-native 官网;
(5)编译并运行项目
(6)启动项目
第 5 步后,如果真机或模拟器提示,Metro 没有启动,可关闭第 5 步开启的 node 窗口,再重启 Metro:
(7)服务端配套项目
记得 clone 本项目配套的服务端 express 项目,并启动它。
二、React Native 介绍
“ Learn once, write anywhere ”,React Native 的定义就像是:学习 React ,同时掌握 web 与 app 两种开发技能。 React Native 使用 React 的设计模式,开发者编写 js 代码,通过 React Native 的中间层转化为原生控件和操作,拥有接近原生开发的用户体验。下面引用官网上 4 条特性:
(1)使用 JavaScript 和 React 编写原生移动应用
React Native 使你只使用 JavaScript 也能编写原生移动应用。 它在设计原理上和 React 一致,通过声明式的组件机制来搭建丰富多彩的用户界面。
(2)React Native 应用是真正的移动应用
React Native 产出的并不是“网页应用”, 或者说“HTML5应用”,又或者“混合应用”。 最终产品是一个真正的移动应用,从使用感受上和用 Objective-C 或 Java 编写的应用相比几乎是无法区分的。 React Native 所使用的基础 UI 组件和原生应用完全一致。 你要做的就是把这些基础组件使用 JavaScript 和 React 的方式组合起来。
(3)别再傻等编译了
React Native 让你可以快速迭代开发应用。 比起传统原生应用漫长的编译过程,现在你可以在瞬间刷新你的应用。开启 Hot Reloading 的话,甚至能在保持应用运行状态的情况下热替换新代码!
(4)可随时呼叫原生外援
React Native 完美兼容使用 Objective-C、Java 或是 Swift 编写的组件。 如果你需要针对应用的某一部分特别优化,中途换用原生代码编写也很容易。 想要应用的一部分用原生,一部分用 React Native 也完全没问题。
三、项目功能
3.1、功能设计
考虑到更好的体验 React Native 和 H5 在开发效率、功能性能、用户体验等方面的差异性,我们对功能模块进行精心设计,主要基于我们现在实际项目的业务,结合移动端特有的特性。相关的模块功能设计如下图所示。
3.2、功能界面展示
截取一些功能展示如下:
3.3、项目结构目录
我们的项目目录结构如下:
3.4、主要功能介绍
3.4.1、网盘功能
此模块包含功能:文件夹创建、重命名、文件上传、下载、侧滑操作、长按列表操作、下拉刷新操作、文件预览(包含图片)等。
3.4.1.1 文件列表长按操作
(1) 使用插件
(2)功能实现
在
react_native_project/src/pages/netDisk/NetDisk.js
组件中实现相应逻辑,关键代码及注释如下:(3)注意事项
(4)参考文档
3.4.1.2 文件侧滑操作
(1)使用插件
(2)功能实现
在
react_native_project/src/pages/netDisk/NetDisk.js
组件中实现相应逻辑,关键代码及注释如下:(3)注意事项
(4)参考文档
3.4.1.3 文件下载
(1) 使用插件
(2)功能实现
因为该插件涉及到 Android 原生功能,所以配置完该插件,需要重新编译 Android。
在
react_native_project/src/pages/netDisk/NetDisk.js
组件中实现相应逻辑,关键代码及注释如下:(3)注意事项
(4)参考文档
3.4.1.4 文件上传
(1)使用插件
(2)功能实现
因为该插件涉及到 Android 原生功能,所以添加完该插件,需要重新编译 Android。
在
react_native_project/src/pages/netDisk/NetDisk.js
组件中实现相应逻辑,关键代码及注释如下:(3)注意事项
(4)参考文档
3.4.1.5 文件预览(txt、office文件、pdf等)
(1) 使用插件
(2)功能实现
因为该插件涉及到 Android 原生功能,所以添加完该插件,需要重新编译 Android。
在
react_native_project/src/pages/netDisk/NetDisk.js
组件中实现相应逻辑,关键代码及注释如下:(3)注意事项
node_modules/react-native-doc-viewer/android/src/main/java/com/reactlibrary/RNReactNativeDocViewerModule.java
文件中删除
import com.facebook.react.views.webview.ReactWebViewManager;
(4)参考文档
3.4.1.6 图片预览
(1) 使用插件
(2)功能实现
在
react_native_project/src/pages/netDisk/NetDisk.js
组件中实现相应逻辑,关键代码及注释如下:(3)注意事项
(4)参考文档
3.4.2、视听学习
此模块包含功能:音/视频上传、下载、删除、判断网络、播放、全屏播放、转向全屏播放、评论、分享等功能,其中上传、下载、删除功能在网盘模块和试题模块已说明。
3.4.2.1 视频播放功能
(1)使用插件
(2)功能实现
因为该插件涉及到 Android 原生功能,所以添加完该插件,需要重新编译 Android。
在
react_native_project/src/pages/video/VideoPlayer.js
组件中实现相应逻辑,关键代码及注释如下:(3)参考文档
3.4.2.2 视频最大化、转向
(1) 使用插件
(2)功能实现
因为该插件涉及到 Android 原生功能,所以添加完该插件,需要重新编译 Android。
在
react_native_project/src/pages/video/VideoPlayer.js
组件中实现相应逻辑,关键代码及注释如下:(3)参考文档
3.4.2.3 微信、朋友圈分享
(1) 使用插件
(2)功能实现
因 8000 该插件涉及到 Android 原生功能,所以添加完该插件,需要重新编译 Android。
在
react_native_project/src/components/video/VideoShare.js
组件中实现相应逻辑,关键代码及注释如下:(3)参考文档
3.4.3、试题模块
3.4.3.1、拍照 & 上传图片 创建试题功能
(1)使用插件
(2)功能实现
因为该插件涉及到 Android 原生功能,所以添加完该插件,需要重新编译 Android。
在
react_native_project/src/components/exam/ImageAudioTab.js
组件中实现相应逻辑,关键代码及注释如下:(3)注意事项
(4)参考文档
3.4.3.2、语音录入 创建试题功能
(1) 使用插件
(2)功能实现
因为语音录入插件涉及到 Android 原生功能,所以添加完该插件,需要重新编译 Android。
在
react_native_project/src/components/exam/ImageAudioTab.js
组件中实现相应逻辑,关键代码及注释如下:(3)注意事项
(4)参考文档
3.4.3.3、图表实现成绩统计
(1) 使用插件
(2)功能实现
因为该插件涉及到 Android 原生功能,所以添加完该插件,需要重新编译 Android。
在
react_native_project/src/pages/exam/ResultStatistics.js
组件中实现相应逻辑,关键代码及注释如下:(3)注意事项
(4)参考文档
3.4.4、其它
3.4.4.1、电话 & 短信功能
(1)使用插件
(2)功能实现
在
react_native_project/src/components/user/ListItem.js
组件中实现相应逻辑,关键代码及注释如下:(3)注意事项
(4)参考文档
3.4.4.2、手机定位功能
(1) 使用插件
(2)功能实现
在
react_native_project/android/app/src/main/java/com/react_native_project/module
目录中创建实现类 LocationModule.java,需要注意的是这个类需要实现 ReactContextBaseJavaModule 这个类:对刚刚实现定位功能的模块进行注册,在
react_native_project/android/app/src/main/java/com/react_native_project/module
目录中创建注册包管理类 LocationReactPackage .java,相关逻辑如下:在
react_native_project/android/app/src/main/java/com/react_native_project/MainApplication.java
中添加包管理类,相关逻辑如下:我们在
react_native_project/src/components/user/ListItem.js
组件中实现相应逻辑,关键代码及注释如下:(3)注意事项
(4)参考文档
3.4.4.3、在线升级
(1) 使用插件
(2)功能实现
因为该插件涉及到 Android 原生功能,所以添加完该插件,需要重新编译 Android。
我们实现在线升级功能的大概逻辑是,在 app 管理端上传 apk 安装包,然后点击发布,这时服务端会通过 websocket 将最新发布的版本号通知 app,app 收到最新版本号,会跟当前的 app 版本比较,如果当前版本号小于最新版本号,则会弹窗提示有最新版本,询问用户是否下载安装,用户如果确认安装最新版本,则会从服务器下载最新的 apk,并进行安装。在
react_native_project/src/components/user/ListItem.js
组件中实现相应逻辑,关键代码及注释如下:(3)注意事项
(4)参考文档
四、react 开发踩的坑
4.1、运行 react-native run-android 出现错误:Task :app:mergeDebugAssets FAILED OR Task :app:processDebugResources FAILED 。
解决:
4.2、如果手机真机出现连接不上开发开发服务器的情况。
解决:
命令窗口运行以下命令:
4.3、kotlin 相关 jar 包无法下载。
解决:
对应的插件的 android/build.gradle 配置阿里云仓库(例如遇到这个问题时,是在插件 react-native-webview)
4.4、文件预览插件:react-native-doc-viewer安装完 run-android 编译失败。
解决:
4.5、第三方插件 rn-fetch-blob 下载文档无法打开。
解决:
五、总结
本文主要基于 React Native 框架的实践进行总结,分享了 React Native 理念、React Native 项目的功能介绍、React Native 项目编译以及 React Native 存在的一些坑,希望对完全阅读完的你有启发和帮助,如果有不足,欢迎批评、指正、交流!
姐妹篇《 Weex 实践总结 》,可以进行 React Native 和 Weex 的对比。
辛苦整理良久,还望手动点赞鼓励~
博客 github地址为:https://github.com/fengshi123/blog ,汇总了作者的所有博客,也欢迎关注及 star ~
本项目 github 地址为:https://github.com/fengshi123/react_native_project
配套的服务端 express 项目 github 地址为:https://github.com/fengshi123/express_project
The text was updated successfully, but these errors were encountered: