버그 잡이

아이패드(iPad) 기능 지원 삽질기 (to 기존 앱) 본문

IOS

아이패드(iPad) 기능 지원 삽질기 (to 기존 앱)

버그잡이 2022. 3. 29. 16:04

 

기조 상용중인 앱에 아이패드 모드를 지원하게 되었습니다. 관련 작업을 하면서 새롭게 배운점과 느낀점들을 정리해보겠습니다.

 

 

1. frame 보다는 Auto-layout을 사용하자.

 

앱을 보면 팝업, 커스텀 키패드 등이 frame으로 layout이 잡혀 있었습니다.

이는 가로/세로 디바이스 회전시 레이아웃을 깨지게 만듭니다.

간단하게 오토레이아웃으로 변경할 수 있는 View는 오토레이아웃으로 레이아웃을 설정하도록 변경해주고,

변경이 다소 무리인 경우에는 "viewWillTransition()" 이라는 viewController의 override 메서드를 활용하여 문제를 대응할 수 있습니다. 디바이스의 회전을 감지하고 디바이스 스크린 Size를 받을 수 있는 메서드이다. size 값을 활용하면 회전시 화면 대응이 가능하다.

 

https://developer.apple.com/documentation/uikit/uicontentcontainer/1621466-viewwilltransition

 

Apple Developer Documentation

 

developer.apple.com

 

 

 

2. iPad Multitasking 모드

 

아이패드는 데스크탑처럼 여러 앱을 한 화면에 띄워서 동시에 사용할 수 있는 멀티태스킹 모드를 지원합니다.

작업하면서 멀티태스킹 관련 몇 가지 특이사항을 마주했습니다.

 

1) 앱의 카메라 접근 X

앱에서 QR코드 인식과 같이 카메라에 접근해야 하는 기능이 있을 수 있습니다. 이러한 기능이 멀티태스킹 상태에서는 불가능합니다. https://developer.apple.com/documentation/avkit/accessing_the_camera_while_multitasking

 

 

2) 강제로 가로/세로 전환 X

UIViewController.attemptRotationToDeviceOrientation()

위 코드를 통해서 앱에서 디바이스 화면 가로/세로 전환을 강제로 할 수 있습니다.

그런데 아이패드에서는 위 코드가 동작하지 않습니다. 아이패드의 경우 멀티태스킹 모드를 지원하기 때문에 한 앱에서 강제로 가로/세로 전환을 하지 못하도록 막았다고 합니다.

(단, 멀티태스킹 모드를 지원하지 않는 아이패드는 위 코드를 실행할 수 있습니다.)

 

 

3) 멀티태스킹 지원 안 하는 방법

project -> general -> deployment info 를 보면 아래와 같이 아이패드 지원 여부를 선택할 수 있습니다.

하단의 "Requires full screen" 을 체크하면 멀티태스킹 지원이 되지 않습니다. 아이패드에서 오로지 풀스크린으로만 사용할 수 있는 것이지요

 

 

 

 

3. WKWebview의 userAgent가 Mac으로 넘어오는 이슈

 

웹뷰 설정 중에서 해당 웹뷰의 ContentMode를 설정할 수 있는데, 이를 통해서 mobile에서 접속했는지, desktop에서 접속했는지 알 수 있습니다.

그런데, iPad && iOS 13 인 경우, preferredContentMode가 .desktop으로 설정되는 문제가 있습니다. 그에 따라 웹뷰에 설정해두었던 인터페이스가 제대로 동작하지 않는 경우가 있었습니다.

아래와 같이 웹 config를 설정해주면 웹뷰가 모바일용으로 정상 동작하게 됩니다.

        if #available(iOS 13.0, *) {
            let pref = WKWebpagePreferences.init()
            pref.preferredContentMode = .mobile
            webConfiguration.defaultWebpagePreferences = pref
        }

 

 

 

4. .pushViewController(), .present() -> showDetailViewController()

 

아이패드의 경우 기존 PushViewController 와 Present로 화면 이동 하던 것과는 조금 다른 구조로 화면이 이동될 것입니다.

기존에는 현재 화면 위에 띄우던 화면도 아이패드에서는 detail 화면으로 빠지게 될 것인데요.

이 경우 기존 .pushViewController() -> .showDetailViewController() 함수로 변경해서 화면 이동을 처리해줘야합니다.

 

 

 

 

반응형
Comments