ios – NSURLProtocol canInitWithRequest:仅适用于某些请求

我有一个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:仅适用于某些请求所遇到的程序开发问题。

如果觉得来客网网站内容还不错,欢迎将来客网网站推荐给程序员好友。