2014-04-03 135 views
2

PhoneGap上的iOS中使用了一种非常常见的技术:拦截HTTP(或URL)协议,以便从其他来源(例如缓存)为基于PhoneGap的应用程序提供内容。您只需使用NSURLProtocol and co实施新协议。有没有办法在Android上的PhoneGap中拦截HTTP请求?

因此,您可以引入例如cache://server1/lookup1.json类型的URL(方案是'cache'),可以从PhoneGap内的JavaScript中调用,并且它将达到您的NSURLProtocol实现,以便您可以例如在询问真实服务器之前查看本地缓存。我想这是相当不错的方式,如何实现即使在离线模式下也能运行的应用程序(当然有限的时间)。

现在的问题:Android上有类似的可能吗? 我知道没有NSURLProtocol的直接版本(甚至不能 - 通常在Java/Dalvik运行时,PhoneGap Web浏览器组件作为本机组件运行)。所以我很可能会寻找更多创造性的方法来拦截那些...也许在JavaScript中,也许在PhoneGap/Cordova Android代码中,也许是浏览器组件的一些本地插件。

我会很感激这里的任何提示,实际上我需要将基于PhoneGap的应用程序在iOS上构建到Android上。

回答

1

@Ales你可以在任何平台上轻松拦截任何平台,不管它的iOS或Android使用自定义JavaScript函数。 Phonegap webview不会打开以javascript开头的网址,而是跳过它进一步处理到javscript代码本身。我已经为此准备了一个小型工作演示。希望它能够满足您的要求。

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script> 
<script> 
    $(function(){ 
    $('a').click(function(event) { 
     var hrefValue = $(this).attr('href'); 
     var pattern = /^((cache|myapp):\/\/)/; // Add schemes to this list according to your need. i have added two 
     if(pattern.test(hrefValue)) {   
     event.preventDefault();   
     var tempArray = hrefValue.split('://'); 
     var urlScheme = tempArray[0]; 
     var urlPath = tempArray[1]; 
     // perform specfic actions based on scheme 
     if(urlScheme == 'cache') {  
      $.getJSON('http://'+urlPath, function(data) {   
       $("#response").html(JSON.stringify(data)); 
      });  
     } 
    } 
}); 
</script> 
<style> 
a { display:block; } 
</style> 
<a href="cache://ip.jsontest.com">Cache Scheme</a> 
<a href="http://ip.jsontest.com">Http Scheme</a> 
<div id="response"></div> 
+0

谢谢。是的,我实际上意识到这种可能性。不过,我想以非侵入性的方式进行拦截。在你的例子中'href'属性是JavaScript函数调用,我想保留它作为href =“cache://ip.jsontest.com”。 –

+0

我编辑了我的答案,以非干扰方式拦截url方案。请让我知道它是否有效 –

+0

看起来这是迄今为止最好的(也是唯一的)答案。我真的希望在Javascript之外的东西,但它似乎是Android的唯一途径。 –