ios 웹뷰 didFailProvisionalLoadForFrame -999 에러 해결

나고수·2023년 12월 11일
0

플러터

목록 보기
3/5
post-thumbnail
WebPageProxy::didFailProvisionalLoadForFrame: frameID=3, isMainFrame=1, domain=NSURLErrorDomain, code=-999, isMainFrame=1

이 에러는 ios 웹뷰에서 a 요청이 끝나기 전에 b 요청을 보내면 나는 에러라고 합니다.
웹에서 a 페이지와 (shop.order.result) b페이지(https://rsmpay.kcp.co.kr/pay/jsp/encodingFilter/encodingFilter.jsp) 로딩을 한번에 요청했습니다.
그래서 a 페이지 로딩이 끝나기 전에 b 페이지 로딩 요청이 들어와서 에러가 났습니다.

스택오버프로우에는 ios 네이티브 코드를 건들이는 방법이 있던데 도무지 모르겠어서 그냥
a 페이지 로딩이 끝난 후 b 페이지 로딩을 시작하게 하는 방식으로 해결했습니다.

//'Completer는 비동기 작업의 완료를 나타내는 Dart의 클래스입니다. 
//주로 Future와 함께 사용되어 특정 작업이 완료되었을 때 Future를 완료시키는 데에 쓰입니다.
//여기서, Completer<bool>는 bool 값의 작업이 완료될 때까지를 나타내기 위한 것입니다. 
//코드에서 특정 URL이 로딩되었을 때 Completer를 완료시켜서 다른 부분에서 그 작업이 완료되었음을 알 수 있도록 하는 용도로 사용됩니다.

  Completer<bool>? pageLoadCompleter = null;

 onPageStarted: (String url) {
			 //kcp 페이지를 로딩 한 후 뒤로가기나 결제취소로 다시 shop.order.result 페이지로 돌아가게되면 
             //이미 pageLoadCompleter가 true여서 shop.order.result,kcp 페이지가 또 동시에 호출됨
			 //시작하는 페이지가 shop.order.result일때마다 completer 초기화 
            if (url == 'https://domain/?pn=shop.order.result') {
              pageLoadCompleter = Completer<bool>();
            }
          },
          
  onPageFinished: (String url) {

            //웹에서 https://domain/?pn=shop.order.result 페이지와
            //https://rsmpay.kcp.co.kr/pay/jsp/encodingFilter/encodingFilter.jsp (kcp 결제 페이지)를 동시에 호출함
            //ios에서는 a 요청이 끝나기 전에 b 요청이 들어오면 에러가 난다.
            //그래서 shop.order.result 페이지 로딩이 끝날 때 까지 다음 페이지(kcp 페이지) 이동을 막고
            //shop.order.result 페이지 로딩이 끝나면 다음 페이지(kcp 페이지) 이동을 한다.
            if (url == 'https://domain/?pn=shop.order.result') {
              pageLoadCompleter.complete(true);
            }
          },
          
          
onNavigationRequest: (NavigationRequest request) async {
          var isAllowNavigate = true
            
            if (request.url ==
                'https://rsmpay.kcp.co.kr/pay/jsp/encodingFilter/encodingFilter.jsp') {
              //혹시 shop.order.result 페이지를 호출 하지 않고
              //kcp 페이지를 바로 결제 할 경우 대비
              var isPageLoadComplete = await pageLoadCompleter?.future ?? true;
              pageLoadCompleter = null;
              isAllow = isPageLoadComplete;
            }

            return isAllowNavigate
                ? NavigationDecision.navigate
                : NavigationDecision.prevent;
          }
profile
되고싶다

0개의 댓글