我知道如果我使用嵌入式WebView,我可以从javascript调用android本机API。
但是,是否可以从Android中的常规浏览器访问这些API,例如Firefox Mobile或股票浏览器?我认为我必须在某处明确授予许可,否则这将是一个很大的安全漏洞。
我很难看到使用创建运行javascript的特殊应用程序;我的应用程序是运行服务器的常规Web应用程序(未嵌入我的Android应用程序中)并且经常更新(因此不适合嵌入应用程序),在某些情况下,添加直接查询各种信息的功能会很有用来自网页,主要是为了防止Android杀死浏览器并在重新进入时强制重新加载网络应用程序,因为我不得不花5秒钟跳出(例如)Firefox以手动获取信息。
答案 0 :(得分:2)
我认为无论如何都可以从常规浏览器调用您的Android API(它们没有将它们作为DOM模型的一部分),除非您为每个浏览器构建自己的特定扩展。这将是乏味的工作,可能不值得,因为这正是嵌入式WebViews存在的原因(如Phonegap)。
现在,您可以尝试反过来,即从服务器直接从WebView加载您的网页。默认情况下,webviews会从设备的本地存储中加载其内容,但是,使用XHR,您可以调用传统网页并在Webview中显示它们。
这可以使用可以嵌入服务器内容或iframe的div来实现,从浏览器中完全加载整个页面。第二种方法将更加透明,因为您可以完全重用当前的网页,但是由于跨源问题的安全限制,它会阻止您将包装器与网页进行通信。我建议采用第一种方法,尽管您可能需要重构服务器网页,以便更好地与您的应用程序集成。
这样可以这样工作(为了简单起见,我使用的是JQuery,但你可以直接使用XHR):
在webview中创建一个小的index.html(phonegap或者你正在使用的任何东西)并定义一个将作为包装来调用你的服务器:
<html>
<head>
<!-- Load all your css and javascript stuff here -->
</head>
<body>
<div id="wrapperdiv"></div>
</body>
</html>
包含javascript以动态加载服务器中的内容:
$(function() {
$.ajax({
url: 'http://www.michaels-server.com/your-web-endpoint',
type: 'GET',
crossDomain: true,
success: function(data, textStatus, xhr) {
$('#wrapperdiv').html(data);
}
error: function() { alert("Cannot contact server."); }
});
});
配置嵌入式Web视图以允许跨源请求。在phonegap中,您可以执行以下操作:
&lt; widget ...&gt;
&lt;! - 这里的小部件配置 - &gt;
&lt; access origin =“*”/&gt ;
&lt;! - 更多小部件配置 - &gt;
&lt; / widget&gt;
html包装器中的div现在将动态加载服务器中的内容。该页面中的任何javascript都可以使用嵌入式webviews DOM模型调用Native API,例如Phonegap提供的模型。
希望这有帮助。