如何从远程页面访问phonegap API

rie*_*nho 24 javascript android ios cordova cordova-plugins

我必须遵循以下情况:我有一个已经存在的远程网页,我想开发一个使用此页面的应用程序.到现在为止还挺好.当我启动应用程序时,本地index.html加载并重定向(window.open target: _self)到外部网站.该网站在phonegap webview中打开.在外部网站上,我添加了cordova.js以便访问本机phonegap API.但它无法正常工作.该deviceReady事件被触发正确的,但我没有访问PhoneGap的API,例如navigator.camera.

我怎样才能完成它,才能访问API?

请不要评论它会被AppStore等拒绝.

谢谢您的帮助!

Len*_*yai 13

好吧,对我来说,解决方案是几个来源的混合,但大多数解决方案都在这里找到.

你应该做的是以下几点:

  1. 定义您config.xml的指向直接指向遥控器index.html.

    <content src="http://your-remote-location/index.html" />
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在你index.html对本地android设备资源的任何引用前加上一些独特的前缀,如**injection**.例如,cordova.js你会想出类似的东西:

    <script type="text/javascript" src="**injection**www/cordova.js"></script>
    
    Run Code Online (Sandbox Code Playgroud)
  3. SystemWebViewClient.java在以下位置查找:your-project-location\platforms\android\CordovaLib\src\org\apache\cordova\engine.

  4. 在顶部类的私有成员部分添加以下枚举声明:

    private enum WebExtension {
        PNG, MP3, MP4, TTF, SVG, JS, ICO, HTML, CSS, EOT, WOFF, JSON;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  5. 找到该shouldInterceptRequest方法并在该try {行后面添加以下内容:

    if(url != null && url.contains(INJECTION_TOKEN)) {
        String assetPath = url.substring(url.indexOf(INJECTION_TOKEN) + INJECTION_TOKEN.length(), url.length());
        try {
            String mimeType = "text/plain";
    
            String ext = assetPath.substring(assetPath.lastIndexOf(".") + 1, assetPath.length());
            WebExtension extension = WebExtension.valueOf(ext.toUpperCase());
    
            switch(extension) {
                case PNG:
                    mimeType = "image/png";
                    break;
                case MP3:
                    mimeType = "audio/mpeg";
                    break;
                case MP4:
                    mimeType = "video/mp4";
                    break;
                case TTF:
                    mimeType = "application/x-font-ttf";
                    break;
                case SVG:
                    mimeType = "image/svg+xml";
                    break;
                case JS:
                    mimeType = "application/javascript";
                    break;
                case ICO:
                    mimeType = "image/x-icon";
                    break;
                case HTML:
                    mimeType = "text/html";
                    break;
                case CSS:
                    mimeType = "text/css";
                    break;
                case EOT:
                    mimeType = "application/vnd.ms-fontobject";
                    break;
                case WOFF:
                    mimeType = "application/x-font-woff";
                    break;
                case JSON:
                    mimeType = "application/json";
                    break;
            }
    
            WebResourceResponse response = new WebResourceResponse(
                mimeType,
                "UTF-8",
                parentEngine.webView.getContext().getAssets().open(assetPath)
            );
            return response;
        } catch (IOException e) {
            e.printStackTrace(); // Failed to load asset file
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

所有这些的结果将是拦截每个资源请求,并且如果它将包含其中的**injection**字符串,它将减少资源位置并将从运行应用程序的本地设备位置请求它.应用程序浏览器以正确的方式加载资源需要mimeType.

希望它可以帮助某人.


Mis*_*ith 9

在远程站点中包含cordova.js脚本将会非常棘手,因为每个平台都有不同的cordova.js.您可以修改服务器,使其返回基于用户代理正确cordova.js,而这也是棘手,因为当您从移动浏览器的网站中会包含此脚本,这是不可取的,因为JavaScript错误可能是向用户显示.从台式计算机查看站点时,同样的故事不应包括cordova.js.

在我看来,你有一个本地网页(包括cordova脚本),然后从那里你切换到远程页面(也包括脚本).我不确定这个页面更改是否会起作用.如果它工作,您可能必须等待第二个deviceready事件.

但您可以将远程站点页面设置为cordova应用程序中的根页面,而无需中间的"加载程序"页面.只需在config.xml文件中设置它:

<content src="http://your.website.fake/index.html" />
Run Code Online (Sandbox Code Playgroud)

您需要确保允许在应用中加载您的网站.在同一个文件中,您应该添加:

<access origin="http://your.website.fake" subdomains="true"/> 
Run Code Online (Sandbox Code Playgroud)


jpe*_*lli 9

这个插件解决了这个问题,而无需自己编写Android解决方案.

https://www.npmjs.com/package/cordova-plugin-remote-injection

https://github.com/TruckMovers/cordova-plugin-remote-injection

远程注入插件允许远程站点在您的cordova应用程序中加载时与cordova的JavaScript API进行交互.

  • 将cordova和安装的插件JS注入任何远程浏览页面的webview,允许他们作为打包的cordova应用程序访问cordova对象及其插件.

  • 支持iOS和Android平台.

我测试了它,它工作得很好.您唯一需要记住的是,您需要等待cordova准备好,如下所示:

<html>
  <head>
  </head>
  <body>
    <script>
      document.addEventListener("deviceready", function() {
          document.write("Now you can use plugins"); 
      }, false);
    </script>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)


sor*_*486 7

我也有这个问题,在config.xml(内容和访问标签)中更改的东西不起作用.我在手机上运行时检查了应用程序,我发现当我加载远程站点时,有些文件丢失了.

首先,它是名为cordova_plugins.js的文件,您可以在平台文件夹中找到每个平台.然后你还需要一些特定于插件的文件.您可以通过构建并从那里提取它们来找到它们.对于android,路径如下APK/assets/www/plugins.只需复制服务器上的内容即可.

注意:您也可以在平台文件夹中找到插件特定文件,但它们不完整,因为它们缺少cordova.define("......开头.这导致必需模块未定义,所以只需进行构建并从那里得到它们.


Riv*_*era 0

是 Cordova/PhoneGap 施加的限制:

    if (startFilePath == nil) {
        loadErr = [NSString stringWithFormat:@"ERROR: Start Page at '%@/%@' was not found.", self.wwwFolderName, self.startPage];
        NSLog(@"%@", loadErr);
        self.loadFromString = YES;
        appURL = nil;
    }
Run Code Online (Sandbox Code Playgroud)

我过去已禁用此检查,以便让 Cordova 使用非本地文件地址。