的UIWebView捕获响应头(UIWebView capturing the response h

2019-07-21 21:30发布

我搜索/ GOOGLE了很多,但坚持不下去了如何捕获HTTP响应头的答案UIWebview 。 说我重定向到用户注册网关(这已经是活动的)中的UIWebView在App启动,当用户完成注册,应用程序应该分配给用户在注册成功的唯一ID这是在HTTP响应头传回通知。

有没有捕捉/使用打印HTTP响应头的任何直接的方式UIWebview

Answer 1:

我爱的Objective-C运行。 是否有你想要做的,但没有为它的API什么? DM; HR。

好了,在一个更严重的是,这里的解决了这一点。 这将捕获从发起的每个 URL响应CFNetwork ,这是一个UIWebView会在幕后使用。 它也将捕获的AJAX请求,图像加载等。

添加过滤器,以这大概应该是作为标题的内容做一个正则表达式一样简单。

@implementation NSURLResponse(webViewHack)

static IMP originalImp;

static char *rot13decode(const char *input)
{
    static char output[100];

    char *result = output;

    // rot13 decode the string
    while (*input) {
        if (isalpha(*input))
        {
            int inputCase = isupper(*input) ? 'A' : 'a';

            *result = (((*input - inputCase) + 13) % 26) + inputCase;
        }
        else {
            *result = *input;
        }

        input++;
        result++;
    }

    *result = '\0';
    return output;
}

+(void) load {
    SEL oldSel = sel_getUid(rot13decode("_vavgJvguPSHEYErfcbafr:"));

    Method old = class_getInstanceMethod(self, oldSel);
    Method new = class_getInstanceMethod(self, @selector(__initWithCFURLResponse:));

    originalImp = method_getImplementation(old);
    method_exchangeImplementations(old, new);
}

-(id) __initWithCFURLResponse:(void *) cf {
    if ((self = originalImp(self, _cmd, cf))) {
        printf("-[%s %s]: %s", class_getName([self class]), sel_getName(_cmd), [[[self URL] description] UTF8String]);

        if ([self isKindOfClass:[NSHTTPURLResponse class]])
        {
            printf(" - %s", [[[(NSHTTPURLResponse *) self allHeaderFields] description] UTF8String]);
        }

        printf("\n");
    }

    return self;
}

@end


Answer 2:

有没有办法从得到的回应对象UIWebView (文件中的错误与苹果的是,ID说)

但有两个解决方法

1)通过共享NSURLCache

- (void)viewDidAppear:(BOOL)animated {
    NSURL *u = [NSURL URLWithString:@"http://www.google.de"];
    NSURLRequest *r = [NSURLRequest requestWithURL:u];
    [self.webView loadRequest:r];
}

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    NSCachedURLResponse *resp = [[NSURLCache sharedURLCache] cachedResponseForRequest:webView.request];
    NSLog(@"%@",[(NSHTTPURLResponse*)resp.response allHeaderFields]);
}
@end

如果这对你的作品,这是理想的


其他

  1. 你可以完全使用NSURLConnection的,然后只用NSData的你下载喂UIWebView :)

那会是这种不好的解决办法! (理查德在评论中指出的。)它有主要的缺点,你必须看到,如果它在你的情况下,有效的解决方案

NSURL *u = [NSURL URLWithString:@"http://www.google.de"];
NSURLRequest *r = [NSURLRequest requestWithURL:u];
[NSURLConnection sendAsynchronousRequest:r queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *resp, NSData *d, NSError *e) {
    [self.webView loadData:d MIMEType:nil textEncodingName:nil baseURL:u];
    NSLog(@"%@", [(NSHTTPURLResponse*)resp allHeaderFields]);
}];


Answer 3:

如果你想什么@Richard J.罗斯III的写了一个更加高级API代码,你需要继承NSURLProtocol 。

一个NSURLProtocol是一个对象,它处理URL请求。 所以,你可以用它来这是在更好地描述特定任务NSHipster和雷Wenderlich ,其中包括您从响应获取HTTP标头的情况。

创建NSURLProtocol和您的.h文件中一个新的类的子类应该是这样的:

@interface CustomURLProtocol : NSURLProtocol <NSURLConnectionDelegate>

@property (nonatomic, strong) NSURLConnection *connection;

@end

你.m文件应该有这些方法来处理你希望的东西

@implementation CustomURLProtocol

+ (BOOL)canInitWithRequest:(NSURLRequest *)request {
    // Here you can add custom filters to init or not specific requests
    return YES;
}

+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request {
    // Here you can modify your request
    return request;
}

+ (BOOL)requestIsCacheEquivalent:(NSURLRequest *)a toRequest:(NSURLRequest *)b {
    return [super requestIsCacheEquivalent:a toRequest:b];
}

- (void)startLoading {
    // Start request
    self.connection = [NSURLConnection connectionWithRequest:self.request delegate:self];
}

- (void) stopLoading {
    [self.connection cancel];
    self.connection = nil;
}

#pragma mark - Delegation

#pragma mark NSURLConnectionDelegate

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;

        // Here we go with the headers
        NSDictionary *allHeaderFields = [httpResponse allHeaderFields];
    }

    [self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [self.client URLProtocol:self didLoadData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    [self.client URLProtocolDidFinishLoading:self];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    [self.client URLProtocol:self didFailWithError:error];
}

还做最后一件事是注册这个协议来装载系统,这是很容易实现的AppDelegate中:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [NSURLProtocol registerClass:[CustomURLProtocol class]];
    return YES;
}


Answer 4:

NSHTTPURLResponse有类似方法

- (NSDictionary *)allHeaderFields

欲了解更多信息https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSHTTPURLResponse_Class/Reference/Reference.html#//apple_ref/occ/cl/NSHTTPURLResponse

编辑:对不起,我没有想到UIWebView 。 我的解决办法工作,如果你使用NSURLConnection

但是如果你喂你的WebView有NSURLConnection ,那么你必须捕捉,包括响应头连接的机会。



文章来源: UIWebView capturing the response headers