反应原生背景下载

时间:2017-04-26 10:51:25

标签: android ios react-native

我即将构建一个本地存储多个MySqlite * .db文件的应用程序。这些用于使用数据填充应用程序。

应用程序应定期检查其中一个文件是否有较新版本,如果有,请下载并替换旧版本的文件。 此更新过程应在后台进行,而应用程序处于非活动状态甚至关闭。

我见过几个插件,可用于在后台执行任务(如https://www.npmjs.com/package/react-native-background-task)。这可以用于定期检查更新,但iOS上30秒的时间限制可能不足以下载* .db文件。此外,该插件强制最低Android API版本为21。

我的问题是:是否可以在后台轮询更新并下载它们,替换旧文件?

2 个答案:

答案 0 :(得分:2)

我找到了一些有用的插件。

<强> 1。反应天然取入团块

https://github.com/wkh237/react-native-fetch-blob/wiki/Classes#rnfetchblobconfig

它有IOSBackgroundTask选项。

RNFetchBlob
.config({
  path : dest_file_path,
  IOSBackgroundTask: true,
  overwrite: true,
  indicator: true,
})
.fetch('GET', download_url, {
  //some headers ..
})
.progress( (received, total) => {
    console.log('progress : '+ received + ' / ' + total);
})
.then((res) => {
  console.log('# The file saved to :', file_path);
})

顺便说一下,它看起来不能正常工作。 不确定我是否错过了什么...

<强> 2。反应天然-FS

https://github.com/itinance/react-native-fs#downloadfileoptions-downloadfileoptions--jobid-number-promise-promisedownloadresult-

  const ret = RNFS.downloadFile({
    fromUrl: download_url, 
    toFile: dest_file_path,
    connectionTimeout: 1000 * 10,
    background: true,
    discretionary: true,
    progressDivider: 1, 
    resumable: (res) => {
      console.log("# resumable :", res);
    },
    begin: (res) => {
        // start event
    }, 
    progress: (data) => {
        const percentage = ((100 * data.bytesWritten) / data.contentLength) | 0;
        console.log("# percentage :", percentage);
    },
  });

  jobId = ret.jobId;

  ret.promise.then((res) => {
    console.log('Download finished.');
    RNFS.completeHandlerIOS(jobId);
    jobId = -1;
  }).catch(err => {
    console.log('error');
    jobId = -1;
  });

看起来效果很好。
顺便说一句,当我尝试通过推送通知在后台下载时,除非我打开应用程序,否则它不会开始下载 任何人都可以解决这个问题吗?

答案 1 :(得分:0)

要在后台下载,我使用的最好的模块是react-native-background-downloader,其中包含暂停,恢复和下载百分比。

import RNBackgroundDownloader from 'react-native-background-downloader';

let task = RNBackgroundDownloader.download({
    id: 'dbfile',
    url: 'https://link-to-db/MySqlite.db'
    destination: `${RNBackgroundDownloader.directories.documents}/MySqlite.db`
}).begin((expectedBytes) => {
    console.log(`Going to download ${expectedBytes} bytes!`);
}).progress((percent) => {
    console.log(`Downloaded: ${percent * 100}%`);
}).done(() => {
    console.log('Download is done!');
}).error((error) => {
    console.log('Download canceled due to error: ', error);
});

// Pause the task
task.pause();

// Resume after pause
task.resume();

// Cancel the task
task.stop();

此模块也适用于iOS,您可以在后台连续下载多个文件。