写点什么

ReactNative | 通过文件下载 / 打开需求,聊聊使用三方库

用户头像
梁龙先森
关注
发布于: 2020 年 12 月 30 日
ReactNative | 通过文件下载/打开需求,聊聊使用三方库

背景

RN 用于跨端开发,整体上为开发 APP 节省了不少资源,也为前端人员碰触 APP 领域降低了门槛。但作为 RN 新人使用 RN 开发的呕心沥血历程,这里借助文件下载、打开的需求,看看三方库的使用思路。


需求:下载文件、并打开文件。


整体思路如下:

1.  选型依赖包

2.  npm 下载依赖包

3.  项目集成依赖

4.  业务实现

5.  修改依赖模块  // 但有时候依赖包就是那么不凑巧,在当前版本版本跑不动,那么要多走一步

1.  选型依赖包

使用三方库会带来风险,可能存在恶意包,因此我们选择三方库可以参照以下几点:

1.  寿命,是否有无废弃风险

2.  点赞历史数据

3.  头部贡献值活跃度(代码提交频率)

4.  性能

5.  安全

// 文件系统访问react-native-fs  // 允许您使用默认应用程序在设备上打开文件(mp3,mp4,pdf,word,excel,dwg等)react-native-file-opener
复制代码

2. npm 下载依赖包

RN 的依赖包若碰上版本问题,且三方库并未做升级,本地进行修改的时候一定要注意。若项目依赖的包版本未锁住,去执行install操作的时候,会重新执行安装将node_modules模块下的三方库进行覆盖。建议把修改的依赖包先行从node_modules移出来放别目录。

npm install react-native-fs --savenpm install react-native-file-opener --save
复制代码

3. 项目集成依赖

3.1 IOS 集成
1. in the XCode's "Project navigator", right click on your project's Libraries folder ➜ Add Files to2. Go to node_modules ➜ react-native-file-opener ➜ ios ➜ select RNFileOpener.xcodeproj3. Add libRNFileOpener.a to Build Phases -> Link Binary With Libraries4. Compile and have fun
复制代码
3.2 Android 集成
  1. 修改构建脚本

// file: android/settings.gradle ...include ':react-native-file-opener'project(':react-native-file-opener').projectDir = new File(settingsDir, '../node_modules/react-native-file-opener/android')
复制代码


// file: android/app/build.gradle ...dependencies {   ...   compile project(':react-native-file-opener')}
复制代码
  1. 注册模块

// file: MainActivity.java     ...import com.fileopener.FileOpenerPackage;//<- import package  public class MainActivity extends ReactActivity {    /**   * A list of packages used by the app. If the app uses additional views   * or modules besides the default ones, add more packages here.   */    @Override    protected List<ReactPackage> getPackages() {        return Arrays.<ReactPackage>asList(            new MainReactPackage(), //<- Add comma             new FileOpenerPackage() //<- Add package         );    }...}
复制代码

4. 业务实现

需求:下载文件,并打开,显示下载进度。

import{  Alert}from "react-native"const RNFS = require("react-native-fs");const FileOpener = require("react-native-file-opener");
let savePath = Platform.OS === 'ios' ? RNFS.DocumentDirectoryPath : RNFS.ExternalDirectoryPath;let toFilePath = savePath + "/1.pdf" // 文件路径let url = "" // 文件下载地址let fileType = "application/pdf"
let begin = res => { this.setState({ downloading: true })}
let progress = data => { var text = JSON.stringify(data) if (this.state.progress < 100) { if (text.contentLength > 0) { var num = this.state.progress + 1 this.setState({ progress: num }) } else { var num = Math.round(data.bytesWritten / 10000) if (num < 100) { this.setState({ progress: num }) } } }}
// 判断文件是否存在RNFS.exists(toFilePath).then(exists => { if (exists) { FileOpener.open( toFilePath, fileType ).then(() => { // console.log('success!!'); }, (e) => { console.log(e) Alert.alert('提示', '打开文件失败,请先安装对应文件阅读器') }) } else { // 下载文件 const downRet = RNFS.downloadFile({ fromUrl: url, toFile: toFilePath, progress: progress, begin: begin }) downRet.promise.then(res => { this.setState({ downloading: false, progress: 0 }) // 打开文件 FileOpener.open( toFilePath, fileType ).then(() => { console.log('打开成功') }, (e) => { Alert.alert('提示', '打开文件失败,请先安装PDF阅读器') }) }).catch(err => { this.setState({ downloading: false, progress: 0 }) Alert.alert('提示', '下载文件失败,错误原因:' + err) }) }})
复制代码

5. 修改依赖模块

  1. 问题:引入的模块对象报undefined

解决方法:项目重新集成依赖 

  1. 问题:IOS 集成编译报错:Redefinition of 'RCTMethodInfo'

解决办法:修改文件nodes_modules/react-native-file-opener/ios/RNFileOpener.h

// 修改:#import "RCTBridgeModule.h"
// 变更为:#if __has_include(<React/RCTAssert.h>)#import <React/RCTBridgeModule.h>#else#import "RCTBridgeModule.h"#endif
复制代码

6. 总结

至此总结了正常使用三方库的流程,切记三方库可能有版本问题,需要调整。

发布于: 2020 年 12 月 30 日阅读数: 41
用户头像

梁龙先森

关注

脚踏V8引擎的无情写作机器 2018.03.17 加入

还未添加个人简介

评论

发布
暂无评论
ReactNative | 通过文件下载/打开需求,聊聊使用三方库