标签: nsurlprotocol

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

如您所知,使用MPMoviePlayerController对象播放电影

[[MPMoviePlayerController alloc] initWithContentURL: aURL];
Run Code Online (Sandbox Code Playgroud)

现在,我想实现一个自定义NSURLProtocol,我将在其中解密已被AlgorithmDES加密的电影源.那可能吗?谢谢你给予任何想法.需要你的帮助〜

url mpmovieplayercontroller nsurlprotocol ios

8
推荐指数
3
解决办法
8141
查看次数

NSURLProtocol canInitWithRequest:多次调用

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

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

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

有任何想法吗?

uiwebview nsurlprotocol ios

8
推荐指数
1
解决办法
2030
查看次数

在CFNetwork中使用SIGABRT进行iOS崩溃

我通过扩展NSURLProtocol在我的应用程序中使用自定义URL协议.它大部分时间都可以正常工作但我看到通过crashlytics报告了以下崩溃.我自己无法重现这一点.最让我担心的是,我没有在崩溃的线程的堆栈跟踪中看到我的应用程序,所以我对从哪里开始调试毫无头绪.以下是崩溃报告

Thread : Crashed: com.apple.NSURLConnectionLoader
0  libsystem_kernel.dylib         0x3562cc84 __pthread_kill + 8
1  libsystem_pthread.dylib        0x356d0733 pthread_kill + 62
2  libsystem_c.dylib              0x355c4f21 abort + 108
3  libsystem_c.dylib              0x355a47eb __assert_rtn + 302
4  CFNetwork                      0x22b82e45 CFURLProtocol_NS::_protocolInterface_cancelLoad() + 322
5  CFNetwork                      0x22c3740f ___ZN19URLConnectionLoader27_private_ScheduleOriginLoadEPK12NSURLRequestPK20_CFCachedURLResponse_block_invoke_2 + 38
6  CFNetwork                      0x22b66ccd ___ZNK19URLConnectionLoader25withExistingProtocolAsyncEU13block_pointerFvP11URLProtocolE_block_invoke + 16
7  libdispatch.dylib              0x35513bd7 _dispatch_client_callout + 22
8  libdispatch.dylib              0x3551d187 _dispatch_block_invoke$VARIANT$mp + 446
9  CFNetwork                      0x22b66caf RunloopBlockContext::_invoke_block(void const*, void*) + 18
10 CoreFoundation                 0x2326ab51 CFArrayApplyFunction + 36
11 CFNetwork                      0x22b66b97 RunloopBlockContext::perform() + 182
12 …
Run Code Online (Sandbox Code Playgroud)

cfnetwork sigabrt nsurlprotocol ios ios9

8
推荐指数
1
解决办法
1992
查看次数

将自定义URL协议映射到HTTP(使用NSURLProtocol?)

我有一个使用WebKit WebView的应用程序,我想将使用自定义URL协议加载到此WebView中的URL映射到不同的HTTP URL.例如,假设我正在加载:

定制://路径/到/资源

我想在内部实际加载:

http://something-else.com/path/to/resource

换句话说,自定义协议几乎用作速记.但我不能使用-webView:resource:willSendRequest:redirectResponse:fromDataSource :,因为我希望WebKit实际上相信这是有问题的URL,而不是简单地从一个重定向到另一个.

到目前为止,我一直在尝试使用自定义NSURLProtocol子类.然而,这比我最初想的要复杂,因为至少根据我的理解,我将不得不在NSURLProtocol子类'startLoading方法中进行实际加载.我想要一种方法将工作交给现有的HTTP协议加载器,但我找不到一种简单的方法来做到这一点.

有没有人对此提出建议,或者可能是另一种解决此问题的方法?

谢谢!

cocoa webkit nsurlprotocol

7
推荐指数
1
解决办法
3098
查看次数

将NSURLProtocol与NSURLSession一起使用

我的应用程序用于NSURLConnection与服务器通信.我们使用https进行通信.为了在一个地方处理来自所有请求的身份验证,我使用NSURLProtocol并处理该类中的委托中的身份验证.现在我决定用NSURLSession而不是NSURLConnection.我想做得到NSURLProtocol的工作与NSURLSession 我创建了一个任务,并使用NSURLProtocol通过

