Mobile-아이폰iOS

iOS UIWebview에서 에러 발생시 reload 처리하기

무한열정 2017. 6. 30. 13:17

iOS UIWebview에서 오류 발생시 realod처리하기


Android에서의 Webview와 다르게

iOS에서는 reload가 정상적으로 오픈된 URL에 대해서만 reload가 된다.

오류 났을때 reload를 하려면 어찌해야 할까?

아무래도 고민이되고 처리해야할것도 많아 지겠죠.


그래서 나름의 방법을 공개합니다.


첫번째로 shouldStartLoadWithRequest UIWebviewDelegae에서 URL을 저장하거나 post 파라미터를 전역변수에 저장해야 한다.

개인적으로 URL은 error객체에서 추출하였다.

#pragma mark - UIWebViewDelegate

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request       navigationType:(UIWebViewNavigationType)navigationType

{

    webPostData = request.HTTPBody; // contains the HTTP body as in an HTTP POST request.

    NSLog(@"]]]===> WEBVIEW request post data : %lu",(unsigned long)[webPostData length]);

    // return YES to continue to load the URL

    return YES;

}


두번째로는 에러 URL을 추출한다. 첫번째 단계에서 추출해도 된다.

그리고 alert를 출력하는 과정을 거치거나 오류 전용 ViewController를 띄우게 될것이다.

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error

{

    webLastErrUrl = [error.userInfo objectForKey:@"NSErrorFailingURLStringKey"]; //this works

    NSLog(@"--- theURLString = %@", webLastErrUrl);

    NSLog(@"--- WebView ERROR CODE = %li", (long)[error code]);

    NSLog(@"--- WebView ERROR MESSAGE = %@", [error description]);


    UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"오류 안내" message:[error localizedDescription] delegate:self cancelButtonTitle:@"취소" otherButtonTitles:@"홈으로 이동",@"재시도",nil];

    //alert.tag = TAG_WEB_ERROR;

    [alert show];

}


세번째로는 개인적으로 UIAlertViewDelegate처리를 하였는데

이때가 중요하다.

일반적으로 [self.webview reload]가 먹지 않는다.

따라서  [self.myWebView loadRequestshouldStartLoadWithRequest~~~]를 사용하여야 하고

첫단계에서 저장한 NSData형의 webPostData를 사용하여 post로 호출하도록 하면 된다.

#pragma mark UIAlertViewDelegate implementation

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

{

    if (buttonIndex == 0) { // CANCEL

    }

    else if (buttonIndex == 1) { // GOHOME

        NSLog(@">>> GOHOME");

        [self goHome];

    }

    else if (buttonIndex == 2) { // RETRY

        NSLog(@">>> RETRY");

        //[self.myWebView reload];

        NSURL *url = [NSURL URLWithString: webLastErrUrl];

        //NSString *body = [NSString stringWithFormat: @"arg1=%@&arg2=%@", @"val1",@"val2"];

        //NSString *body = [[NSString alloc] initWithData:webPostData encoding:NSUTF8StringEncoding];

        //NSLog(@"body data = %@",body);

        NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL: url];

        [request setHTTPMethod: @"POST"];

        [request setHTTPBody: webPostData];

        [self.myWebView loadRequest: request];

        

    }

}


이렇게하면 post로 호출된 페이지URL도 정상적으로 reload및 오류처리가 가능해진다. ^^