ios – NSURLProtocol canInitWithRequest:仅适用于某些请求
2019年07月06日
作者:佚名
我有一个WebView,我想拦截和修改来自不同站点的某些请求.我对每个截获的请求进行完全相同的修改,无论它来自哪个站点.由于看似没有理由,它适用于除了一个以外的每个站点.这是我的代码:
在我的ResourceLoadDelegate中
- (NSURLRequest *)webView:(WebView *)sender resource:(id)identifier willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse fromDataSource:(WebDataSource *)dataSource { //predicates const NSPredicate *site1Predicate = [NSPredicate predicateWithFormat:@"SELF like "/*predicate1*/""]; const NSPredicate *site2Predicate = [NSPredicate predicateWithFormat:@"SELF like "/*predicate2*/""]; const NSPredicate *site3Predicate = [NSPredicate predicateWithFormat:@"SELF like "/*predicate3*/""]; const NSPredicate *site4Predicate = [NSPredicate predicateWithFormat:@"SELF like "/*predicate4*/""]; const NSPredicate *site5Predicate = [NSPredicate predicateWithFormat:@"SELF like "/*predicate5*/""]; //predicate arrays const NSArray *songPredicates = [NSArray arrayWithObjects:site1Predicate,site2Predicate,site3Predicate,site4Predicate,site5Predicate,nil]; //site is an int with its defined in an enum if ([[songPredicates objectAtIndex:site-1] evaluateWithObject:request.URL.host]) { NSMutableURLRequest* newRequest = [request mutableCopy]; [InterceptionProtocol setProperty:self forKey:@"MyApp" inRequest:newRequest]; dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{ /* Do stuff */ }); return newRequest; } return request; }
在InterceptionProtocol.m中
+ (BOOL) canInitWithRequest:(NSURLRequest*)request { id delegate = [NSURLProtocol propertyForKey:@"MyApp" inRequest:request]; if (delegate) NSLog(@"Can init: %@",request); return (delegate != nil); }
出于某种原因,除了站点4之外,这对于除了站点4之外的所有内容都非常有效.我已经完成了代码并且我知道谓词正确匹配.我不知道这对其他网站有什么用,但不是这个.有任何想法吗?
编辑
完整的源代码可以在这里找到:
http://github.com/garrett-davidson/iLikeMusic
解决方法
似乎问题是谓词4与site4不匹配.关于单步执行代码并且正确匹配的说明令人困惑 – 如果是这种情况,一切都会正常工作,不是吗?
可能是你手动测试了你对谓词所期望的url – 而是你在实际运行期间得到的东西略有不同(比如由于URL编码 – 有空格或/或?是或编码%).在evaluateWithObject之前放置NSLog:看看request.URL.host中到底出现了什么?
以上是来客网为你收集整理的ios – NSURLProtocol canInitWithRequest:仅适用于某些请求全部内容,希望文章能够帮你解决ios – NSURLProtocol canInitWithRequest:仅适用于某些请求所遇到的程序开发问题。
如果觉得来客网网站内容还不错,欢迎将来客网网站推荐给程序员好友。