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

ios - 来自 iOS SDK 的网络流量

假设我想构建一个与服务器通信的 SDK。我希望任何人(甚至是实现 SDK 的应用程序)拦截并查看我的请求/响应。

如果我使用像AFNetworking这样的通用库,则可以查看所有请求,即通过注册一个NSURLProtocol.

我假设如果我使用 ieCFNetworking来执行我的请求/响应处理,这将更难做到吗?还是我错过了什么?是否也可以拦截该流量?

0 投票
1 回答
144 浏览

ios - iOS Swift 如何告诉 UIView 控制器我们通过 NSURLProtocol 对象接收到信息

我创建了一个实现 NSURLProtocol 的类,它将告诉我有关 UIWebView 请求的信息。我希望告诉 UI 我们点击了感兴趣的 URL 并在 ViewController 上运行代码以访问 WebView。

我相信协议是解决方案,但似乎无法解决如何让它发挥作用。任何建议和代码示例将不胜感激。这是我到目前为止所尝试的。

UI 视图 Controller.swift

这是我的 NSURLProtocol 实现的类以及尝试的协议(如果它是错误的方法,请告诉我)

0 投票
2 回答
1850 浏览

ios - NSURLProtocol - 在 canInitWithRequest 为页面资源返回 YES 后未调用 startLoading

我遇到了一个问题,我的视频资源UIWebView没有加载。这只是实际设备上的一个问题 - 一切都在模拟器上完美运行。

注意:我已经检查过了,这里的问题与多次加载相同的内容有关。 在对 canInitWithRequest 的 YES 响应后不要求加载 NSURLProtocol

实际页面在我的自定义中加载得NSURLProtocol很好,它YEScanInitWithRequest(几次)返回,然后startLoading在大约第 4 次或第 5 次之后被调用。然后它以类似的方式加载我的 css 文件。然后我看到对我的视频对象的请求YES从返回canInitWithRequest,但没有任何反应。startLoading从来没有要求我的视频资源的请求。这是我加载页面时设备上的简化日志:

当我从在完全相同的设备类型上运行相同 iOS 版本的模拟器加载完全相同的页面时,日志显示资源实际上出于某种原因开始加载:

该页面留下了一个永远不会播放的视频 - 只是一个白框,它应该是和它上面的“播放视频”按钮。该页面看起来像是在不断地加载某些东西(状态栏中的活动指示器正在旋转),但没有发生任何事情,并且 Xcode 的调试导航器中的网络活动是扁平的。

tl; dr
有谁知道为什么我的 iPhone 上从未尝试加载此资源?显然模拟器知道它需要加载。


编辑:这是来自我的 NSURLProtocol 的略微编辑的相关代码

0 投票
1 回答
1313 浏览

ios - NSURLProtocol - startLoading not invoked

Since upgrading to iOS 9.1 my custom NSURLProtocol, won't invoke -(void)startLoading anymore. Has anyone else experienced this ?

Everything worked fine on iOS 8 ...

Code:

0 投票
2 回答
2326 浏览

ios - CFNetwork 中的 SIGABRT 导致 iOS 崩溃

我通过扩展 NSURLProtocol 在我的应用程序中使用自定义 url 协议。它在大多数情况下都可以正常工作,但我看到通过 crashlytics 报告了以下崩溃。我自己无法重现这一点。最让我担心的是,我没有在崩溃线程的堆栈跟踪中看到我的应用程序,所以我不知道从哪里开始调试。以下是崩溃报告

堆栈跟踪中有趣的部分是这几行..

我可以通过查看 NSURLProtocol 中 startLoading 和 stopLoading 方法的堆栈跟踪来确定,这些方法 ___ZN19URLConnectionLoader27_private_ScheduleOriginLoadEPK12NSURLRequestPK20_CFCachedURLResponse_block_invoke_2 调用 startLoading 而CFURLProtocol_NS::_protocolInterface_cancelLoad()调用 stopLoading 由于取消请求。那么,为什么或如何在尝试开始加载后立即调用取消?

任何帮助是极大的赞赏。谢谢。

更新:

我能够重现类似的(不确切的跟踪),我看到以下断言..

以下是回溯。

这是我的协议类的简化版本,其中 MyConnection 的工作方式与 NSURLConnection 非常相似。

@implementation 我的协议

之间,我看到的异常代码是

0 投票
1 回答
160 浏览

ios - 在 NSURLProtocol 的 startLoading 中单独调用

我正在尝试startLoading()在提交原始请求之前在内部进行单独的 http 调用。代码如下:

