iOS 11 WKWebView 에서 콘 텐 츠 를 불 러 올 수 없 는 해결 방법

4931 단어 iOS11WKWebView
문제 설명:iOS 9 와 iOS 10 은 WKWebView 로 URL 을 불 러 오 는 데 문제 가 없습니다.iOS 11 은 공백 입 니 다.
NSMutableURL Request 를 사 용 했 는 지 iOS 11 은 NSMutableURL Request 를 지원 하지 않 는 것 같 습 니 다.UIWebView 를 사용 하 든 WKWebView 를 사용 하 든 NSMutableURL Request 를 지원 하지 않 습 니 다.
해결 방법 참조

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)
  }
iOS 11 Xcode 9 WKWebView 붕괴 문제 해결 방안
정식 버 전의 iOS 11&Xcode 9 가 발표 되 었 습 니 다.버 전의 빈 시간 을 틈 타 적당 한 작업 을 완성 하 는 데 시간 이 좀 걸 립 니 다.

아이 폰 X 의 시 뮬 레이 터 로 하 이브 리드 프로젝트 에 들 어 갔 을 때 들 어가 자마자 붕괴 되 고 붕괴 정보 가 적은 불쌍 함 을 발견 했다.

libc++abi.dylib: terminating with uncaught exception of type NSException
이 물건 으로 는 bug 를 찾 을 수 없 을 것 입 니 다.그러나 전체 정지점 에서 약간의 정 보 를 주 었 습 니 다.

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
 NSString *requestString = navigationAction.request.URL.absoluteString;
 //   、     appstore     
 UIApplication *app = [UIApplication sharedApplication];
 NSURL *url = [navigationAction.request URL];
 //  
 //          
 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);//    
}
왜 여기 서 무 너 졌 는 지 아직도 모르겠다.그동안 괜 찮 았 는데?
팁:
스 택 정 보 를 얻 기 위해 빠 르 고 정확 한 포 지 셔 닝 문 제 를 해결 하기 위해 main 함수 에서:

int main(int argc, char * argv[]) {
 @try {
  @autoreleasepool
  {
   return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
  }
 }
 @catch (NSException* exception)
 {
  NSDebugLog(@"Exception=%@
Stack Trace:%@", exception, [exception callStackSymbols]); } }
최종 적 으로 관건 적 인 오 류 를 얻 었 다.
Completion handler passed to -[WKPrivateNavigationDelegate webView:decidePolicyForNavigationAction:decisionHandler:] was called more than once
WK WebView 의 이 대리 방법 이 여러 차례 호출 되 었 다 는 뜻 이다.

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);//    
여러 번 호출 된 원인 을 간단하게 분석 합 니 다.
1.시스템 은 이 방법 이 여러 번 실 행 된 것 을 판단 하 는데 주로 decisionHandler()가 여러 번 실 행 된 지 여 부 를 본다.
2.if 판단 에서 decisionHandler()를 실행 하기 때문에 마지막 줄 코드 도 decisionHandler()를 실행 하고 self.realDelegate 에서 decisionHandler()를 실행 하기 때문에 decisionHandler()라 는 handler 는 여러 번 실 행 될 수 있 습 니 다.
그 문 제 를 해결 하 는 방향 은 코드 수정 입 니 다.
다음 과 같이 수정:

 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 에서 decision Handler()를 한 번 만 실행 할 수 있 도록 보장 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기