본문 바로가기
개발

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

by 꼬마상어 2019. 9. 27.
반응형

부들부들 항상 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

반응형

댓글