Tag: nsurlprotocol

通过NSURLProtocol子类从相对path加载资源

我有一个NSURLProtocol注册为基于UIWebView的应用程序,设置为响应filescheme请求。 在Web视图中,我加载图像,CSS,JS等所有这一切工作正常; 当我尝试引用不在HTML树的根目录下的CSS文件中的图像时,问题就出现了。 例如 <html> <head> <style type="text/css"> .1 { background-image: url("1.png"); } </style> <link href="css/style.css" rel="stylesheet" type="text/css" /> <!– contents of css/style.css might be: .2 { background-image: url("../2.png"); } –> </head> <body> <div class="1">properly styled</div> <div class="2">not styled</div> </body> </head> 看看到达我的NSURLProtocol的请求,我看不到确定请求文件位于源代码树中哪里的方法。 例如,如果上面的HTML在一个名为source/index.html的文件中,我的NSURLProtocol子类将从source/css/style.css文件中获取对../2.png的请求。 这应该解决source/2.png ,但我不能告诉应该有该path中包含的css子目录。 有什么方法可以获得更多关于请求源的上下文,以便在查找请求的文件时修复path?

将NSURLRequest与UIWebView相关联

在iOS中,我希望能够将NSURLRequest ( 任何 NSURLRequest ,无论是导航请求还是图像或样式表请求)与发送它的UIWebView 。 这似乎要求实施NSURLProtocol子类来捕获和分析请求。 但是,我找不到一种方法来将请求与其网页视图相关联, NSURLProtocol似乎只能理解NSURLRequest 。 这对导航请求会很好,因为我可以在我的UIWebViewDelegate进行关联。 但是这对于不会触发UIWebViewDelegate方法的辅助资源请求(如图像)不起作用。 任何人有任何想法,以使这种协会的最佳途径?

在NSURLProtocol中使用NSURLSession

我正在尝试使用NSURLSession为http://和https://连接创build一个透明的NSURLProtocol。 然而,目前,即使正在运行完成处理程序,带有应用程序(UIWebView)的URL请求也回来了。 有人有什么想法吗? 代码如下: #import "MyURLProtocol.h" // AppDelegate #import "AppDelegate.h" static NSString * const MyURLProtocolHandledKey = @"MyURLProtocolHandledKey"; @interface MyURLProtocol () <NSURLConnectionDelegate,NSURLSessionDelegate> @property (nonatomic, strong) NSURLConnection *connection; @property (nonatomic, strong) NSMutableData *mutableData; @property (nonatomic, strong) NSURLResponse *response; @end @implementation MyURLProtocol +(BOOL)canInitWithRequest:(NSURLRequest*)request { if ([NSURLProtocol propertyForKey:MyURLProtocolHandledKey inRequest:request]) return NO; NSString *scheme = request.URL.scheme.lowercaseString; return [scheme isEqualToString:@"http"] || […]

为什么NSURLProtocol子类中的请求的HTTPBody始终为零?

我有我的NSURLProtocol MyGreatProtocol 。 我将它添加到URL加载系统, NSURLProtocol.registerClass(MyGreatProtocol) 然后我在networking会话期间开始接收MyGreatProtocol内部的事件。 假设我在注册我的协议后创build会话, let session = NSURLSession.sharedSession() let request = NSMutableURLRequest(URL: NSURL(string:"http://example.com")!, cachePolicy: .ReloadIgnoringLocalCacheData, timeoutInterval: 2.0) //arbitrary 404 request.HTTPBody = ([1, 3, 3, 7] as [UInt8]).toNSData print("body data: \(request.HTTPBody)") //prints `Optional(<01030307>)` request.HTTPMethod = "POST" session.dataTaskWithRequest(request) { (data, response, err) in print("data: \(data)\nresponse: \(response)\nerror\(err)") }.resume() 我希望请求的HTTP主体1/3/3/7存在于MyGreatProtocol ,而不是。 在MyGreatProtocol里面,我重写了下面的方法。 override class func canonicalRequestForRequest(request: […]

NSURLSessionTaskauthentication挑战completionHandler和NSURLAuthenticationChallenge客户端

