이번 시간에는 iOS 면접을 준비하면서 공부한 내용을 정리해보려고 합니다.
질문은 https://github.com/JeaSungLEE/iOSInterviewquestions에서 참고했습니다.
원 질문의 내용은 "실제 디바이스가 없을 경우 개발 환경에서 할 수 있는 것과 없는 것을 설명하시오." 입니다.
개요
iOS 앱을 개발할 때, 실제 모바일 기기를 사용하여 테스트를 하곤 하는데, 이런 모바일 기기가 없을 때 Xcode의 Simulator(이하 '시뮬레이터')를 사용할 수 있습니다.
실제 디바이스가 없는 경우의 개발 환경
위에서 시뮬레이터를 사용하면 실제 디바이스를 대신하여 테스트를 할 수 있다고 했는데요. 시뮬레이터가 실제 디바이스를 흉내내서 유사한 환경에서 실행해준다고 생각하면 됩니다.
이런 실제 디바이스를 흉내내는 방법에는 시뮬레이션(Simulation)과 에뮬레이션(Emulation)이라는 방법이 있는데요.
시뮬레이션은 실제 시스템과 완전히 동일하지는 않지만, 원하는 시스템의 동작을 흉내내어 같은 동작을 하는 것이고, 에뮬레이션은 실제 시스템과 완전히 동일한 방법으로 원하는 시스템의 하드웨어 동작마저 흉내내는 것을 의미합니다.
시뮬레이션과 에뮬레이션을 하는 프로그램을 시뮬레이터와 에뮬레이터(Emulator)라고 하는데요.
시뮬레이터는 시뮬레이터를 실행하는 host 기기에서 host 아키텍처로 빌드해서 원하는 target 환경과 유사한 환경에서 실행을 합니다.
반면에 에뮬레이터는 에뮬레이터를 실행하는 host 기기에서 원하는 target 환경과 동일한 아키텍처로 빌드하여 target 환경과 동일한 환경에서 실행합니다.
이렇게만 보면 잘 감이 오지 않죠?
조금 더 쉽게 설명해보자면 에뮬레이터는 실제 기기의 모든 부분을 완전히 동일하게 구현한 가상 머신이고, 시뮬레이터는 실제 기기의 출력 결과만 흉내내고, 실제 그 안에서 일어나는 과정을 모두 구현하지는 않습니다.
우리가 iOS 앱을 개발할 때 사용하는 Xcode는 이 중 시뮬레이터 기능을 지원하는데, 시뮬레이터는 실제 디바이스의 출력 결과만 흉내내는 것이기 때문에 같은 기능에 대해서 실제 디바이스와 시뮬레이터가 서로 다른 결과를 보여주거나, 혹은 시뮬레이터에서 아예 지원하지 않는 기능들이 있습니다.
이번 시간에는 이 시뮬레이터를 활용하여 할 수 있는 것과 할 수 없는 것에 대해 알아보도록 하겠습니다.
시뮬레이터를 활용하여 할 수 있는 것
우선 시뮬레이터를 활용하면 앱을 실제 기기에서 테스트하기 전에 빠르게 프로토 타이핑 및 개발을 할 수 있습니다.
또한, iOS 앱을 테스트하고 디버깅하는 데 도움이 되는 기능들이 있습니다.
실제 디바이스와 유사한 환경을 만든 것이기 때문에 시뮬레이터만으로도 실제 디바이스의 여러 동작을 테스트해 볼 수 있는데, 디바이스의 화면 방향을 회전하거나, 흔드는 기능, 소프트웨어/하드웨어 키보드, FaceID, Apple Pay 인증 등을 지원합니다.
단, FaceID는 Mac이 FaceID 센서를 갖추고 있지 않기 때문에 Enrolled, Matching Face, Non-matching Face 등의 상황을 직접 지정하는 방법만 지원하는 것으로 보입니다.
해당 질문에 대해서 찾아보면서 오디오 입력을 시뮬레이터를 활용하여 할 수 없다고 적어놓은 글들이 대부분이었는데, 시뮬레이터에서 오디오 입력에 대한 부분을 본 것 같아서 확인해본 결과 오디오 입력을 일부 지원합니다. 단, Siri를 이용하는 경우만 지원하는 것 같습니다.
또한, 조금 옛날 자료들에는 핀치 줌 동작을 지원하지 않는다고 적어놓은 글들도 있었는데, 핀치 또한 option
키와 함께 사용할 수 있습니다.
핀치 줌은 사진 확대/축소 기능을 만들 때 사용했던 기억이 나네요.
시뮬레이터만으로는 할 수 없는 것
시뮬레이터를 활용하여 할 수 있는 것을 알아보았으니, 이번에는 시뮬레이터만으로는 할 수 없는 것에 대해 알아보겠습니다.
시뮬레이터를 사용하면 실제 디바이스 환경이 아니라 Mac 환경에서 실행되는 것이기 때문에 CPU, 메모리, 네트워크 연결 등이 컴퓨터의 리소스에 액세스되어 실제 디바이스에서 발견되는 리소스보다 더 빠를 수 있습니다. 그래서 정확한 앱의 성능이나 메모리 사용량, 네트워크 속도 등을 테스트할 수 없습니다.
또, 시뮬레이터와 실제 디바이스는 해상도와 색상에 차이가 있습니다.
하드웨어 장치와 Mac의 해상도 및 포인트당 픽셀이 다를 수 있으며, 이로 인해 텍스트와 이미지가 들쭉날쭉하게 표시될 수 있습니다.
특히 작은 크기의 텍스트의 경우 더 차이가 날 수 있습니다.
시뮬레이터 창의 배율을 높이면 텍스트와 이미지가 더 선명하게 표시될 수도 있습니다.
그리고 Mac 화면의 색 영역이 다를 수 있어, 시뮬레이터에서 색상이 부정확하게 표시될 수 있습니다.
또한, 마우스를 이용한 터치를 하기 때문에 실제 디바이스와는 터치 동작이 다를 수 있습니다.
사용자가 탭할 수 있는 영역이 충분한지, 혹은 사용자 인터페이스의 텍스트가 잘 보이는지 등을 확인하기 위해서는 시뮬레이터보다는 실제 디바이스가 더 적합할 것 같네요.
그리고 시뮬레이터와 실제 디바이스는 시스템에서 앱의 백그라운드를 처리하는 방식에도 차이가 있습니다.
시뮬레이터는 iOS 11 이상, tvOS 11 이상 및 watchOS 4 이상에서 백그라운드 앱 및 프로세스를 일시 중단합니다.
디버거는 일시 중단된 프로세스를 다시 시작할 수 있습니다.
그리고 시뮬레이터는 HFS+ 및 APFS 포맷 볼륨에서 파일 시스템을 대소문자를 구분하여 처리합니다.
또, 시뮬레이터는 실제 디바이스의 Output을 모방한 것이기 때문에 실제 하드웨어에서 실행되는 API와는 차이가 있을 수 있습니다.
또한, Metal을 사용하게 될 경우 실제 디바이스와 컴퓨터의 GPU 간에 차이가 있습니다.
시뮬레이터에서 할 수 없는 하드웨어 기능
시뮬레이터는 주변 조도 센서, 기압계, 가속계 및 자이로스코프, 근접 센서 등을 사용할 수 없습니다. Mac에는 해당 센서들이 없으니 어찌보면 당연한 것일 수도 있겠네요.
또한 블루투스, 카메라, 전화 기능도 사용할 수 없습니다.
시뮬레이터에서 사용할 수 없는 API
시뮬레이터에서 할 수 없는 것에는 하드웨어 기능뿐만 아니라, 일부 API도 사용할 수 없는데, 대표적으로 Apple 푸시 알림 수신 및 전송 기능이 있습니다.
단 이 부분은 JSON 파일을 시뮬레이터에 끌어다 놓아서 푸시 알림 수신을 테스트할 수는 있습니다.
또 UIBackgroundModes 키와, UIKit의 UIVideoEditorController 클래스, Handoff 지원 기능을 사용할 수 없습니다.
또, ARKit, External Accessory(외부 악세사리), HomeKit, IOSurface, Media Player, Message UI 프레임워크를 지원하지 않습니다.
이 외에도 사진, 연락처, 일정관리 및 알림 액세스에 대한 개인 정보 경고를 사용할 수 없다고 하는데, 이 부분은 최근 시뮬레이터에서는 사용이 가능해졌습니다.
후기
이번 시간에는 실제 디바이스가 없는 경우 개발 환경, 시뮬레이터에 대해 알아보았는데요.
시뮬레이터와 실제 디바이스의 차이를 잘 알아보고, 개발하고 있는 앱이 어떠한 환경에서 테스트하는 것이 적절할지 결정하면 좋을 것 같습니다.
기본적으로 많은 블로그에서 참고하고 있는 시뮬레이터 유저 가이드 문서 자체가 Xcode 9 이전의 상당히 오래된 예전 문서라서 현재 상황이랑은 조금 다른 부분이 있는 것 같습니다.
Xcode 9 이후의 새로운 차이점에 대해서는 새 문서를 보며 추가했습니다.
다만, 새 문서에서도 약간 애매하다고 생각되는 부분이 있어서, 해당 부분에 대해서는 앞으로 프로젝트를 진행하면서 다른 점을 발견할 때마다 추가적으로 알아보아야 할 것 같네요.
참고자료
히스토리
- 2023.04.23 22:58 최초 발행
- 2023.06.14 17:39 시뮬레이터 관련 최신 버전(Xcode 9 이후) 차이점 추가
'Swift > iOS' 카테고리의 다른 글
[iOS] String Catalog - Xcode 15 이후의 iOS 앱에서 다국어 지원하기 (feat. Localization) (0) | 2024.03.31 |
---|---|
[Core Image] CIFilter - 사진에 다양한 시스템 필터 효과 주기 (0) | 2024.03.17 |
[iOS] Stretchable Image (a.k.a iOS 9-Patch) (0) | 2024.01.21 |
[Cocoa Design Patterns] KVO 패턴 (0) | 2023.07.02 |
[Core NFC] Core NFC 훑어보기 (0) | 2023.06.04 |