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;
}