2017-03-26 23 views
0

請求幫助的時間;花了太多的時間試圖自己解決這個問題。任何援助非常感謝。Cordova:在www文件夾中加載epub文件

我在一個網絡應用程序中運行react-reader,它在瀏覽器(包括Safari)中加載epub文件沒有任何問題。但是當應用程序通過Cordova在iOS上運行時,它不再加載epub文件,因此需要。我假設它可能與iOS/Cordova處理文件的方式有關,但我不是這些問題的專家。我確實嘗試了不同的StackOverflow建議(this,this,thisthis),但無濟於事。

所有EPUB文件都位於子文件夾:www/epubs/

這裏的react代碼的Web應用程序的工作原理,但不是科爾多瓦應用程序(簡化爲要領):

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

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

回答

0

解決它! 有用的一個技巧是將每個文件從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

然後,在你的前端:

import CordovaPromiseFS from 'cordova-promise-fs' 

const fs = CordovaPromiseFS({ 
    persistent: true, 
    storageSize: 200 * 1024 * 1024, 
    concurrency: 3 
}) 

如果你的U se 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) 
    } 
)