问题标签 [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 回答
3574 浏览

ios - 在自定义 NSURLProtocol 上使用 AVURLAsset

我编写了一个自定义的 NSURLProtocol(称为“memory:”),它允许我根据名称从 NSDictionary 中获取存储的 NSData 项。例如,这段代码注册了 NSURLProtocol 类并添加了一些数据:

这使我可以通过“memory://video”之类的 url 引用 NSData。

下面是我的自定义 NSURLProtocol 实现:

我不确定这段代码是否有效,但这不是我遇到的问题。尽管注册了自定义协议,但当我尝试在此代码中使用 URL 时,永远不会调用 canInitWithRequest::

如果我使用“memory://video”,图像始终为零,但如果我使用“file:///...”,则效果很好。我错过了什么?为什么不调用 canInitWithRequest ?AVFoundation 是否只支持特定的 URL 协议而不支持自定义的?

谢谢

0 投票
2 回答
838 浏览

ios - 将 NSURLRequest 与 UIWebView 关联起来

在 iOS 中,我希望能够将一个NSURLRequest- any NSURLRequest,无论是导航请求还是图像或样式表请求 - 与UIWebView发送它的那个相关联。这似乎需要实现一个NSURLProtocol子类来捕获和分析通过的请求。但是,我找不到将请求与其网络视图相关联的方法,并且NSURLProtocol似乎只能理解NSURLRequests.

这对于导航请求来说很好,因为我可以在我的UIWebViewDelegate. 但这不适用于不触发UIWebViewDelegate方法的辅助资源请求,例如图像。

有人对建立这种关联的最佳方式有任何想法吗?

0 投票
1 回答
867 浏览

ios - 如何深度复制 NSMutableURLRequest?

Apple 关于NSMutableURLRequest的 iOS 文档说:

NSURLConnection 对传递给它的初始化器之一的每个 NSMutableURLRequest 对象进行深拷贝。

这是如何实施的?我没有看到任何记录在案的方法来执行NSMutableURLRequest对象的深层复制。逐个字段的复制不够好,因为NSMutableURLRequest可以进行子类化。

我的用例:我正在NSURLProtocol为构建在 http 之上的自定义协议实现。我的NSURLProtocol实现将执行其自定义内容,然后使用NSURLConnection稍作修改的NSURLRequest.

0 投票
2 回答
457 浏览

cocoa - 如何使 NSURL 指向本地目录?

今天阅读 Adium 代码,发现了一个有趣的 NSURL 用法:

我试图记录 url 并得到这个adium://im.adium.Smooth Operator.style/adium,然后我创建了一个空白项目来查看如何创建这样的 NSURL 但失败了。当我向项目中的 webview 框架发送 loadHTMLString 消息时,如果 baseURL 为 nil,一切都很好,如果不是,我在视图中得到一个空白页面。

这是我的代码,项目名称是 webkit

问题是如何制作自定义协议而不是 http://?

0 投票
0 回答
2588 浏览

ios - iOS:带有 UIWebView 的 HTTP Basic/Digest Auth

概述

我正在为 iOS 应用程序开发 SAML 登录(单点登录,类似于 openID)解决方案,该解决方案涉及显示带有 a 的视图控制器,UIWebView并且在处理 HTTP 基本/摘要时遇到了计时和/或超时问题中的身份验证UIWebView

具体来说,当客户端收到 HTTP 身份验证质询时,我会弹出一个UIAlertView提示用户输入用户 ID 和密码的提示。如果用户能够快速输入信息(< 10 秒),它就可以工作。但是,如果该条目花费的时间超过 10 秒,则连接似乎已终止,并且没有任何反应。

问题

  1. 调用是否有超时connection:didReceiveAuthenticationChallenge:会阻止我提示用户输入用户 ID 和密码(并且必须等待用户输入)?有没有人有解决方法(例如,某种方式来延长连接超时)?
  2. UIWebView有没有比 的子类更好的方法来处理来自 a 的 HTTP 基本/摘要身份验证NSURLProtocol

详细信息和代码

对于我们需要处理的大多数 SAML 系统,登录将在UIWebView. 但是,我们需要处理的一些系统回退到对移动浏览器使用 HTTP 基本或 HTTP 摘要身份验证,因此我们也需要能够处理它。

最大的挑战始于 UIWebView 不暴露下面的网络调用这一事实。为了满足我的需要,我创建了一个子类NSURLProtocol并根据需要注册了它:

SMURLProtocol这样,当发出 HTTP 基本/身份验证质询时,就会调用此方法,所以我返回 YES,我们可以处理 HTTP 基本和摘要身份验证:

现在我已经告诉网络堆栈 SMURLProtocol 可以处理身份验证挑战,所以它调用

如您所见,我正在启动一个 UIAlertView 来提示用户输入用户 ID 和密码。我必须在主线程上执行此操作,因为(显然,我不确定)网络代码在后台线程上运行。我添加了信号量和明确的 Grand Central Dispatch 代码来解决我看到的偶尔崩溃(基于此线程)。

最后一部分是接受用户 ID 和密码的 UIAlertView 委托为挑战构建凭证:

正如我在概述中所说,如果用户能够在不到 10 秒的时间内输入用户 ID 和密码,这一切都很好。如果需要更长的时间,则连接似乎会超时,并且将凭据传递给质询的发件人无效。

0 投票
2 回答
10125 浏览

ios - 如何使用 NSURLProtocol 模拟 AJAX 调用?

我有 UIWebview 对外部服务进行 AJAX 调用。离线时我需要捕获这些请求并返回本地 json。

我实现了一个 NSURLProtocol 并且我设法捕获了 AJAX 请求,问题是 jquery 总是返回一个 0 错误代码:

});