如果在 webView 中用于普通内容,则非常相同的代码可以工作(htm, css, etc。)[案例 1] 或m3u8/mpg[案例 2](播放器将自动嵌入到 web 视图中);

但是,如果直接与 AVPlayer 一起使用来播放相同的m3u8[案例 3],则验证调用将在该方法之后停留约 1 分钟(如果查看错误,则请求超时)canInitWithRequest()。随后导致以下请求失败。

一开始我以为是线程问题。但是第 1 行和第 2 行给出了不同的线程。

我怀疑 AVPlayer 使用了一些不同于 webView 的机制来处理 http 请求。在 [case 2] 中,webView 可能只是覆盖了 AVPlayer。但不确定。

有人可以提供更多见解吗?

谢谢!

0 投票
1 回答
875 浏览

ios - 测试是否遵守 NSURLSessionConfiguration 设置

我创建了一个带有一些默认设置的 NSURLSessionConfiguration ,但是当我在我的自定义 NSURLProtocol 中看到使用该配置创建的请求对象时,似乎并不是所有这些设置都是继承的,我有点困惑。

在我注册的自定义 NSURLProtocol

有什么方法可以检查我设置的那些参数是否被请求遵守和继承?

0 投票
2 回答
277 浏览

ios - 用于 UIWebView 的 NSURLProtocol 缓慢下载的占位符图像

我需要在我的 WebView 中从 iCloud 文档存储中加载图像我已经通过我自己的 NSURLProtocol 实现解决了这个问题。我的问题是,下载速度非常慢,用户在网页中看不到任何指示正在下载图像的指示符。

我想显示一个占位符图像,直到完成真实图像的下载:

在真实内容可用之前,您有什么想法可以显示占位符吗?

0 投票
2 回答
98 浏览

ios - 防止 NSURLProtocol 实现读取 URL

我们开发了一个 iOS 框架,将分发给其他开发人员,以便在他们的应用程序中使用并使用我们将提供的一些服务。它工作得很好(体外)。但是,由于URL 加载系统在 iOS 中的工作方式,只需几行代码,每个开发人员的肉眼都可以看到我们所有的 URL,包括我们珍视的所有 HTTPS url。

我知道默默无闻的安全从来都不是一个好主意(被普遍误解的 HTTPS 总是在客户端之外透明所掩盖)但我仍然有这个要求,以某种方式使我们的 URL 对实现开发人员不可见。

到目前为止,我已经考虑NSURLConnection为我们的框架实现一个简单的替代方案,但考虑到 HTTPS 要求和所有内容,这似乎是一项艰巨的任务。

无论如何,我们可以阻止NSURLProtocol注册更多课程或任何其他选项吗?

以下是一些有关如何NSURLProtocol破坏您的安全性的示例代码:

在你的application(_, didFinishLaunchingWithOptions:)-> Bool

PS:我清楚地记得有一次我试图改变一些与AVPlayer创建自定义DRM相关的url连接的结果,并遇到了一些不寻常的事实,即没有一个数据连接是由NSURLProtocols触发的!这可能是一个线索?!

0 投票
1 回答
800 浏览

https - 从 SSL 访问自定义方案/协议?

我们的 iOS 应用程序使用自定义协议 (NSURLProtocol) 来直接管理加载 UIWebview 所需的某些数据。这在 iOS 9 和 XCode 7 之前一直很好。

现在,由于主站点是使用 HTTPS 加载的,所以 UIWebview 在引用自定义协议资源时会抛出错误,因为它认为它不安全(实际上并非如此,我们使用 SSL 加载它,而不是 https://)。该应用程序已经使用“允许任意加载”构建,因为我们还有其他一些需要这样做的东西,我原以为它继承了 NSTemporaryThirdPartyExceptionAllowsInsecureHTTPLoads,这似乎正在与之抗衡,但谁知道呢。

有什么方法可以让 iOS 9 相信我们的自定义协议可以从 HTTPS 访问?注意 - 我们不在 UIWebview 中使用 iframe 或类似的东西 - 这些资源是使用 Ajax/XHR 请求的,并且应用程序的 NSURLProtocol 被调用并接管加载数据并返回响应。

自定义方案也列在 URL 类型中,但这似乎并没有改变任何行为(进出,同样的错误)。这是具体的错误:

[阻止] https://example.com/path/redacted的页面不允许显示来自 mycustomprotocol://different.example.com/path/redacted 的不安全内容。

编辑: 下载 Xcode 6.4,重建应用程序,它似乎在 iOS 9.x 上运行良好,自定义协议没有问题。显然,这不是一个长期的解决方案。希望有人仍然对如何在 Xcode 7+ 中解决问题有所了解。