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 中调用一次即可,一劳永逸。