App Programming Guide for iOS - Introduction & Expected App Behaviors (1)
간단한 번역이며 생략되거나 줄인 부분이 많습니다. 원문도 같이 보시면 좋을 것 같습니다.
Introduction
About iOS App Architecture
앱은 유저에게 훌륭한 경험을 전달하기 위해 iOS와 협력해야 한다. 좋은 디자인과 유저 인터페이스를 넘어서 훌륭한 유저 경험은 다른 많은 요인들을 포함한다. 유저는 iOS 앱이 빠르게 반응하고 가능한 한 적은 전력으로 사용되기를 기대한다. 앱은 최신 기기를 지원해야 하지만 현재 기기에 맞게 디자인된 것처럼 보여야 한다. iOS는 이러한 것들을 당신이 할 수 있도록 지원한다.
이 문서는 당신의 앱이 iOS에서 잘 동작하게끔 하는 핵심 동작에 대해 중점적으로 설명한다. 이 문서에 설명된 모든 기능들을 구현하지는 않지만 작성한 모든 프로젝트에 대해 이런 기능들을 고려해야 한다.
Expected App Behaviors
모든 앱은 사용자에게 좋은 경험을 보장하기 위해 어느 정도의 맞춤 설정이 필요하다. 맞춤 설정은 앱 아이콘 제공부터, 앱의 정보 표시 및 사용 방법에 대한 아키텍처 수준의 결정에 이르기까지 다양하다. 이 장은 모든 앱이 처리해야하는 동작과 이른 계획 단계부터 고려해야 할 동작들을 다룬다.
Providing the Required Resources
제작하는 모든 앱은 기기에서 제대로 표시 될 수 있도록 다음과 같은 리소스 및 메타데이터 집합이 있어야 한다.
- An information property-list file: 이
Info.plist파일에는 시스템이 앱과 상호 작용하는데 사용하는 앱에 대한 메타 데이터가 포함된다. 프로젝트의 Info 탭에서 이 파일을 보거나 내용을 수정할 수 있다. - A declaration of the app’s required capabilities: 모든 앱은 실행에 필요한 하드웨어 기능 또는 기술을 명시해야 한다. 앱 스토어는 이 정보를 가지고 특정 기기에서 돌릴 수 있는지 없는지를 결정한다. 프로젝트의 Info 탭에서 수정할 수 있다.
- One or more icons: 시스템은 앱 아이콘을 유저 기기의 홈 화면에 표시한다. 또한 설정 앱이나 검색의 결과로 표시하는 다른 버전의 아이콘도 표시한다.
- One or more launch images: 앱이 실행될 때, 시스템은 유저 인터페이스를 보여줄 수 있을 때까지 임시 이미지를 보여준다. 이 런치 이미지는 사용자에게 앱이 실행 중이며 곧 준비될 것이라는 즉각적인 피드백을 제공한다.
The App Bundle
당신의 iOS 앱을 빌드하면, Xcode는 번들(bundle)의 형태로 포장한다. 번들은 관련 있는 리소스들을 한 곳에 묶은 파일 시스템의 디렉토리이다. iOS 앱 번들은 앱의 실행 파일과 앱 아이콘, 이미지 파일, 현지화 파일 등을 포함한 지원 리소스를 담고 있다. 다음은 전형적인 iOS 앱 번들의 컨텐츠들이며 당신의 앱 번들에는 포함되지 않을 수 있다.
- App excutable: 앱의 컴파일된 코드를 담고 있는 실행 파일. 앱의 실행 파일 이름은 당신의 앱의 이름에서 .app 확장자를 뗀 것이다. 이 파일은 필수적이다.
- The information property list file:
Info.plist파일은 앱의 설정 데이터를 담고 있다. 시스템은 이 데이터를 이용해 앱과 상호 작용한다. 이 파일은 필수적이며 Info.plist로 불려야 한다. - App icons
- Launch images
- Storyboard files(or nib files): 스토리보드는 앱이 화면에 띄울 뷰와 뷰 컨트롤러들을 담고 있다. 뷰의 전환(segue)도 담고 있다. 메인 스토리보드 파일의 이름은 프로젝트를 만들면서 Xcode가 자동으로 만들어주지만
Info.plist에서 수정할 수 있다. - Ad hoc distribution icon
- Settings bundle: 설정 앱에서 커스텀 앱 설정을 보여주고 싶다면 설정 번들을 포함시켜야 한다. 이 번들은 프로퍼티 리스트 데이터와 앱 설정을 선언하는 리소스 파일들을 담고 있다. 설정 앱에서 이 번들의 정보를 바탕으로 당신의 앱의 설정 인터페이스를 구성한다.
- Nonlocalized resource files
- Subdirectories for localized resources
iOS 앱 번들은 “Resources”라는 이름을 가진 서브 디렉토리를 포함할 수 없다.
iOS 앱 번들 구조에 대한 정보를 더 알고 싶다면, Bundle Programming Guide를, 번들에서 리소스 파일을 불러오고 싶다면 Resource Programming Guide를 보자.
The Information Property List File
Xcode는 컴파일 시 프로젝트의 General, Capabilities, 그리고 Info 탭의 정보를 활용해 information property list(Info.plist)를 만든다. 이 파일은 앱의 설정에 대한 중요한 정보들을 담는 구조화된 파일이다. 앱 스토어 및 iOS에서 앱의 기능을 확인하고 주요 리소스를 찾는 데 사용된다. 모든 앱이 이 파일을 포함해야 한다.
Xcode가 기본적으로 필수 항목들을 포함하여 Info.plist를 만들어 주지만, 대부분의 앱들은 약간의 변경이나 추가가 필요하다. 가능하다면 General과 Capabilities 탭을 이용해 앱의 구성 정보를 지정하라. 그 탭들은 앱에서 사용할 수 있는 가장 일반적인 구성 옵션이 포함되어 있다. 해당 탭에 특정 옵션이 보이지 않는다면, Info 탭을 사용하라.
Xcode가 사용자 지정 구성 인터페이스를 제공하지 않는 옵션의 경우 Info.plist를 직접 편집해야 한다. Xcode는 사람이 읽을 수 있는 설명으로 기능을 표시하지만 그 기능 각각은 실제로 Info.plist 파일의 특정 키에 대응된다. 대부분의 키들은 선택적이고 자주 사용되지 않지만 당신이 새로운 프로젝트를 정의할 때 고려해야 할 유용한 키들이 몇 가지 있다.
- 앱에서 요구하는 기능을 Info 탭에서 선언하라: The Required device capabilities 섹션은 앱이 실행되는 데 필요한 기기 수준의 요구 사항 정보를 담는다. 앱 스토어는 이 정보를 활용해 필요한 기능을 지원하지 않는 장치에 해당 앱이 설치되지 않도록 한다.
- 지속적인 Wi-Fi 연결이 필요한 경우 그것을 명시하라: 당신의 앱이 네트워크를 통해 서버와 통신하는 경우 ‘Application uses Wi-Fi entry’를 Info 탭에 더하라. 이 키를 YES로 하는 것은 장시간 비활성 상태일 때 iOS가 활성 Wi-Fi 연결을 닫는 것을 방지한다. 이 키는 네트워크를 사용하여 서버와 통신하는 모든 앱에 권장된다.
- 뉴스 스탠드 앱은 그 자신이 뉴스 스탠드 앱임을 나타내야 한다
- 커스텀 문서 타입을 정의하는 앱은 그 타입을 명시해야 한다: Info 탭의 Document Types 섹션을 이용해 아이콘과 문서 포맷에 맞는 UTI 정보를 특정하라. 시스템은 이 정보를 사용하여 특정 파일 형식을 처리할 수 있는 응용 프로그램을 식별한다.
- 앱은 앱이 지원하는 맞춤 URL 스키마를 선언할 수 있다
- 앱은 사용자 데이터 및 특정 앱 기능에 접근하기 위한 문자열(“usage description”)을 제공해야 한다: 사용자 데이터 또는 기기 기능에 접근하는 앱에 관해 프라이버시 이슈가 있을 경우 iOS는 사용자에게 앱 대신 이를 알리고 허가를 요청한다. 앱은 유저에게 Info.plist 파일에 정의된 purpose string을 제공하여 그 이유를 설명해야 한다. 만약 앱이 해당 문자열을 제공하지 않고 접근하려 할 경우 앱은 곧바로 꺼진다.
Declaring the Required Device Capabilities
모든 앱은 앱이 실행되기 위해 기기가 어떤 기능을 제공해야 하는지 선언해야 한다. 이는 Info.plist 파일의 UIRequiredDeviceCapabilities 키에 대응하며 배열 또는 사전의 형태의 값으로 제공한다. 만약 배열일 경우 키의 존재함이 그 기능이 요구됨을 의미하며, 사전의 경우 기능 키에 해당하는 값으로 불린 값을 제공하는데 이 때 true의 경우 기능이 요구됨을, false의 경우 기능이 없어야 함을 의미한다. 만약 기능이 선택적인 경우, 사전에 그 키를 포함하지 말아야 한다.
App Icons
모든 앱은 기기의 홈 화면과 앱 스토어에 보여줄 아이콘을 제공하여야 한다. 앱은 상황에 맞는 몇몇 다른 아이콘을 제공할 수도 있다. 새로운 Xcode 프로젝트는 앱 아이콘 이미지를 위한 asset entries를 포함하고 있으며 여기에 해당 아이콘 이미지 파일을 넣어주면 된다. 빌드 시, Xcode는 Info.plist에 적절한 키를 추가하고 이미지를 앱 번들에 저장한다.
App Launch (Default) Images
앱의 시작 이미지는 앱이 초기 사용자 인터페이스를 준비하는 동안 유저에게 즉각적인 피드백을 제공한다. 앱이 유저 인터페이스의 최근 스냅 샷을 사용할 수 있는 경우 시작 이미지 대신 이것을 사용한다. 앱이 포그라운드에서 백그라운드로 전환될 때 이 스냅 샷이 생성된다. 이 스냅 샷은 포그라운드로 돌아올 때 가능하다면 사용이 되며 앱이 삭제되거나 오랫동안 실행되지 않은 경우 시스템이 스냅 샷을 삭제한다.
Supporting User Privacy
대부분의 iOS 기기에는 사용자가 앱이나 외부에 공개하고 싶지 않는 정보가 들어있다. 이 정보에 함부로 접근하거나 사용하는 경우 사용자는 앱을 삭제할 것이다.
- 앱은 iOS 시스템 인증 설정에 의해 보호되는 데이터가 필요할 때 요청을 해야 한다. 당신은 앱이 그 데이터가 왜 필요한지 설명하는 문자열을 Info.plist에 제공해야 한다. iOS 시스템 인증 설정으로부터 보호되는 데이터에는 위치, 연락처, 달력 일정, 미리 알림, 사진, 미디어 및 기타 여러 유형이 포함된다.
- 유저에게 데이터가 어떻게 사용될 지 투명하게 공개하라. 예를 들어, 앱 스토어에 앱을 제출시, 프라이버시 정책이나 성명에 대한 URL을 지정하라.
- 유저에게 유저나 디바이스 데이터에 대한 제어권을 주어라. 유저가 특정 정보에 대한 접근 제어를 할 수 있도록 설정을 제공하라.
- 작업을 수행하는 데 필요한 최소한의 정보만을 요청하라.
- 합리적인 조치를 취하여 앱에서 수집한 사용자 및 기기 데이터를 보호하라. 로컬에 저장할 때는 디스크 암호화를 통해서, 네트워크로 보낼 때는 App Transport Security를 사용하라.
- 앱이 오디오 입력을 지원하는 경우 실제로 녹음을 시작할 시점에서 녹음을 위한 오디오 세션을 구성하라. 녹음을 시작할 때 사용자에게 경고하고 녹음을 중지할 수 있는 옵션도 제공하라.
Important: 보호되는 아이템에 접근하는 경우 시스템은 접근 허가에 대한 경고를 띄운다. iOS 10부터는 info.plist에서 이 경고창에 띄울 각 아이템에 대한 목적 문자열을 반드시 포함해야 한다. 그렇지 않았을 때 보호되는 아이템에 접근할 경우 앱이 나가진다.
Data and resources by system authorization settings
- 블루투스 주변기기: NSBluetoothPeripheralUsageDescription
- 캘린더 데이터: NSCalendarUsageDescription
- 카메라: NSCameraUsageDescription
- 연락처: NSContactsUsageDescription
- 건강 공유: NSHealthShareUsageDescription
- 건강 업데이트: NSHealthUpdateUsageDescription
- 홈 킷: NSHomeKitUsageDescription
- 위치: NSLocationAlwaysUsageDescription, NSLocationWhenInUseUsageDescription
- 마이크: NSMicrophoneUsageDescription
- 움직임: NSMotionUsageDescription
- 음악과 미디어 라이브러리: NSAppleMusicUsageDescription
- 사진: NSPhotoLibraryUsageDescription
- 미리 알림: NSRemindersUsageDescription
- 시리: NSSiriUsageDescription
- 음성 인식: NSSpeechRecognitionUsageDescription
- TV 제공업체: NSVideoSubscriberAccountUsageDescription