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 형식이 잘못되거나 구문이 잘못되어서 에러가 찍히는 것이니 코드를 자세히 확인하기 바랍니다.
감사합니다.