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
好吧,对我来说,解决方案是几个来源的混合,但大多数解决方案都在这里找到.
你应该做的是以下几点:
定义您config.xml的指向直接指向遥控器index.html.
<content src="http://your-remote-location/index.html" />
Run Code Online (Sandbox Code Playgroud)在你index.html对本地android设备资源的任何引用前加上一些独特的前缀,如**injection**.例如,cordova.js你会想出类似的东西:
<script type="text/javascript" src="**injection**www/cordova.js"></script>
Run Code Online (Sandbox Code Playgroud)SystemWebViewClient.java在以下位置查找:your-project-location\platforms\android\CordovaLib\src\org\apache\cordova\engine.
在顶部类的私有成员部分添加以下枚举声明:
private enum WebExtension {
PNG, MP3, MP4, TTF, SVG, JS, ICO, HTML, CSS, EOT, WOFF, JSON;
}
Run Code Online (Sandbox Code Playgroud)找到该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.
希望它可以帮助某人.
在远程站点中包含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)
这个插件解决了这个问题,而无需自己编写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)
我也有这个问题,在config.xml(内容和访问标签)中更改的东西不起作用.我在手机上运行时检查了应用程序,我发现当我加载远程站点时,有些文件丢失了.
首先,它是名为cordova_plugins.js的文件,您可以在平台文件夹中找到每个平台.然后你还需要一些特定于插件的文件.您可以通过构建并从那里提取它们来找到它们.对于android,路径如下APK/assets/www/plugins.只需复制服务器上的内容即可.
注意:您也可以在平台文件夹中找到插件特定文件,但它们不完整,因为它们缺少cordova.define("......开头.这导致必需和模块未定义,所以只需进行构建并从那里得到它们.
这是 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 使用非本地文件地址。
| 归档时间: |
|
| 查看次数: |
13099 次 |
| 最近记录: |