问题标签 [nsurlprotocol]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
277 浏览

objective-c - 如何通过 NSURLProtocol 将 prxoy 服务器添加到我的 http 请求中?

我需要通过代理服务器代理我所有应用程序的 http 和 https 请求。

我不能只更改 url,因为大多数请求都是通过 3rd 方库完成的。

我尝试了一些代码:iOS any body know how to add a proxy to NSURLRequest? 但它似乎不起作用或不完整。

有人可以给我一个很好的例子吗?

0 投票
0 回答
306 浏览

ios - 将 NSOutputStream outputStreamWithURL 与自定义 URL 协议一起使用

我正在编写一个自定义 URL 协议(NSURLProtocol 的子类)来处理需要特殊读写方式的本地文件。阅读时没问题:我可以成功地创建一个 URL,例如 -“my-funny-file-protocol://....”,并且一切正常。

当我尝试写入这种 URL 时,就会出现问题。特别是,我需要使用 NSOutputStream,所以我需要调用类似:

不会引发异常,控制台上没有日志,但结果始终是nil. 如果我使用标准file:协议,相同的文件可以工作:

为什么?事实上 NSURLProtocol 文档并没有很好地解释我的情况。也许我在我的 URLProtocol 实现中遗漏了一些东西......但是什么?

提前谢谢了,

0 投票
0 回答
1645 浏览

objective-c - NSURLProtocol 没有得到完整的 NSURLRequest

问题:我有 NSURLProtocol 的子类,但NSURLRequest返回的+canonicalRequestForRequest:或返回的请求-connection:willSendRequest:redirectResponse:从未传递给我的 URL 协议实例。

详细信息:在我的子类中NSURLProtocol,我实现了+canonicalRequestForRequest:向请求添加 HTTP 标头的方法。标头已成功添加,但-startLoading在我的 URL 协议上调用时,self.request不包含该标头。

此外,当connection:willSendRequest:redirectResponse:在 的委托上调用时,NSURLConnection该方法返回的任何请求也永远不会到达我的 URL 协议实例。

我认为问题在于在initWithRequest:cachedResponse:client:之前调用+canonicalRequestForRequest:或被connection:willSendRequest:redirectResponse:调用,并且来自这两种方法的结果请求在它被alloc/之后永远不会传递给我的 URL 协议实例init

这是 Apple 的 URL 加载系统中的错误吗?有解决方法吗?难道我做错了什么?


2014 年 4 月 6 日更新

这是一些示例代码。我设置了 2 个标题:一个在-[APViewController connection:willSendRequest:redirectResponse:]call 中X-WillSendRequestTest,另一个在+[APURLProtocol canonicalRequestForRequest:]. 两者都不是NSURLRequest通过调用self.requestwithin获取的-[APURLProtocol startLoading]

APViewController.m(NSURLProtocol 的代理)

APURL协议.m

NSURLRequest+test.m(类扩展NSURLRequest的描述)

警告:不要在家里这样做。不要使用类别覆盖方法或属性。这仅用于快速调试目的。

0 投票
2 回答
689 浏览

ios - NSURLProtocol 和相对路径

我实现了一个自定义的 NSURLProtocol,它允许我使用网站的静态压缩版本作为 webView 的目标。它会在旅途中打开 zip 并加载所需的数据。但问题是 NSURLProtocol 似乎在相对路径中表现不佳?那就是我有以下结构:

并使用 : 从 css 调用 sprite.png,background: url(../images/sprite.png) no-repeat; 但是,我的自定义 NSURLProtocol 中的 requestURL 显示 scheme://host/images/sprite.png,缺少资产部分。如果我将..部分切换为,它工作正常assets,但我宁愿不必这样做。

我在这里发现了同样的问题:Loading resources from relative paths through NSURLProtocol subclass但这没有答案。

我找不到任何方法来解决此问题,以便请求正确解析相对路径,或者之后自己修复路径(但我需要知道请求的来源,并且那里也没有运气)

任何帮助表示赞赏,在此先感谢。

旁注:@import url("style.css");在 main.css 中使用同样的问题

编辑 :

我首先从远程服务器下载 zip 文件:

所以,从http://host/foo/archive.zip,我把它保存到documentsDirectory/archive.zip。从那里,我将方案和 url 更改为指向 zip 文件:

这会打开 myzip://archive.zip,如果在 zip 文件中没有找到这样的文件,我会将 /index.html 附加到当前路径。因此,以下请求到达我的NSURLProtocol子类- (id)initWithRequest:(NSURLRequest *)request cachedResponse:(NSCachedURLResponse *)cachedResponse client:(id < NSURLProtocolClient >)client: 

0 投票
0 回答
1637 浏览