我总是得到一个 request.status = 0

为了测试我的协议,我尝试在我的 html 中模拟一个图像,并且效果很好。

  • 从 google.fr => 对图像的 HTML 请求工作正常
  • 在亚马逊上对 json 的 AJAX 调用 =>失败

这是我的完整实现:

0 投票
1 回答
4268 浏览

ios - 可以使用 NSURLProtocol 的子类播放视频,使用 MPMovieController 或 AVFoundation?

我目前正在尝试将视频播放到具有自定义 NSURLProtocol 子类中定义的自定义方案的 URL。最初我使用 MPMoviePlayerController 试图完成此操作,但在遇到问题并检查堆栈溢出后,我发现 MPMoviePlayerController 没有按预期处理 NSURLProtocol 子类。

如何使用自定义 NSURLProtocol 播放带有 URL 的电影?

结果我决定查看 AVFoundation 框架,但是,这似乎也不起作用。我只是想知道这是否可能,还是我想穿过墙壁?

使用 AVFoundation,我使用的方法如下所示。值得一提的是,这在使用标准 URL 指向 Internet 上托管的视频时有效,但不适用于自定义 NSURLProtocol。

为了从定义的 NSURLProtocol 子类中播放,是否需要做一些不同的事情?

0 投票
1 回答
2809 浏览

avplayer - iOS上AVPlayer使用NSURLProtocol实现边下载边播放

我正在尝试在我的服务器上播放 mp4 视频,我想同时将此视频缓存到磁盘。

我知道我可以只使用 2 个请求来执行此操作,一个用于下载另一个由 AVPlayer 创建的用于播放视频,但这会浪费网络带宽。

所以我只需要使用一个外部请求来下载数据并从 MyNSURLProtocol 中的 AVPlayer 捕获所有 NSURLRequest 并为它们手动创建 NSHTTPURLResponse 。

这是工作流程的样子:

通过使用 Charles,我可以看到 AVPlayer 在 Internet 上播放视频需要 2 个步骤。第一步是下载前 2 个字节,以了解整个视频文件的大小。以下请求将同时下载文件的不同部分。

所以 MyNSURLProtocol 所做的只是使用外部请求下载整个 mp4 文件,当有足够的数据时,它将创建发送到 AVPlayer 的响应(也是数据)。

这就是它为 2 字节请求创建和发送响应的方式。

问题是AVPlayer 没有发送以下请求来获取实际数据,嗯......有什么线索吗?

0 投票
1 回答
4269 浏览

ios - CFNetwork 内部错误

我正在使用缓存系统创建自己的 NSURLProtocol,我在控制台上看到了这个:

4676:CFNetwork 内部错误(0xc01a:/SourceCache/CFNetwork_Sim/CFNetwork-609.1.4/Connection/URLConnectionClient.cpp:558

知道是什么原因造成的吗?

没有迹象表明在当前出现的情况下没有正确处理任何流量。响应被缓存,服务器发回 304 未修改,我加载缓存的响应,然后在退出另一个线程时记录该错误。

0 投票
0 回答
325 浏览

ios - 可以从外部代码访问自定义 NSURLProtocol 吗?

我的应用注册了一个截获一个特定 URL 的 NSURLProtocol 子类。该协议使用密钥回复请求。

只有我的代码和我链接的库应该能够看到密钥。有进取心的用户如何获得我的密钥?这安全吗?

对于那些好奇的人,这是 DRM 设置的一部分。AVPlayer 将请求密钥,以便它可以播放加密媒体。