我即将构建一个本地存储多个MySqlite * .db文件的应用程序。这些用于使用数据填充应用程序。
应用程序应定期检查其中一个文件是否有较新版本,如果有,请下载并替换旧版本的文件。 此更新过程应在后台进行,而应用程序处于非活动状态甚至关闭。
我见过几个插件,可用于在后台执行任务(如https://www.npmjs.com/package/react-native-background-task)。这可以用于定期检查更新,但iOS上30秒的时间限制可能不足以下载* .db文件。此外,该插件强制最低Android API版本为21。
我的问题是:是否可以在后台轮询更新并下载它们,替换旧文件?
答案 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 强>
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,您可以在后台连续下载多个文件。