公司目前的前端架構是微信端由vue全家桶負責h5網站的單頁應用,android端和ios端則選擇cordova打包成apk和app。其中,有一個業務邏輯是點擊某個連接進入pdf的展現,h5的方案是使用vue-pdf,h5網站運行良好。但是,等到打包成apk時卻顯示不出來。cordova程序加載pdf文件並非那麼輕鬆。javascript
目錄html
1.使用inappbrowser(適合ios)前端
2.cordova-plugin-file-opener2(android)vue
參考: Linking to PDFs in cordova apps。
java
ios原生的支持pdf的瀏覽,因此咱們只要完成pdf顯示和返回頁面(完成按鈕)這個流程就行了。注意,提到返回頁面,由於直接經過連接的方式顯示PDF,會致使沒法返回頁面。好比下面的例子。android
顯示pdf但無返回的作法:
1 <p> 2 <a href="pdf/fund.pdf">Regular Ole Link</a> 3 //不安裝任何插件,直接a標籤打開 4 </p> 5 <p> 6 <button id="loadPDF1">document.location.href</button> 7 // 8 </p> 9 10 //js部分 11 document.addEventListener('deviceready', init, false); 12 function loadPDF1() { 13 console.log('loadPDF1'); 14 document.location.href='pdf/fund.pdf'; 15 }
正確方案:使用inappbrowser(適合ios)ios
1.安裝inappbrowsergit
cordova plugin add cordova-plugin-inappbrowser
參考:cordova-plugin-inappbrowsergithub
2.js部分apache
document.addEventListener('deviceready', init, false); function init() { document.querySelector('#loadPDF2').addEventListener('touchend', loadPDF2,false); } function loadPDF2() { console.log('loadPDF2'); var ref = cordova.InAppBrowser.open('pdf/fund.pdf', '_blank', 'location=no'); }
ios測試截圖:
額外的一些些話(對vue項目不感興趣的能夠skip咯):
//Vue項目 //正確示範 if(this.ios==true){ if(cordova){ var ref =cordova.InAppBrowser.open('assets/foo.pdf', '_blank', 'location=no'); } } //錯誤示範 if(this.ios==true){ //這個時候運行vue項目報錯,Uncaught ReferenceError: cordova is not defined //明明this.ios這個if語句的代碼在vue項目並無進這個分支,那麼如何知道cordova呢 //答案是變量提高。不理解,自行百度哦。 var ref =cordova.InAppBrowser.open('assets/foo.pdf', '_blank', 'location=no'); }
android原生並不支持pdf瀏覽。那麼使用fileopener2。
參考: Linking to PDFs in cordova apps。
首先,[root]/config.xml添加內容,安裝file-opener2和cordova-plugin-file。
命令爲:
cordova plugin add cordova-plugin-file
cordova plugin add cordova-plugin-file-opener2@1.0.11
[root]/config.xml:
<plugin name="cordova-plugin-file" spec="^6.0.1" /> <plugin name="cordova-plugin-file-opener2" spec="1.0.11" />
而後,要求android target爲23。
最後,貼代碼以下:
<div> <button id="btn">打開PDF</button> </div> <script type="text/javascript" src="cordova.js"></script> <script> document.addEventListener('deviceready', init,false); function init(){ document.getElementById("btn").onclick=function(){ window.resolveLocalFileSystemURL(cordova.file.applicationDirectory + 'www/pdf/lustForLife.pdf', function(fileEntry) { console.log(fileEntry); window.resolveLocalFileSystemURL(cordova.file.externalDataDirectory, function(dirEntry) { console.log(dirEntry); fileEntry.copyTo(dirEntry, 'lustForLife.pdf', function(newFileEntry) { console.log(newFileEntry); console.log(cordova.plugins.fileOpener2); cordova.plugins.fileOpener2.open(newFileEntry.nativeURL,'application/pdf', { error : function(e) { console.log(e); }, success : function () { console.log('file opened successfully'); } } ); }); }); }); } } </script>
報錯解決 exposed beyond app through Intent.getData()
file:///storage/emulated/0/Android/data/io.cordova.hellocordova/files/lustForLife.pdf exposed beyond app through Intent.getData()很不幸,若是你安裝的Sdk是24及以上版本,由於不支持file schema,會報錯。那麼咱們就修改target就好啦。
如何修改targetSdkVersion?
android studio方案
step1:用android studio選擇要安裝的api level,我選擇的是22。若是還未安裝,選擇好後點擊OK就能自動幫你下載了。
step2:打開cordova的安卓項目,位於[root]/platform/android。修改build.gradle
step3:打開安卓項目的AndroidManifest.xml。修改android:targetSdkVersion=22。
step4:打包>>build>>build APK(s)
成功!
效果如圖: