使用WKWebView写入UA
2021-04-23 本文已影响0人
ImmortalSummer
User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
前端页面通过js执行window.navigator.userAgent
可以读取到该字符串,并获取其中携带的信息
通常, 我们可以通过创建一个UIWebView临时浏览器的方法读取和写入UA
- (void)viewDidLoad {
[super viewDidLoad];
//写入UA
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
NSString *appVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
UIWebView *temp_webView = [[UIWebView alloc] init];
NSString *ua_string = [temp_webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
NSArray *tempUA_arr = [ua_string componentsSeparatedByString:@" MyAPP"];
ua_string = tempUA_arr.firstObject;
ua_string = [NSString stringWithFormat:@"%@ MyAPP iphone_v%@",ua_string,appVersion];
NSDictionary *dictionary = @{@"UserAgent":ua_string};
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
}
但是随着UIWebView被弃用, 我们现在都换成WKWebview, 如果再使用UIWebView临时浏览器获取UA, 可能会被查出使用UIWebView 的api而被App Store拒绝, 所以我们可以考虑使用WKWebView来获取UA.
//
// BBWUserAgentTools.h
// Created by wyt on 2020/12/16.
//
#import <UIKit/UIKit.h>
@interface BBWUserAgentTools : UIViewController
-(void)saveOriginalWebUserAgentToUserDefaults;
+(void)setupWebUserAgent;
@end
//
// BBWUserAgentTools.m
// Created by wyt on 2020/12/16.
//
#import "BBWUserAgentTools.h"
#import <WebKit/WebKit.h>
@interface BBWUserAgentTools ()<WKScriptMessageHandler>
@property(nonatomic, strong) WKWebView *temWebView; // 强引用一下
@end
@implementation BBWUserAgentTools
// 通过WKWebView获取原始的ua,并存入userdefault
- (void)saveOriginalWebUserAgentToUserDefaults {
// webView要强引用一下
self.temWebView = [[WKWebView alloc] init];
[self.temWebView evaluateJavaScript:@"window.navigator.userAgent;" completionHandler:^(id _Nullable result, NSError * _Nullable error) {
if (error) {
NSLog(@"UA: Error == %@", error.localizedDescription);
} else {
NSLog(@"userAgent == %@", result);
if ([result isKindOfClass:[NSString class]]) {
NSString *ua = (NSString *)result;
if (ua.length) {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:ua forKey:@"UserDefaultKey_OriginalUserAgent"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
}
}
self.temWebView = nil; // 销毁
}];
}
// webview初始化的时候,将基础信息写入UA
+(void)setupWebUserAgent{
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
NSString *appVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
NSString *ua_string = [[NSUserDefaults standardUserDefaults] objectForKey:@"UserDefaultKey_OriginalUserAgent"];
NSArray *tempUA_arr = [ua_string componentsSeparatedByString:@" MyAPP"];
ua_string = tempUA_arr.firstObject;
ua_string = [NSString stringWithFormat:@"%@ MyAPP iphone_v%@", ua_string, appVersion];
NSDictionary *dictionary = @{@"UserAgent":ua_string};
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
}
@end
使用WKWebView读取ua, 使用过执行js 语句window.navigator.userAgent;
来实现的, 而WKWebView执行js语句是异步的, 所以有两点需要注意:
1.这个临时的WKWebView需要强引用, 否则还未接收到js回调结果就被释放了, 无法获取到异步执行的js结果.
2.由于是执行js语句是异步的, 所以我们无法保证在需要写入ua的时候可以随时读取随时使用, 所以应该在app启动的时候就先读取然后存入userdefault进行持久化, 后边用的时候直接从userdefault中读取.
调用如下:
// 在app启动的时候调用saveOriginalWebUserAgentToUserDefaults 方法, 将ua读取并存入userdefault中
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 通过WKWebView获取原始的ua,并存入userdefault,当webview初始化时可以拼接基础信息到ua中
[[BBWUserAgentTools new] saveOriginalWebUserAgentToUserDefaults];
}
// 在WKWebView初始化的时候, 通过调用 [BBWUserAgentTools setupWebUserAgent] 方法来设置ua