具有远程html和本地cordova.js的混合应用程序

时间:2015-06-24 04:16:53

标签: android cordova

我有一个网站,我希望通过混合应用在手机上增强。理想情况下,应用程序将通过http加载远程站点,但在本地加载特定于平台的代码。我试图建立一个Cordova项目来做到这一点,但我遇到了很多麻烦。 Cordova 4.3.1,Cordora Android 3.7.2在Nexus 7 Android 4.4.4上一直是我的环境。 (谷歌地图插件适用于Cordova Android< 4。)

如果我尝试从http网站加载file:///android_assets/www/cordova.js,则铬会说Not allowed to load local resource。我试图建立一个本地URL方案,但不知道特定于android的代码放在哪里。

这是制作混合应用的正确方法吗?是否有一个cordova插件允许加载文件:来自http:?

我还尝试使用iframe并传递消息以指示cordova已启用且已安装哪些插件,但我不想处理让http服务器重新提供本地已有的相同js文件。 / p>

我还想下载网站并通过文件访问它:但我想我在尝试访问http资源时会遇到同样的问题。

4 个答案:

答案 0 :(得分:2)

我可以使用cordova-plugin-file(cordova.js)插件在远程html上加载本地cdvfile://

  1. 将cordova-plugin-file插件添加到您的cordova项目中 https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-file/

  2. 使用以下示例代码(Android示例)确认cordova.js的cdvfile URI

  3.     checkCordovaJSPath('file:///android_asset/www/cordova.js');
        
        function checkCordovaJSPath(jsUri) {
                window.resolveLocalFileSystemURL(jsUri, function success(fileEntry){
                    console.log("got cordova.js file: " + fileEntry.fullPath);
                    console.log('cordova.js cdvfile URI: ' + fileEntry.toInternalURL());
                   
        });
        }

    1. 在远程html上使用cordova.js加载cdvfile://localhost
    2. <script type="text/javascript" src="cdvfile://localhost/assets/www/cordova.js"/>

答案 1 :(得分:1)

我不知道这是否是制作混合应用的正确方法,但我通过使用https://github.com/floatinghotpot/cordova-httpd通过http提供资源来实现这一目标。

在我添加的应用程序捆绑的本地页面上:

    <script type="text/javascript">
        document.addEventListener("deviceready", function () {
            var httpd = cordova.plugins.CorHttpd;
            httpd.startServer({
                'www_root': '',
                'port': 8080,
                'localhost_only': false
            }, function (url) {
                // if server is up, it will return the url of http://<server ip>:port/
                // the ip is the active network connection
                // if no wifi or no cell, "127.0.0.1" will be returned.
                document.getElementById('url').innerHTML = "server is started: <a href='" + url + "' target='_blank'>" + url + "</a>";
                location.replace('http://192.168.0.134:9090/homechooser/beta/#' + JSON.stringify({'cordova.js': url + '/cordova.js'}));
            }, function (error) {
                document.getElementById('url').innerHTML = 'failed to start server: ' + error;
            });
        }, false);
    </script>
    <div id="url"></div>

然后在我添加的远程网页上:

(function () {
    var hash;
    if (location && location.hash)
        try {
            hash = JSON.parse(location.hash.substring(1));
        } catch (e) {
        }
    if (hash && hash['cordova.js'])
        $.getScript(hash['cordova.js'], function () {
            alert("Running cordova.js");
        });
})();

现在看看cordova是否真的可以这样使用......

答案 2 :(得分:0)

你正在尝试在本地托管应用上加载web-url,想象在Native Android App上做同样的事情,你会怎么做?您将在您的应用中放置Web客户端或Web浏览器。但Cordova / Phonegap已经使用Web浏览器来呈现您的页面。所以它就像在Web浏览器中使用Web浏览器一样。

您需要安装 InAppBrowser ,这样您才能够加载第三方托管网页。

示例代码

  document.addEventListener("deviceready", onDeviceReady, false);

    // device APIs are available
    //
    function onDeviceReady() {
         var ref = window.open('http://yourWebPage.com', '_blank', 'location=yes');
         ref.addEventListener('loadstart', function(event) { alert('start: ' + event.url); });
         ref.addEventListener('loadstop', function(event) { alert('stop: ' + event.url); });
         ref.addEventListener('loaderror', function(event) { alert('error: ' + event.message); });
         ref.addEventListener('exit', function(event) { alert(event.type); });
    }

答案 3 :(得分:0)

由于混合内容策略,cdvfile解决方案不适用于活动内容(js文件)。这是使其工作的方法:

对于android:通过将以下代码放入cordova插件的pluginInitialize方法中来禁用混合内容策略:

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            final WebSettings settings = ((WebView)this.webView.getView()).getSettings();
      settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
        } 

https://developer.android.com/reference/android/webkit/WebSettings.html#MIXED_CONTENT_ALWAYS_ALLOW

然后使用以下命令包含本地cordova.js:

<script src="cdvfile://localhost/assets/www/cordova.js"></script>

对于ios:我向文件插件提交了PR,该插件解决了ios上的混合内容问题:apache / cordova-plugin-file#296固定版本位于:https://github.com/guylando/cordova-plugin-file如果您加载远程站点https://example.com在网络视图上,然后允许使用URL:https://example.com/cdvfile/bundle/www/cordova.js而不是cdvfile://localhost/bundle/www/cordova.js来访问本地文件,从而解决了混合内容问题

使用以下方式包含本地cordova.js:

<script src="/cdvfile/bundle/www/cordova.js"></script>