iOS11 WKWebView問(wèn)題匯總
問(wèn)題一描述:
iOS9和iOS10用WKWebView加載URL都沒(méi)有問(wèn)題,iOS11卻是一片空白
可能是用了NSMutableURLRequest,iOS11貌似不支持NSMutableURLRequest,無(wú)論是用UIWebView還是WKWebView,都不支持NSMutableURLRequest
解決方法參考
if #available(iOS 11, *) { let request = NSURLRequest.init(url: URL.init(string: urlStr)!) self.wkWebView.load(request as URLRequest) }else{ let request = NSMutableURLRequest.init(url: URL.init(string: urlStr)!, cachePolicy: NSURLRequest.CachePolicy.reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 60) request.httpMethod = "GET" request.httpBody = ("token=" + tokenValue()).data(using: String.Encoding.utf8) self.wkWebView.load(request as URLRequest) }
問(wèn)題二描述:在用iPhone X 的模擬器進(jìn)入Hybrid項(xiàng)目時(shí),發(fā)現(xiàn)一進(jìn)去就崩潰,崩潰信息少的可憐:
libc++abi.dylib: terminating with uncaught exception of type NSException
靠這玩意兒肯定是定位不出bug的,不過(guò)全局?jǐn)帱c(diǎn)還是給出了一點(diǎn)信息:
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler { NSString *requestString = navigationAction.request.URL.absoluteString; //對(duì)外鏈、撥號(hào)和跳轉(zhuǎn)appstore做特殊處理 UIApplication *app = [UIApplication sharedApplication]; NSURL *url = [navigationAction.request URL]; //電話 //此處省略若干業(yè)務(wù)代碼 if ([url.absoluteString containsString:@"itunes.apple.com"]) { if ([app canOpenURL:url]) { [app openURL:url]; decisionHandler(WKNavigationActionPolicyCancel); } } if ([requestString hasPrefix:@"easy-js:"]) { [self handleRequestString:requestString webView:(EasyJSWebView *)webView.superview]; decisionHandler(WKNavigationActionPolicyCancel); } if ([self.realDelegate respondsToSelector:@selector(webView:decidePolicyForNavigationAction:decisionHandler:)]) { [self.realDelegate webView:webView decidePolicyForNavigationAction:navigationAction decisionHandler:decisionHandler]; } decisionHandler(WKNavigationActionPolicyAllow);//崩在這里 }
仍然不知道為啥子崩在這兒?之前一直是沒(méi)問(wèn)題的????
小Tips:
為了獲取一些堆棧信息以便于快準(zhǔn)狠的定位問(wèn)題,可以在main函數(shù)里:
int main(int argc, char * argv[]) { @try { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } @catch (NSException* exception) { NSDebugLog(@"Exception=%@\nStack Trace:%@", exception, [exception callStackSymbols]); } }
最終得到一條關(guān)鍵報(bào)錯(cuò):
Completion handler passed to -[WKPrivateNavigationDelegate webView:decidePolicyForNavigationAction:decisionHandler:] was called more than once
意思就是WKWebView的這個(gè)代理方法被多次調(diào)用了。
if ([requestString hasPrefix:@"easy-js:"]) { [self handleRequestString:requestString webView:(EasyJSWebView *)webView.superview]; decisionHandler(WKNavigationActionPolicyCancel); } if ([self.realDelegate respondsToSelector:@selector(webView:decidePolicyForNavigationAction:decisionHandler:)]) { [self.realDelegate webView:webView decidePolicyForNavigationAction:navigationAction decisionHandler:decisionHandler]; } decisionHandler(WKNavigationActionPolicyAllow);//崩在這里
簡(jiǎn)單分析一下被多次調(diào)用的原因:
1、系統(tǒng)判斷這個(gè)方法被多次執(zhí)行,主要是看decisionHandler()是否被多次執(zhí)行;
2、由于if判斷里會(huì)執(zhí)行decisionHandler(),最后一行代碼也會(huì)執(zhí)行decisionHandler(),并且self.realDelegate中也會(huì)執(zhí)行decisionHandler(),這就導(dǎo)致了decisionHandler()這個(gè)handler可能會(huì)被多次執(zhí)行。
那解決問(wèn)題的方向就是修改代碼保證WKWebView單次LoadRequest只調(diào)一次此代理方法~
修改如下:
if ([requestString hasPrefix:@"easy-js:"]) { [self handleRequestString:requestString webView:(EasyJSWebView *)webView.superview]; decisionHandler(WKNavigationActionPolicyCancel); } else if ([self.realDelegate respondsToSelector:@selector(webView:decidePolicyForNavigationAction:decisionHandler:)]) { [self.realDelegate webView:webView decidePolicyForNavigationAction:navigationAction decisionHandler:decisionHandler]; } else { decisionHandler(WKNavigationActionPolicyAllow); }
即保證了單次LoadRequest只執(zhí)行一次decisionHandler()
問(wèn)題三描述:iOS11 WKWebview獲取高度不準(zhǔn)確
遇見(jiàn)這個(gè)問(wèn)題的時(shí)候,我發(fā)現(xiàn)偏離了大概64像素,由此聯(lián)想到了tableView和collectionView。
故解決辦法如下:
if (@available(iOS 11.0, *)) { _webView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; _webView.scrollView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0); _webView.scrollView.scrollIndicatorInsets = _webView.scrollView.contentInset; }
- iOS中WKWebView白屏問(wèn)題的分析與解決
- Swift使用WKWebView在iOS應(yīng)用中調(diào)用Web的方法詳解
- iOS11 WKWebView 無(wú)法加載內(nèi)容的解決方法
- ios下OC與JS交互之WKWebView
- iOS11 WKWebView內(nèi)容過(guò)濾規(guī)則詳解
- IOS中UIWebView、WKWebView之JS交互
- iOS和JS交互教程之WKWebView-協(xié)議攔截詳解
- iOS中WKWebView的一些特殊使用總結(jié)
- 簡(jiǎn)單說(shuō)說(shuō)iOS之WKWebView的用法小結(jié)
- iOs遷至WKWebView跨過(guò)的一些坑
相關(guān)文章
安裝win10+黑蘋(píng)果雙系統(tǒng)零基礎(chǔ)教程(圖文)
這篇文章主要介紹了安裝win10+黑蘋(píng)果雙系統(tǒng)零基礎(chǔ)教程(圖文),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2020-01-01iOS ScrollView實(shí)現(xiàn)自動(dòng)布局的方法(適用Swift 3.0 )
傳說(shuō)中有一個(gè)美工ios開(kāi)發(fā)者在遇到這個(gè)問(wèn)題的時(shí)候特意跑到蘋(píng)果總部去咨詢?nèi)绾螌?duì)scrollview進(jìn)行自動(dòng)布局。當(dāng)然大家不用去了,下面這篇文章就來(lái)給大家介紹關(guān)于iOS ScrollView實(shí)現(xiàn)自動(dòng)布局的方法,文中的語(yǔ)法同樣也適用Swift 3.0 ,需要的朋友可以參考下。2017-12-12iOS開(kāi)發(fā)中UIWebView的加載本地?cái)?shù)據(jù)的三種方式
這篇文章主要介紹了iOS開(kāi)發(fā)中UIWebView的加載本地?cái)?shù)據(jù)的三種方式,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09詳解iOS開(kāi)發(fā)中Keychain的相關(guān)使用
這篇文章主要介紹了iOS開(kāi)發(fā)中Keychain的相關(guān)使用,文中列舉了一個(gè)使用Keychain來(lái)保存密碼的例子,需要的朋友可以參考下2015-10-10IOS實(shí)現(xiàn)簽到特效(散花效果)的實(shí)例代碼
這篇文章主要介紹了IOS實(shí)現(xiàn)簽到特效(散花效果)的實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05使用objc runtime實(shí)現(xiàn)iOS閉環(huán)的懶加載功能
利用objc runtime的動(dòng)態(tài)性實(shí)現(xiàn)懶加載可以實(shí)現(xiàn)即可增加又可刪除功能,也可以避免污染類(lèi)型。這篇文章主要介紹了使用objc runtime實(shí)現(xiàn)iOS閉環(huán)的懶加載功能,需要的朋友可以參考下2019-06-06iOS應(yīng)用中UISearchDisplayController搜索效果的用法
這篇文章主要介紹了iOS應(yīng)用中UISearchDisplayController搜索效果的用法,包括點(diǎn)擊搜索出現(xiàn)黑條問(wèn)題的解決方法,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2016-02-02Flutter之PageView頁(yè)面緩存與KeepAlive
這篇文章主要為大家介紹了Flutter之PageView頁(yè)面緩存與KeepAlive示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10