ios - iOS - 如何为我的 UIWebView 发出的每个请求添加自定义标头字段

我想为我的 UIWebView 发出的每个请求添加一个自定义标头字段。首先,我尝试在控制器中的“shouldStartLoadWithRequest”方法中执行此操作,但这仅适用于发出的第一个请求 - 此方法不会处理所有后续请求。

经过一番搜索,我找到了这个教程(http://eng.42go.com/customizing-uiwebview-requests-with-nsurlprotocol/)。所以我实现了我自己的 NSURLProtocol 子类,一切正常,除了我的登录页面 - 身份验证存在一些问题,我无法解决这个问题。我看到存在一些方法,如“canAuthenticateAgainsProtectionSpace”和“didReceiveAuthenticationChallenge”,我可能需要实现这些方法才能让我的登录页面正常工作。但是,这似乎需要做很多额外的工作,因为首先我只想为每个请求添加一个字段。

所以我的疑问是:

  • 有没有其他简单的方法可以做到这一点?
  • 如果不是,我应该实现所有这些身份验证方法吗?
  • 有没有办法让我的自定义 NSURLProtocol 子类从 NSURLHTTPProtocol 之类的东西(因此我只需要做最少的工作)而不是 NSURLProtocol 本身进行扩展?

谢谢!

0 投票
1 回答
2159 浏览

ios - NSURLProtocol canInitWithRequest:多次调用

我们的应用程序中有很多 Web 视图,我最近添加了一个 NSURLProtocol 来拦截来自它们的一些请求。

我注意到一些 Web 视图多次调用 +[NSURLPRotocol canInitWithRequest:] 方法,似乎是完全相同的请求。有时6或7次。我试图弄清楚为什么会发生这种情况。

有人对这个有经验么?我已经注销了 [NSURL absoluteString] 和 httpMethod 值,它们对于每个请求都是相同的。我希望这个方法只会为服务器所需的任何给定文件或资源调用一次,而不是多次。它似乎因网页而异。

有任何想法吗?

0 投票
3 回答
1994 浏览

ios - How to use NSURLCache to cache content served by an NSURLProtocol

I've written an NSURLProtocol that will check outbound http requests against a plist of URL to local path mappings and serve up the local content instead, and then cache it using NSURLCache:

I limit the number of times local data can be fetched to one. The intent that the first time that its fetched it'll come from the NSBundle, but thereafter it'll use the stock NSURLCache to check whether it should come from either the cache or the network:

Sadly, it seems as though the local data will go into the cache, but it won't ever come back out. Here's a log snippet:

My expectation is that after the first time it's refused by the protocol it'll result in a couple of cache hits but instead it always counts it as a miss, fetches the content from the server, and then after that I start getting cache hits.

My fear is that my NSURLProtocol subclass constructs its responses in a way that allows them to be cached, but prevents them from ever being pulled out of the cache. Any ideas?

Thanks in advance. :)

0 投票
1 回答
864 浏览

ios - iOS:[NSURLProtocol propertyForKey:inRequest:] return nil

在玩 NSURLProtocol 时,我发现[NSURLProtocol propertyForKey:inRequest:]在stopLoading中总是返回 nil ,但对canInitWithRequest 来说效果很好:

我的代码有什么问题吗?

0 投票
1 回答
2363 浏览

ios - Phonegap 和 MobileIron 兼容性

我为 iOS 设备开发了一个 PhoneGap 应用程序。出于安全原因,我需要集成一个 MobileIron 产品。特别是,我必须将 MobileIron 的 AppConnectSDK for iOS 导入我的 Xcode 项目。我担心NSURLProtocol子类被实例化了两次。第一个来自 Phonegap (CDVURLProtocol),第二个来自 AppConnectSDK。

这两个实例可以一起工作吗?MobileIron 的 AppConnect 是否与 PhoneGap 兼容?

谢谢, 恩里

0 投票
1 回答
194 浏览

ios - UIWebView + NSUrlConnection - LinkedIn 陷入无限循环

我正在尝试WebView在 iOS 上创建一个应用程序来拦截所有 URL 请求以进行某些日志记录。

为此,我按照本教程编写了一个扩展NSUrlProtocol& 并加载请求的类:NSUrlConnection

http://www.raywenderlich.com/59982/nsurlprotocol-tutorial

Gmail 在这方面工作正常。但在输入用户 ID 和密码后,LinkedIn 陷入了无限循环(连续 302 次请求)。

我使用中间 Web 调试代理检查了这个无限循环。

请注意,这个无限循环与本教程第一部分中提到的不同,我已经解决了与本教程中提到的相同的问题。

如果我不注册我的NSUrlProtocol派生类,则链接可以正常工作。

任何帮助,将不胜感激。如果您需要更多信息/代码等,请告诉我。