是时候寻求帮助了;花了太多天试图独自解决这个问题。非常感谢任何帮助。
我在网络应用中运行react-reader
并且它跨浏览器(包括Safari)加载epub文件而没有任何问题。但当应用程序通过Cordova在iOS上运行时,它不再加载epub文件。我假设它可能与iOS / Cordova处理文件的方式有关,但我不是这些问题的专家。我确实尝试了不同的StackOverflow建议(this,this,this和this),但无济于事。
所有epub文件都位于子文件夹中:www/epubs/
以下是适用于网络应用的react
代码,但不适用于Cordova应用(简化为必需品):
import React from 'react'
import { EpubView } from 'react-reader'
export default ({ lang, name }) => (
<EpubView
url={'epubs/' + lang + '-' + name + '.epub'}
/>
)
答案 0 :(得分:0)
解决了! 一个有用的技巧是{www}将www文件夹中的每个文件fs.download
转换为Cordova的持久文件系统。查看我的original post。
首先,在终端:
npm install cordova-promise-fs
cordova plugin add cordova-plugin-file --save
cordova plugin add cordova-plugin-file-transfer --save
然后,在你的前端:
import CordovaPromiseFS from 'cordova-promise-fs'
const fs = CordovaPromiseFS({
persistent: true,
storageSize: 200 * 1024 * 1024,
concurrency: 3
})
如果使用React,则必须在创建组件Class
之前声明上述代码,而下面的代码应该在组件Class
内的自己的函数中。有关详细信息,请参阅我的GitHub comment。
window.resolveLocalFileSystemURL(
cordova.file.applicationDirectory + 'www/epubs/alice.epub',
// If successful...
(fileSystem) => {
const downloadUrl = fileSystem.toURL()
const localUrl = 'alice.epub' // the filename it is stored as in the device
fs.download(
downloadUrl,
localUrl,
(progressEvent) => {
if (progressEvent.loaded && progressEvent.total) {
console.log('progress', Math.round((progressEvent.loaded / progressEvent.total) * 100))
}
}
).then((filedata) => {
return fs.toInternalURL(localUrl)
})
.then((localPath) => {
this.setState({ epubPath: localPath })
}).catch((error) => {
console.log('some error happend', error)
})
},
// If unsuccessful
(err) => {
console.log(err)
}
)