iPhone 上的隧道网络请求

Posted

技术标签:

【中文标题】iPhone 上的隧道网络请求【英文标题】:Tunneling web requests on iPhones 【发布时间】:2011-03-16 08:32:54 【问题描述】:

我想知道是否可以通过隧道传输 Web 请求,当然还有使用/实现什么。

我已经编写了 NSInputStreamNSOutputStream 的子类,以通过我的自定义代理服务器发送和接收数据,这对于套接字连接非常有效。

我尝试实现 UIWebViewNSURLRequest 的委托,但我无法捕获从 UIWebView 发出的所有 HTTP 请求.

提前谢谢你。

【问题讨论】:

我们需要更多关于您想要达到的目标的详细信息。系统范围的 HTTP(S) / SOCKS 代理支持没有提供您想要的东西是有原因的吗? 我正在使用自定义代理服务器,该服务器使用 RSA 加密进行密钥交换,然后使用 AES 加密传输数据,因此 SOCKS 代理对我来说是不可能的。我实际上只是想将 Java 代码移植到 iPhone,但现在我被困在 HTTP 相关连接的隧道上。 【参考方案1】:

您可以尝试使用类别来捕获所有相关的方法调用(下面的模板)。但是要小心龙,并确保在执行此操作之前考虑使用系统代理路由。

UIWebView+PrivateProxy.h

@interface UIWebView (PrivateProxy) 
       - (void)loadRequest:(NSURLRequest *)request;

@end

UIWebView+PrivateProxy.m

@implementation UIWebView (PrivateProxy) 
   - (void)loadRequest:(NSURLRequest *)request 
       if(request.something ....) 
          // handle yourself ...
        else  
          [super loadRequest:request]; // use stanadrd implementation
       
   
@end

当然,您可能必须重写更多方法,例如重新加载、停止加载等。

【讨论】:

谢谢玛丽亚。我在我的第一篇文章中留下了关于为什么我不想使用标准 SOCKS 代理的评论。我已经尝试创建 UIWebView 的子类,并且我确实实现了 loadRequest 方法,该方法仅触发一次。我不确定我是否应该尝试使用方法 Swizzling,因为您不能使用分类的 UIWebView 类调用 [super loadRequest:request],因为 UIView 是它的父类并且它没有 loadRequest 函数。您是否认为使用方法 Swizzling 可能会解决我的 loadRequest 被调用一次的问题 - 即使对于具有图像的 www.google.com 也是如此 请注意,我的回答不是 UIWebView 的子类。它使用类别来扩展现有的类行为 - 因此它具有系统范围的效果。有关类别的更多信息,请参阅macdevelopertips.com/objective-c/objective-c-categories.html Aaah .. 一分钱刚掉。我想我终于明白了这个问题。这对你有用吗? icab.de/blog/2009/08/18/…

以上是关于iPhone 上的隧道网络请求的主要内容,如果未能解决你的问题,请参考以下文章

DNS隧道工具iodine

IOS怎么抓取网络请求包

现在为啥我使用fiddler4抓取iphone上开发版的小程序的https包点击时提示“网络请求失败”

iPhone - viewController 和网络请求的架构

通过 DataGrip 上的 ssh 隧道更快地连接

React Native / Expo iOs - 网络请求因我的 Api 上的 Fetch 而失败