ios上webView获取UserAgent
在某种情况下,原生与H5交互处理的时候,需要获取原生的设备等信息,这个时候需要用userAgent了:
///查看相对应的webView的userAgent
UIWebView方式
NSString *userAgent = [[UIWebView new] stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
DebugLog(@"userAgent :%@", userAgent);
WKWebView方式
[[WKWebView new] evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id result, NSError *error) {
DebugLog(@"userAgent :%@", result);
}];
///为userAgent添加附属信息
NSString *defaultUserAgent = [[NSString alloc] initWithFormat:@"IND/0.9.3;%@ %@;Apple;%@;%@", [UIDevice currentDevice].systemName, [UIDevice currentDevice].systemVersion, [UIDevice platform], [[UIWebView new] stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"]];
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:defaultUserAgent, @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
WKWebView拦截URL处理原生跳转
iOS8出来之后苹果粑粑提供了一套新的加载网页的控件WKWebView,按照官方的说法比UIWebView优化进步了多少就不提了,根据新的WKNavigationDelegate提供的代理,可以较为方便的进行交互跳转的处理
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
// 获取完整url并进行UTF-8转码
NSString *requestURL = [navigationAction.request.URL.absoluteString stringByRemovingPercentEncoding];
//根据约定好的自定义链接内容进行判断
if ([requestURL hasPrefix:@"app://"]) {
// 拦截点击链接
[self clickToNativeAction:requestURL];
//拦截,取消跳转
decisionHandler(WKNavigationActionPolicyCancel);
} else {
// 允许跳转
decisionHandler(WKNavigationActionPolicyAllow);
}
}
- (void)clickToNativeAction:(NSString *)url {
// 判断跳转
NSString *urlStr = @"";
if ([url hasPrefix:@"app://video"]) {
// 某个视频被点击到了 手动处理跳转的交互
} else if ([URL hasPrefix:@"app://audio"]) {
// 某个音轨点击到了 处理跳转交互
}
}
原生和H5的交互处理越来越火热,一些东西还是需要多了解了解比较合适,懂多一点总是好的。
WKWebView遇到_blank
_blank标签,是在浏览器上面新开一个或者页面打开当前的链接,而不是在原来的网页上面堆栈打开,而在WKWebView上面则无法操作,系统自动拦截处理掉了。因此处理的方式是需要在WKWebView的代理中处理
- (WKWebView *)webView:(WKWebView *)webView
createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration
forNavigationAction:(WKNavigationAction *)navigationAction
windowFeatures:(WKWindowFeatures *)windowFeatures {
WKFrameInfo *frameInfo = navigationAction.targetFrame;
if (![frameInfo isMainFrame]) {
[webView loadRequest:navigationAction.request];
}
return nil;
}
上面这种方式是在原有的基础上面强制让webview加载该链接,这也只能说是H5适配移动端的程度不好导致的。并且也是较好的不注入代码的方式进行的处理。