我正在实现一个自定义NSURLProtocol ,并在内部想要使用NSURLSession数据任务的内部networking,而不是NSURLConnection 。 我碰到了一个有趣的问题,并想知道NSURLSession / NSURLSessionTask的质询处理程序的内部实现。 – (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler; 在这里,我基本上提供了两个不同的挑战处理程序,一个是completionHandler块,它提供了处理挑战的所有必要的信息,但是也有传统的NSURLAuthenticationChallenge.client ,它具有几乎与一对一对应的方法completionHandler信息选项。 由于我正在开发一个协议,并且想要向调用API实现的URL加载系统向上传递一定的authentication挑战,我需要使用NSURLSession客户端方法: – (void)URLProtocol:(NSURLProtocol *)protocol didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge; 我的问题是completionHandler和NSURLAuthenticationChallenge.client的内部实现是否相同,如果是这样,我可以跳过在委托方法中调用完成处理程序,期望URL加载系统将调用适当的NSURLAuthenticationChallenge.client方法吗?

NSURLProtocol canInitWithRequest:多次调用

我们的应用程序中有很多的Web视图,我最近添加了一个NSURLProtocol来拦截他们的一些请求。 我注意到,一些Web视图多次调用+ [NSURLPRotocol canInitWithRequest:]方法,看起来是完全相同的请求。 有时6或7次。 我试图找出为什么这可能发生。 有人对这个有经验么? 我注销了[NSURL absoluteString]和httpMethod值,它们对于每个请求都是相同的。 我期望这个方法只会被调用一次,而不是多次从一个服务器需要的任何给定的文件或资源。 而且它似乎每个网页都有所不同。 有任何想法吗?

我如何监视WKWebview的请求?

我如何监视WKWebview的请求? 我尝试使用NSURLprotocol(canInitWithRequest),但它不会监视Ajax请求(XHR),只有导航请求(文档请求)

使用MPMovieController或AVFoundation可以使用NSURLProtocol的子类播放video?

我目前正试图播放一个具有在自定义NSURLProtocol子类中定义的自定义scheme的URL。 最初我使用MPMoviePlayerController试图完成这个工作,但是在遇到问题并检查堆栈溢出后,我发现MPMoviePlayerController不能按预期处理NSURLProtocol子类。 如何使用自定义NSURLProtocol来播放电影? 因此,我决定看看AVFoundation框架,但是,似乎这似乎并不奏效。 我只想知道这是可能的,还是我想穿过墙壁? 使用AVFoundation,我使用的方法如下所示。 可能值得一提的是,这对于在互联网上托pipe的video使用标准URL时有效,但不适用于自定义NSURLProtocol。 // this doesn't work //AVPlayer *player = [[AVPlayer alloc] initWithURL:[NSURL urlWithString:@"custom URL scheme"]]; // this works AVPlayer *player = [[AVPlayer alloc] initWithURL:[NSURL urlWithString:@"some url to video on remote server"]]; AVPlayerLayer *layer = [AVAVPlayerLayer playerLayerWithPlayer:player]; // configure the layer [self.view.layer addSublayer:layer]; [player play]; 为了从定义的NSURLProtocol子类中播放,是否有不同的东西需要完成?

在canInitWithRequest的YES响应之后,NSURLProtocol不会被要求加载

我正在注册一个NSURLProtocol的实现来做一些自定义处理某些URL请求(我通过设置它们的属性来标记这些请求)。 这些URL请求来自UIWebView的加载方法。 创buildUI Web视图(启动后第一次加载) 加载内容 破坏networking视图 创build一个新的Web视图(后续加载) 加载内容 我看到步骤2和步骤5之间的显着不同的行为。我的NSURLProtocol实现pipe理caching的数据,并被devise来处理请求。 如果我在请求中没有检测到我的属性,我会再次检查特定的URL(用于debugging)。 在任何情况下, canInitWithRequest将返回YES : 启动后首次加载: 2014-10-15 11:37:11.403 MYApp[5813:60b] MYURLProtocol canInitWithRequest: Matched property in request: <0x15ebbb40> https://example.com/ 2014-10-15 11:37:11.404 MYApp[5813:60b] MYURLProtocol canInitWithRequest: Matched property in request: <0x15dc8da0> https://example.com/ 2014-10-15 11:37:11.409 MYApp[5813:60b] MYURLProtocol canInitWithRequest: Matched property in request: <0x15ee5ef0> https://example.com/ 2014-10-15 11:37:11.409 MYApp[5813:60b] MYURLProtocol canInitWithRequest: Matched property in […]

如何使用NSURLProtocol模拟AJAX调用?

我有UIWebview,使外部服务的AJAX调用。 离线时,我需要抓住这些请求,并返回本地json。 我实现了一个NSURLProtocol和我设法赶上AJAX请求,问题是jquery总是返回一个0错误代码: $.ajax({ url: url, dataType: 'json', contentType: "application/json", success: function(jsonData){ alert("success :"); }, error: function (request, status, error) { alert("failure :" + request.status ); } }); 我总是得到一个request.status = 0 为了testing我的协议,我试图嘲笑我的HTML内的图像,它的效果很好。 从google.fr =>的图像的HTML请求工作正常 AJAX调用亚马逊=> JSON 失败 这是我的全面实施: #import "EpubProtocol.h" @implementation EpubProtocol #pragma mark – NSURLProtocol + (BOOL)canInitWithRequest:(NSURLRequest *)request { BOOL awsRequest = [self request:request […]