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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容