WKWebView 로 웹뷰를 변경하면서, iOS 10 이하에서 post url 로드가 제대로 되지 않는 증상을 발견했다. 순간식겁..대체 왜..

예전에 작업해 놓은걸 잊은채, 또 구글링...

 

iOS 10 이하에서는 WKWebView 에서 post 방식 로드를 다른 방식으로 우회해서 해야만 했다.

 

1. PostUrl Load

//BOOL 변수
@property (nonatomic) BOOL didMakePostRequest;

//URL Load
//iOS 11이상
if (@available(iOS 11, *)) {
	NSMutableURLRequest *autoLoginReq = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://xxx.login.xxx.co.kr"]];
    [autoLoginReq setHTTPMethod:@"POST"];
    [autoLoginReq setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

    NSString *body = [NSString stringWithFormat:@"id=%@&pwd=%@", "kkk", "123"]]];
    NSData *bodyData = [body dataUsingEncoding:NSUTF8StringEncoding];
    [autoLoginReq setHTTPBody:bodyData];
    [self.webView loadRequest:autoLoginReq];
    
//iOS 10 이하    
}else {
	//iOS 10 이하에서 post 방식 제어할 BOOL 변수
    didMakePostRequest = YES;

	//내 리소스중 login.html 의 경로를 가져온다.
    NSString *path = [[NSBundle mainBundle] pathForResource:@"login" ofType:@"html"];
    NSString *html = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];

    [self.webView loadHTMLString:html baseURL:[[NSBundle mainBundle] bundleURL]];
}

 

2. WebView navigation delegate didFinishNavigation

//웹뷰 호출이 끝났을 때 호출하는 delegate, didFinishNavigation
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
{
    NSString *currentUrl = webView.URL.absoluteString;
    
    if(@available(iOS 11, *)) {
        
    }else {
    //POST 방식이라면 파라미터를 만들어준다.
        if(didMakePostRequest) {
            [self makePostRequest];
        }
        
        //NO 로 바꾸어서 페이지 호출할 때마다 불려지는 것을 제어
        didMakePostRequest = NO;
    }
}

 

3. Make Param

- (void)makePostRequest {
    HunetUserInfo *user = [CurrentUser sharedObject].userInfo;
    
    //body data 를 json 형식으로 셋팅
    NSString *body = [NSString stringWithFormat:@"id:'%@', pwd:'%@'",
                      @"kkk",
                      @"123"];
    
    NSString *url = @"https://xxx.login.xxx.co.kr"
    NSString *jscript = [NSString stringWithFormat:@"post('%@', {%@});", url, body];
        
    [self.webView evaluateJavaScript:jscript completionHandler:^(id object, NSError * _Nullable error) {
        if (error) {
            NSLog(@"----------->>>>>>>>>>>>> evaluateJavaScript error : %@", [error localizedDescription]);
            //여기 에러가 찍혔다는 것은 대부분 json data 셋팅이 잘못되어서 나오는 오류이다.
        }
    }];
}

 

위 코드에서 evaluateJavaScript 함수에서 에러를 뱉는다면 json 형식이 잘못되거나 구문이 잘못되어서 에러가 찍히는 것이니 코드를 자세히 확인하기 바랍니다.

 

감사합니다.

Posted by 자바리즘
,