android - 有没有办法在 Android 的 PhoneGap 中拦截 HTTP 请求?

标签 android ios cordova

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

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

现在的问题是:Android 上是否有类似的可能性? 我知道没有 NSURLProtocol 的直接版本(甚至不能——你通常在 Java/Dalvik 运行时,PhoneGap Web 浏览器组件作为 native 组件运行)。所以我可能正在寻找更有创意的方式来拦截它……可能是在 JavaScript 中,可能是在 PhoneGap/Cordova Android 代码中,也可能是浏览器组件的一些 native 插件。

如果有任何提示,我将不胜感激,我实际上需要将在 iOS 上以这种方式构建的基于 PhoneGap 的应用程序移植到 Android。

最佳答案

@Ales 您可以使用自定义 JavaScript 函数轻松拦截任何平台上的任何方案,无论是 iOS 还是 Android。 Phonegap webview 不会打开以 javascript 开头的 url,而是跳过它以进一步处理 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>

关于android - 有没有办法在 Android 的 PhoneGap 中拦截 HTTP 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22837624/

相关文章:

java - Android:ActivityNotFoundException 无法找到显式 Activity 类

android - Google Play 游戏服务——解锁的成就是否会通过 g+ 自动分享?

java - 线程 asynctask 和 listview

android - 我怎么知道我的应用程序来自哪里?

android - Flutter:禁用平板电脑和 iPad 的应用程序

c# - Xamarin UICollectionViewController 每行显示 2 个单元格?

android - 背景在 iOS 上显示,但在 Android Xamarin 上不显示

javascript - 代码不适用于 Phonegap 应用程序 -Android

javascript - 使用 OpenUI5 和 Apache Cordova 的本地存储

java - 我可以在 Java 项目中使用 PhoneGap 吗?