Cordova:在www文件夹中加载epub文件

时间:2017-03-26 21:46:28

标签: ios xcode cordova reactjs cordova-plugins

是时候寻求帮助了;花了太多天试图独自解决这个问题。非常感谢任何帮助。

我在网络应用中运行react-reader并且它跨浏览器(包括Safari)加载epub文件而没有任何问题。但当应用程序通过Cordova在iOS上运行时,它不再加载epub文件。我假设它可能与iOS / Cordova处理文件的方式有关,但我不是这些问题的专家。我确实尝试了不同的StackOverflow建议(thisthisthisthis),但无济于事。

所有epub文件都位于子文件夹中:www/epubs/

以下是适用于网络应用的react代码,但不适用于Cordova应用(简化为必需品):

import React from 'react'
import { EpubView } from 'react-reader'

export default ({ lang, name }) => (
  <EpubView
    url={'epubs/' + lang + '-' + name + '.epub'}
  />
)

1 个答案:

答案 0 :(得分:0)

解决了! 一个有用的技巧是{www}将www文件夹中的每个文件fs.download转换为Cordova的持久文件系统。查看我的original post

首先,在终端:

  1. npm install cordova-promise-fs
  2. cordova plugin add cordova-plugin-file --save
  3. cordova plugin add cordova-plugin-file-transfer --save
  4. 然后,在你的前端:

    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)
      }
    )