NSMutableURLRequest *sampleRequest = [[NSMutableURLRequest alloc]initWithURL:someURL];
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
configuration.protocolClasses = @[[CustomHTTPSProtocol class]];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
NSURLSessionDataTask *task = [session dataTaskWithRequest:checkInInfoRequest];
[task resume];
Run Code Online (Sandbox Code Playgroud)

CustomHTTPSProtocol这是我的NSURLProtocol班级看起来像这样

static NSString * const CustomHTTPSProtocolHandledKey = @"CustomHTTPSProtocolHandledKey";

@interface CustomHTTPSProtocol () <NSURLSessionDataDelegate,NSURLSessionTaskDelegate,NSURLSessionDelegate>

@property (nonatomic, strong) NSURLSessionDataTask *connection;
@property (nonatomic, strong) NSMutableData *mutableData;

@end

@implementation CustomHTTPSProtocol

+ (BOOL)canInitWithRequest:(NSURLRequest *)request {
    if ([NSURLProtocol propertyForKey:CustomHTTPSProtocolHandledKey inRequest:request]) { …
Run Code Online (Sandbox Code Playgroud)

xcode nsurl nsurlprotocol ios nsurlsession

7
推荐指数
1
解决办法
2962
查看次数

将NSURLConnection切换为NSURLSession后,自定义NSURLProtocol速度较慢

NSURLProtocol编写了一个自定义("UrlProtocol")来拦截UIWebView导航到特定网站时的请求,并在发送之前应用额外的HTTP标头.我跟着https://www.raywenderlich.com/59982/nsurlprotocol-tutorial上了一个工人阶级.我的问题是从已弃用的切换NSURLConnectionNSURLSession:我测试了一个非常简单的单文件html页面,它已成功加载.但是,具有js文件,图像等资源的稍微复杂的站点将超时,而使用NSURLConnection整个站点将在几秒钟内加载.

我将UrlProtocol使用原始粘贴NSURLConnection,然后使用新类NSURLSession.原本的:

#import "UrlProtocol.h"
#import "Globals.h"

@implementation UrlProtocol

+ (BOOL)canInitWithRequest:(NSURLRequest *)request {
    if (![request.URL.absoluteString hasPrefix:@"http"]) return NO; //No need to intercept non-http requests

    if ([NSURLProtocol propertyForKey:@"handled" inRequest:request]) {
        return NO;
    }

    return YES;
}

+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request {
    NSString* key = @"custom-auth-header";
    Globals* globals = [Globals getInstance];
    NSString* token = [globals token];

    NSMutableURLRequest *newRequest = [request mutableCopy]; //Create a mutable copy …
Run Code Online (Sandbox Code Playgroud)

objective-c request nsurlprotocol ios nsurlsession

7
推荐指数
1
解决办法
498
查看次数

如何拦截 WKWebView 请求以检测哪些本地资源文件(css、js、png 等)与 HTML 文件一起加载?

我有一个 HTML 文件,其中包含本地资源文件,例如其内容中的 css、js 和 png 文件。这些本地资源文件采用 zip 格式。我的应用程序使用 WKWebView 来显示这个 html 文件。我想找到一个解决方案来拦截 web 视图请求,以检测哪些本地资源文件与此 html 文件一起加载 -> 如果它们仍然是 zip 格式,则将它们解压缩。

我的 HTML 数据内容包含数千个这样的本地资源文件,因此在显示内容之前我无法解压缩所有这些文件。使用 UIWebView,我们使用 NSURLProtocol 子类拦截请求,检测本地资源文件并根据用户正在查看的 html 页面按需解压缩。

将 UIWebView 转换为 WKWebView 时遇到此问题。类似的问题在这里发布:https : //forums.developer.apple.com/thread/87474

======== 更新 ========>

我通过使用WKURLSchemeHandler 弄清楚了

注意:您需要将文件方案更改为自定义方案才能使用 WKURLSchemeHandler,因为它不适用于文件、http、https 等标准方案。

1. 向 WKWebView 注册自定义方案

    let configuration = WKWebViewConfiguration()
    configuration.setURLSchemeHandler(self, forURLScheme: "x-file")
    webView = WKWebView(frame: view.bounds, configuration: configuration)
Run Code Online (Sandbox Code Playgroud)

2. 将文件方案转换为自定义方案(x-file),然后使用 WKWebView 加载它

    let htmlPath = Bundle.main.path(forResource: "index", ofType: "html")
    var htmlURL = URL(fileURLWithPath: htmlPath!, …
Run Code Online (Sandbox Code Playgroud)

javascript css nsurlprotocol wkwebview wkurlschemehandler

7
推荐指数
2
解决办法
3760
查看次数

NSURLProtocol和上传后进度

我正在使用NSURLProtocol的子类来拦截所有HTTP调用并修改用户代理以及添加我的服务器所需的其他http头.

-(id)initWithRequest:(NSURLRequest *)request
      cachedResponse:(NSCachedURLResponse *)cachedResponse
              client:(id <NSURLProtocolClient>)client
{
    NSMutableURLRequest* lInnerRequest;
    //************************************************

    lInnerRequest = [request mutableCopy];
    [lInnerRequest setValue:@"MyUserAgent" forHTTPHeaderField:@"User-Agent"];

    //************************************************
    self = [super initWithRequest:lInnerRequest
                   cachedResponse:cachedResponse
                           client:client];
    //************************************************
    if (self) 
    {
        self.innerRequest = lInnerRequest;  
    }
    //***********************************00*************
    [lInnerRequest release];
    //************************************************
    return self;
}
Run Code Online (Sandbox Code Playgroud)

然后我的协议使用NSURLConnection

- (void)startLoading
{
self.URLConnection = [NSURLConnection connectionWithRequest:self.innerRequest delegate:self];
}
Run Code Online (Sandbox Code Playgroud)

然后,我通过将调用转发到等效的NSURLProtocolClient方法来实现NSURLConnection中的所有委托方法.这通常很好,但是当我将数据上传到服务器时,使用NSURLConnection的代码不会被回调:

连接:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:

我理解为什么这是因为我没有在NSURLProtocol中实现该方法,因为没有可用于报告上载进度的等效NSURLProtocolClient方法.

有人找到了解决方法吗?

nsurlconnection nsurlprotocol ios

6
推荐指数
1
解决办法
1184
查看次数

NSURLProtocol对视频请求失败

我在通过NSURLProtocol子类中的特殊协议方案处理视频请求时遇到了一些问题.每个其他资源(图像/文本)都得到正确处理,但是,当发送视频请求时,我只会调用'canInitWithRequest'而不会跟进.所以,我的视频资源无法解决.现在,我环顾四周,发现没有明确的解决办法.有些人使用嵌入式HTTP服务器,但这似乎有点过分.有谁知道这是一个错误,或者如果没有,为什么这个限制,是否有解决方法?

类似的问题:在HTML5文档中加载视频时,WebView的自定义NSURLProtocol类不起作用,但遗憾的是没有答案.

iphone nsurlprotocol ipad ios

6
推荐指数
1
解决办法
636
查看次数

有没有办法在自定义配置的NSURLSession中使用NSURLProtocol?

我有一个在后台队列中运行的NSURLSession.我正在添加我的NSURLProtocol子类,NSURLsessionConfiguration.protocolClasesoverride class func canInitWithRequest(request: NSURLRequest) -> Bool永远不会被调用.

这就是我添加我的方式 NSURLProtocol

let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.protocolClasses!.append(MockNetwork)
urlSession = NSURLSession(configuration: configuration, delegate: self, delegateQueue: operationQueue)
Run Code Online (Sandbox Code Playgroud)

此外,我尝试使用不在后台运行的会话,但也没有工作:

let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.protocolClasses!.append(MockNetwork)
urlSession = NSURLSession(configuration: configuration)
Run Code Online (Sandbox Code Playgroud)

由于这不起作用我只是尝试:

urlSession = NSURLSession.sharedSession()
Run Code Online (Sandbox Code Playgroud)

并在我的AppDelegate中调用它

NSURLProtocol.registerClass(MockNetwork)
Run Code Online (Sandbox Code Playgroud)

这确实有用,我做错了什么?!

nsurlprotocol nsurlsession swift

6
推荐指数
1
解决办法
3030
查看次数