最近在項(xiàng)目里使用WKWebView碰到的一些問題岗憋,在這里跟大家分享下經(jīng)驗(yàn)洋措。
1、修改userAgent
// 修改userAgent 不管iOS9以上還是以下都可以
- (void)webviewSetUserAgent{
UIWebView *webView = [UIWebView new];
NSString *oldAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
NSString *newAgent = [oldAgent stringByAppendingString:@"你需要添加的String"];
NSDictionary *dict = @{@"UserAgent":newAgent};
[[NSUserDefaults standardUserDefaults] registerDefaults:dict];
}
2淌铐、禁止長(zhǎng)按出現(xiàn)菜單
WKUserContentController *userContentController = [[WKUserContentController alloc] init];
// 禁止長(zhǎng)按出現(xiàn)菜單
NSString *source = @"var style = document.createElement('style'); \
style.type = 'text/css'; \
style.innerText = '*:not(input):not(textarea) { -webkit-user-select: none; -webkit-touch-callout: none; }'; \
var head = document.getElementsByTagName('head')[0];\
head.appendChild(style);";
WKUserScript *script = [[WKUserScript alloc] initWithSource:source injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
[userContentController addUserScript:script];
3肺然、禁止放大縮小
// 頁(yè)面加載完成之后調(diào)用
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
// 禁止放大縮小
NSString *js = @"var script = document.createElement('meta');"
"script.name = 'viewport';"
"script.content=\"width=device-width, initial-scale=1.0,maximum-scale=1.0, minimum-scale=1.0, user-scalable=no\";"
"document.getElementsByTagName('head')[0].appendChild(script);";
[webView evaluateJavaScript:js completionHandler:nil];
}
4、webview加載h5打開微信腿准、支付寶客戶端并返回app
這里需要向微信申請(qǐng)h5支付际起,并設(shè)置一些參數(shù)
常見的問題看這里
// webview加載url(微信、支付寶)
NSMutableURLRequest *request;
request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlStr]];
// xxxx是自己設(shè)置的app URL Scheme
[request setValue:@"xxxx://" forHTTPHeaderField:@"Referer"];
[self.webView loadRequest:request];
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{
if ([navigationAction.request.URL.absoluteString containsString:@"weixin://"]) {// 微信
decisionHandler(WKNavigationActionPolicyCancel);
[self cancelClick];//回到選項(xiàng)頁(yè)
// wkwebview要這樣解決
[[UIApplication sharedApplication] openURL:navigationAction.request.URL];
}
} else if ([navigationAction.request.URL.absoluteString containsString:@"alipay://"]){// 支付寶
decisionHandler(WKNavigationActionPolicyCancel);
// 支付寶這里是URLDecode編碼了吐葱,解碼后發(fā)現(xiàn)有個(gè)參數(shù)fromAppUrlScheme:alipays,將alipays換成自己的app URL Scheme
NSString *decodedString = [self URLDecodedString:navigationAction.request.URL.absoluteString];
if ([decodedString containsString:@"fromAppUrlScheme"]) {
// 去掉alipay://alipayclient/?前綴街望,因?yàn)楹竺婢幋a會(huì)導(dǎo)致錯(cuò)誤(這里先去掉,編碼后在加上)
NSString *subStr = [decodedString stringByReplacingOccurrencesOfString:@"alipay://alipayclient/?" withString:@""];
// xxxx是自己設(shè)置的app URL Scheme
NSString *repStr = [subStr stringByReplacingOccurrencesOfString:@"alipays" withString:@"xxxx"];
NSString *encodedString = [NSString stringWithFormat:@"alipay://alipayclient/?%@",[self URLEncodedString:repStr]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:encodedString]];
}
} else {
[[UIApplication sharedApplication] openURL:navigationAction.request.URL];
}
}
} else {
decisionHandler(WKNavigationActionPolicyAllow);
}
}
// 編碼
- (NSString *)URLEncodedString:(NSString *)str{
NSString *encodedString = (NSString *)
CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)str,
NULL,
(CFStringRef)@"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8));
return encodedString;
}
// 解碼
- (NSString *)URLDecodedString:(NSString *)str{
NSString *decodedString=(__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (__bridge CFStringRef)str, CFSTR(""), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
return decodedString;
}