设置自定义 UserAgent

1.这种方法是全局的,且只需要调用一次,如果重复调用则会重复拼接,若想修改值的话,则需要根据特殊标志来查找替换。

- (void)setWebUserAgent {
    //iOS 8 的处理方式
    if (!(IOS9_OR_LATER)) {
        UIWebView *tempWebView = [[UIWebView alloc] initWithFrame:CGRectZero];
        NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
        NSString *currentAgent = [tempWebView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
        NSString *userToken = xxxx;
        tempWebView = nil;

        NSString *oldAgent = @"";
        if ([currentAgent containsString:@";YourAppSchema"] && [currentAgent containsString:@"userToken:"]) {
            NSRange range = [currentAgent rangeOfString:@";YourAppSchema:"];
            if (range.length > 0) {
                oldAgent = [currentAgent substringToIndex:range.location];
            }
        } else {
            oldAgent = currentAgent;
        }
        NSString *newUserAgent = [NSString stringWithFormat:@"%@;YourAppSchema:%@ userToken:%@", oldAgent, appVersion, userToken?userToken:@""];
        NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:newUserAgent, @"UserAgent", nil];
        [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
    }
}

2.对于 iOS 9 系统之后,只需要用 WKWebView 的 customUserAgent 属性直接修改接口,而且可以重复调用。

- (void)setWebUserAgent {
    UIWebView *tempWebView = [[UIWebView alloc] initWithFrame:CGRectZero];
    NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
    NSString *oldAgent = [tempWebView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
    NSString *userToken = xxxx;
    tempWebView = nil;
    
    if (IOS9_OR_LATER) {
        //iOS 9 later 已经有系统方法可以实现
        NSString *newUserAgent = [NSString stringWithFormat:@"%@;YourAppSchema:%@ userToken:%@", oldAgent, appVersion, userToken?userToken:@""];
        self.webView.customUserAgent = newUserAgent;
    }
}

总结:不建议使用 User-Agent 共享可变的一些参数,如果的确需要,使用方法一,进行查找替换,对于 iOS 9 之后的,使用新方法赋值即可。

若是不变的一些参数,推荐直接使用方法一,在 appdelegate 中调用一次即可,一劳永逸。

你可能感兴趣的:(设置自定义 UserAgent)