iOS13 WKWebKit decidePolicyForNavigationAction: (iPad UserAgent Desktop 문제)
이번 iOS13 때 예상치 못했던 점인데, 유지보수건에서 확인하다보니 Objective C 언어로 설명하겠습니다.
iOS Client만 개발을 하다보니 WebKit 관련해서 하이브리드 작업을 하든, 디스플레이만 하든 티가 안나서 문제 될 것은 없었습니다.
"iPad에서 Useragent 값이 Desktop" 으로 표현되어, 기존에 Web부분에서 Mobile 과 Desktop 구분하여 사용 하던 WebPage 인 경우 작동이 다르게 되는 오류가 발견되었다.
WKWebpagePreferences 추가로 현 디바이스를 Mobile, Desktop 으로 설정할 수 있어졌다.
그런데... iOS 13 전용 decidePolicyForNavigationAction: Delegate에서 추가해야한다는 점
이번에 신규 추가된 Navigation Delegate
참고 Apple : webView:decidePolicyForNavigationAction:decisionHandler:해당함수는 iOS13에서만 작동하고 해당함수가 작동하면, 기존에 있는 decidePolicyForNavigation은 작동하지 않는다고 설명해져있다.
필자의 경우 로직 코드를 하나로 합치기 위해 아래와 같이 코드를 구현하였다.
샘플 코드
// 기존 iOS 13 미만 WKWebView Navigation Delegate
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
NSString *urlString = navigationAction.request.URL.absoluteString;
NSLog(@">>>urlString : %@", urlString);
// 1. 커스텀 액션을 확인하기 위한 절차.
NSString *onefficeSaveCheck = @"app://필자의_CUSTOM_구분값";
if ([urlString containsString:onefficeSaveCheck]) {
[self dismissViewControllerAnimated:true completion:^{
if([self.delegate respondsToSelector:@selector(refreshWorkReportEndOneffice)]){
[self.delegate refreshWorkReportEndOneffice];
}
}];
decisionHandler(WKNavigationActionPolicyCancel);
return;
}
// #. 그 외 기본적인 항목
if(navigationAction.navigationType == WKNavigationTypeLinkActivated) {
[self openCheckOneffice: navigationAction.request.URL];
decisionHandler(WKNavigationActionPolicyCancel);
} else {
decisionHandler(WKNavigationActionPolicyAllow);
}
}
| cs |
// iOS 13 이상
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction preferences:(WKWebpagePreferences *)preferences decisionHandler:(void (^)(WKNavigationActionPolicy, WKWebpagePreferences *))decisionHandler API_AVAILABLE(ios(13.0)){
// iOS 13 iPad 에서 Desktop으로 표기되어
// Mobile 모드로 강제로 넣어주기.
preferences.preferredContentMode = WKContentModeMobile;
// iOS 13 이전버전에 로직이 포함되어 있음. (로직 공통화)
[self webView:webView decidePolicyForNavigationAction:navigationAction decisionHandler:^(WKNavigationActionPolicy policy) {
decisionHandler(policy, preferences);
}];
}
| cs |
다들 힘내시고, 즐거운 코딩 되는 하루 되세요~
댓글
댓글 쓰기