개발

iPadOS 13 에서 userAgent가 Mac으로 넘어오는 이슈

꼬마상어 2019. 9. 27. 18:30
반응형

부들부들 항상 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 부터 패드에서 데스크탑모드로 리다이렉션 시키는데, 이때 모바일 사이트로 계속 유지시키는 방법이다,

 

근데 이게 모든 유저에게 적용할 수 있는 것은 아니니까 웹에서 어찌되었던 처리는 되어야 할 것 같다.

검색해 보니 먼가 이렇다할 대응방안은 아직 없어 보인다.....

우선 하나있는 스택오버플로우라도 공유하며.... 만약 해결방안이 있다면 업데이트 해야겠다.

https://stackoverflow.com/questions/58019463/how-to-detect-device-name-in-safari-on-ios-13-while-it-doesnt-show-the-correct

 

해결방법

으하하 찾았다 해결방법..!

해결 방안 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

반응형