2017-04-26 65 views
1

我即将建立一个本地存储多个MySqlite * .db文件的应用程序。这些用于使用数据填充应用程序。反应原生背景下载

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

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

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

回答

1

我发现了一些有用的插件。

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

+1给RNFS示例。根据我的经验,RNFetchBlob是一个不稳定的选择,原因有两个。 1.没有维护。 2.它会在大文件下载时阻塞JS线程,这会导致你的应用“冻结”,直到这个过程结束。 –