UIWebView修改注册userAgent,Request修改请求头HTTPHeader

错误示范1:只有当前请求页面有效
NSMutableURLRequest *mutableReqeust = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:cleanString]];
[mutableReqeust addValue:[NSString stringWithFormat:@"%@_appkey", [Config connectionUserAgent], nil] forHTTPHeaderField:@"ua"];
错误示范2:会产生返回错误且修改不成功等
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSLog(@"allHeaderFields:%@", request.allHTTPHeaderFields);
    if ([[request.URL absoluteString] hasSuffix:@"/user/index"]) {
        NSDictionary* dic = [request allHTTPHeaderFields];
        NSString* str = [dic objectForKey:@"UA"];
        if(!str){
            NSMutableURLRequest *mutableReqeust = [request mutableCopy];
            [mutableReqeust setValue:[NSString stringWithFormat:@"%@_appkey", str, nil] forHTTPHeaderField:@"User-Agent"];//修改无效
//            [mutableReqeust addValue:[NSString stringWithFormat:@"%@_appjiaoyi", str, nil] forHTTPHeaderField:@"UA"];
            [webView loadRequest:mutableReqeust];
            [mutableReqeust release];
            return NO;
        }
}
    
    }


正确代码:
    UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectZero];
    NSString *oldAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
    NSLog(@"old agent :%@", oldAgent);
    
    //add my info to the new agent
    NSString *newAgent = [oldAgent stringByAppendingString:@"_appkey"];
    NSLog(@"new agent :%@", newAgent);
    
    //regist the new agent
    NSDictionary *dictionnary = [[NSDictionary alloc] initWithObjectsAndKeys:newAgent, @"UserAgent", nil];
    [[NSUserDefaults standardUserDefaults] registerDefaults:dictionnary];
扩展阅读:
UIWebView 直接 loadRequest: 通过 NSURLReqeust 直接进行网络请求,但在 NSURLReqeust 上的设置,不会都全部应用到 UIWebView,比如 User Agent 的这个 Header 就是一例。也就是说,你在 NSURLReqeust 设置了 User Agent 这个 header,然后满怀期望在 UIWebView 的 loadReqeust: 中使用会得到想要的结果,很遗憾,失败了。

那么,如何给 UIWebView 设置 User Agent?这里需要重载一个默认设置(NSUserDefaults)
NSDictionary *dictionary = @{@"UserAgent": @"Your User Agent"};
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];

经测试,每个 UIWebView 实例的创建都会去读这个 UserAgent 的设置,所以这个设置不是整个 App 生命周期的,你可以任意的控制具体的 UIWebView 用什么样的 User Agent。
比如可以在 ViewController 的 loadView: ,先注册一个默认 UserAgent,然后再呼叫 [super loadView] ,最后在 dealloc 里再注册回去。这样,仅在这个 UIWebView 的生命周期会使用你想要的 UserAgent,其他地方就不会受到影响了。

最后,还是那个疑问,为什么 UIWebView 的 loadReqeust 的 Header 设置无效,是不是因为 UIWebView 自己的设置优先级比 NSURLRequest 的高?

参考代码:http://www.xuebuyuan.com/2191512.html

http://stackoverflow.com/questions/478387/change-user-agent-in-uiwebview-iphone-sdk/23654363#23654363

来源:http://www.jianshu.com/p/7c89b8c5482a
NSURLProtocol
  NSURLProtocol能够让你去重新定义苹果的URL加载系统 (URL Loading System)的行为,URL Loading System里有许多类用于处理URL请求,比如NSURL,NSURLRequest,NSURLConnection和NSURLSession等,当URL Loading System使用NSURLRequest去获取资源的时候,它会创建一个NSURLProtocol子类的实例,你不应该直接实例化一个NSURLProtocol,NSURLProtocol看起来像是一个协议,但其实这是一个类,而且必须使用该类的子类,并且需要被注册。
使用场景
  不管你是通过UIWebView, NSURLConnection 或者第三方库 (AFNetworking, MKNetworkKit等),他们都是基于NSURLConnection或者 NSURLSession实现的,因此你可以通过NSURLProtocol做自定义的操作。
重定向网络请求
忽略网络请求,使用本地缓存
自定义网络请求的返回结果
一些全局的网络请求设置


你可能感兴趣的:(UIWebView修改注册userAgent,Request修改请求头HTTPHeader)