特别注意:在ios 9下必须设置这个,否则加载不了:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
解决cookie同步问题
NSMutableDictionary *cookieDic = [[NSMutableDictionary alloc] init];
NSMutableArray *domainArray = [[NSMutableArray alloc] init];
NSMutableString *cookieValue = [NSMutableString stringWithFormat:@""];
NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in [cookieJar cookies]) {
[cookieDic setObject:cookie.value forKey:cookie.name];
[domainArray addObject:cookie.domain];
}
// cookie重复,先放到字典进行去重,再进行拼接
for (int i = 0; i < cookieDic.count; i++) {
NSString *key = [[cookieDic allKeys] objectAtIndex:i];
//垮域一定要加上domain,否则cookie不能同步
NSString *appendString = [NSString stringWithFormat:@"document.cookie='%@=%@;%@=%@';", key, [cookieDic valueForKey:key], @"domain", domainArray[i]];
[cookieValue appendString:appendString];
}
WKUserContentController* userContentController = WKUserContentController.new;
WKUserScript * cookieScript = [[WKUserScript alloc] initWithSource:cookieValue injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
[userContentController addUserScript:cookieScript];
WKWebViewConfiguration* webViewConfig = WKWebViewConfiguration.new;
webViewConfig.userContentController = userContentController;
self.webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.view.bounds), CGRectGetHeight(self.view.bounds)) configuration:webViewConfig];
self.webView.navigationDelegate = self;
self.webView.UIDelegate = self;
self.webView.backgroundColor = HSQColorBackgroundGrayLight;
[self.view addSubview:self.webView];
[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.urlString]]];
监听title
[self.webView addObserver:self forKeyPath:@"title" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial context:nil];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
if ([keyPath isEqualToString:@"title"]) {
if (![self.title isEqualToString:self.webView.title]) {
self.title = self.webView.title;
}
}
}
- (void)dealloc
{
[_webView removeObserver:self forKeyPath:@"title"];
}
处理WKWebView跳转,比如sechma:
#pragma mark - WKNavigationDelegate
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{
decisionHandler(WKNavigationActionPolicyAllow);
//(xxxxx://) schema协议
if ([navigationAction.request.URL.absoluteString hasPrefix:@"xxxxx://"]) {
[[UIApplication sharedApplication] openURL:navigationAction.request.URL];
}
}
清除缓存
if ([[UIDevice currentDevice].systemVersion floatValue] >= 9.0) {
NSSet *websiteDataTypes = [NSSet setWithArray:@[WKWebsiteDataTypeDiskCache, WKWebsiteDataTypeMemoryCache]];
NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];
[[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{
DLog(@"Clear WKWebView Cache");
}];
} else {
NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *cookiesFolderPath = [libraryPath stringByAppendingString:@"/Cookies"];
NSError *errors;
[[NSFileManager defaultManager] removeItemAtPath:cookiesFolderPath error:&errors];
}
js的alert()弹窗处理
需要先实现WKUIDelegate这个代理
//uiwebview 中这个方法是私有方法 通过category可以拦截alert
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler {
// NSLog(@"%s", __FUNCTION__);
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:message preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
// 必须要实现,不然会crash
completionHandler();
}]];
[self presentViewController:alert animated:YES completion:NULL];
}
网友评论