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및 오류처리가 가능해진다. ^^
'Mobile-아이폰iOS' 카테고리의 다른 글
2010년 출시 구닥다리 iOS 앱 업데이트 하기 (0) | 2017.08.27 |
---|---|
Swift3 Any/AnyObject 차이, === 연산자 용도, 타입비교 (0) | 2017.08.19 |
Swift 3.0부터 open과 fileprivate라는 새로운 접근한정자 추가 (0) | 2017.06.03 |
Android - iOS String Resource Converter 문자열관리 파일포맷 변환기 (0) | 2017.04.03 |
Xcode 8.X.X에서 아이폰4(iOS 7.1.2)로 빌드하기 (0) | 2017.02.22 |