부들부들 항상 apple에서 새로운 OS들이 나오면 이슈가 먼가 모르게 이슈가 많다.
패드에서 앱을 테스트 하다가 뭔가 이상해서 보니 모바일 웹에서 보여야 할 웹의 UI들이 노출되고 있었다.
뭐지..?
그래서 삽질을 하다가 사파리 디버깅 모드로 보니까 useragent로 패드를 구분하는 부분을 아예 타지 않았다.
보통 iOS, iPad 구분할 때 아래와 같이 구분 한다.
navigator.userAgent.match(/iPhone|iPad|iPod/i) == null ? false : true;
근데 iPadOS13으로 올라오면서 갑자기 UserAgent가 아래처럼 바뀌었다.
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko)
하.... 맥으로 넘겨주면 어쩌자는거냐.....
포럼에서도 난리가 났다.
https://forums.developer.apple.com/thread/122189
https://forums.developer.apple.com/thread/119186
우선 iPad내에서 설정 > 사파리 > 데스크탑 웹사이트 요청 > 모든 웹사이트 어쩌고를 OFF시키면 된다고 한다.
CS가 들어오면 위와같이 임시로 대응을 해야겠다.
>> 2019.9.30 업데이트
>> 위의 방식은 올바르게 동작하지 않는다.
>> 저건 safari내에서만 적용될 수 있는 방법이다.
>>iPadOS 13 부터 패드에서 데스크탑모드로 리다이렉션 시키는데, 이때 모바일 사이트로 계속 유지시키는 방법이다,
근데 이게 모든 유저에게 적용할 수 있는 것은 아니니까 웹에서 어찌되었던 처리는 되어야 할 것 같다.
검색해 보니 먼가 이렇다할 대응방안은 아직 없어 보인다.....
우선 하나있는 스택오버플로우라도 공유하며.... 만약 해결방안이 있다면 업데이트 해야겠다.
해결방법
으하하 찾았다 해결방법..!
해결 방안 1 (추천)
우선 우리는 WKWebview를 사용하고 있음을 공유드리며,
iOS 13, iPadOS 13에서 새로운 델리게이트 메소드가 생겼다.
webview에서 웹주소를 누르면 그 url를 로딩할지 결정하는 메소드인 WKNavigationDelegate의 func webView(WKWebView, decidePolicyFor: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) 를 사용했었는데
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, preferences: WKWebpagePreferences, decisionHandler: @escaping (WKNavigationActionPolicy, WKWebpagePreferences) -> Void) 메소드가 추가되었고, iOS13 이상부터 사용할 수 있다.
모든건 기존의 func webView(WKWebView, decidePolicyFor: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) 와 동일한데, preferences: WKWebpagePreferences 파라미터가 추가되었다.
WKWebpagePreferences의 속성에 preferredContentMode를 설정할 수 있는데, (https://developer.apple.com/documentation/webkit/wkwebpagepreferences/3194426-preferredcontentmode?language=objc)
mobile, desktop, recommand가 있다..
여기서 preferredContentMode = .mobile로 설정만 해주면 된다.
그럼 userAgent에 Mozilla/5.0 (iPad; CPU OS 13_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 로 정상적으로 iPad라고 찍히는 걸 알 수 있다.
preferredContentMode = .mobile로 설정시 : Mozilla/5.0 (iPad; CPU OS 13_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148
그 이외의 경우 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko)
모바일의 경우에는 폰 디바이스로 인식하여 제대로 노출되지만 패드의 경우 모바일 / 데스크탑 모드로 나뉘어 위의 옵션 설정시 userAgent가 바뀐다.
이러한 옵션때문에 UIWebview를 이번버전부터 확실히 deprecated 한 것같다.
이거때문에 이틀을 삽질햇는데 간단히 해결된다니 너무 허무해지는 순간이다.
해결 방안 2
이건 별로 추천하고 싶지 않은 방법이다.
어짜피 패드 구분을 UserAgent로 구분하기 때문에
WKWebview.customUserAgent에 iPad 키워드만 넣어주는 방법이 있을 것이다.
아래와 같은 방식으로 작성하는 방법이 있다.
webView.evaluateJavaScript("navigator.userAgent") { [weak webView] (result, error) in
if let webView = webView, let userAgent = result as? String {
webView.customUserAgent = userAgent + "iPad"
}
}
참고 : https://stackoverflow.com/questions/26994491/set-useragent-in-wkwebview
'개발' 카테고리의 다른 글
framework not found ... 에러 (0) | 2020.04.29 |
---|---|
iOS 13.2 bug ) background에서 앱이 suspend -> terminated되는 이슈 (0) | 2019.11.04 |
Mutating a priority from required to not on an installed constraint (or vice-versa) is not supported. You passed priority 999 and the existing priority was 1000. (0) | 2019.09.26 |
pod repo 업데이트가 안될 때 (0) | 2019.09.23 |
Sign in Apple id update guidelines (0) | 2019.09.16 |
댓글