# App Distribution
https://help.apple.com/xcode/mac/11.4/#/devc8c2a6be1
위 문서에서 아래의 용어 또는 내용에 대해 알아보고 내 프로젝트에는 어떻게 적용되어 있는지 확인해보고 오세요.
## Project
Apple 플랫폼용 앱, 라이브러리 및 기타 소프트웨어를 구축하는 데 사용하는 코드와 리소스를 관리하는 곳.
</br>
## Bundle ID / App ID
번들이란? 실행가능한 결과물이 되는 리소스를 포함한 모든 파일
* Bundle ID: 시스템 전체에서 앱을 고유하게 식별하는 ID. 첫 번째 빌드를 업로드한 후에는 App Store Connect에서 번들 ID를 변경할 수 없으므로 업로드하기 전에 App Bundle의 모든 대상에 대한 Bundle ID를 신중하게 선택하고 결정할 것.
* App ID: App ID는 provisioning profile의 단일 개발 팀에서 하나 이상의 앱을 식별하는 two-part string이다. App ID에는 명시적 App ID(단일 앱에 사용)와 와일드카드 App ID(앱 집합에 사용)의 두 가지 타입이 있다. </br> </br> 명시적 App ID에는 Bundle ID의 전체 경로가 포함되어 있다. 와일드카드 App ID에는 Bundle ID 검색 문자열의 마지막 부분으로 별표를 포함한다. (참고: 앱 스토어에 앱을 제출하고 특정 서비스를 사용하려면 명시적 App ID가 필요하다.)
</br>
## Target
Target은 앱, 프레임워크, 앱 익스텐션 또는 Unit test와 같이 빌드할 product를 지정한다. 프로젝트는 일반적으로 단일 product의 관련 부분을 나타내는 여러 target을 포함할 수 있다.
템플릿을 통해 새 프로젝트를 만들 때 Xcode는 하나 이상의 target을 프로젝트에 자동으로 추가한다.
하나의 실행 파일이 만들어질 수 있는 파일들의 묶음
빌드할 product의 명세. (build 작업명세서)
</br>
## Scheme
프로젝트의 일부를 빌드, 실행, 테스트, 프로파일링 또는 보관할 경우 Xcode는 선택한 build scheme를 사용하여 수행할 작업을 결정한다. Build Scheme에는 빌드할 target 목록과 선택한 작업에 영향을 미치는 구성 및 환경 세부 정보가 포함된다. 예를 들어, build and run을 수행할 때 scheme은 앱에 전달할 launch arguments를 Xcode에 알려준다. Xcode는 대부분의 target에 대한 기본 Scheme을 제공하며 해당 scheme을 customizing하거나 필요에 따라 새 scheme을 만들 수 있다.
</br>
## Distribution methods
사용자에게 앱을 배포할 준비가 되면 플랫폼 및 프로그램 멤버십에 따라
목적에 적합한 배포 method를 선택해서 사용해야 한다. Xcode는 개발자와 앱이 사용 가능한 메서드와 옵션만을 제공한다.
| Method | Description |
| -------- | -------- |
| App Store Connect | Apple Developer Program distribution provisioning profile로 서명된 TestFlight 또는 App Store를 통해 앱을 배포한다. |
| Ad Hoc | ad hoc provisioning profile로 서명된 기기가 등록된 테스터에게 앱을 배포한다. </br> </br> 기기는 개발자 계정에 등록해야 하며 연간 제품군 별로 제한된다. 테스트를 위한 이러한 개발 기기의 일부를 사용하지 않으려면 대신 TestFlight를 사용하여 앱을 배포할 것. </br> </br> Apple Developer Program 또는 Apple Developer Enterprise Program의 멤버인 경우 이 옵션을 선택하여 앱을 테스트할 것. |
| Enterprise | Apple Developer Enterprise Program distribution provisioning profile로 서명된 조직의 사용자에게 앱을 배포한다. </br> </br> Apple Developer Enterprise Program의 멤버이고 조직의 사용자에게 앱을 출시할 준비가 된 경우 이 옵션을 선택할 것. |
| Copy App | macOS 앱의 경우 code signing 없이 앱을 내보낸다. |
| Development | Development provisioning profile로 서명된 기기가 등록된 테스터에게 앱을 배포한다. </br> </br> Apple Developer Program 팀에만 앱을 배포하려면 이 옵션을 선택할 것. macOS 앱의 경우 테스트를 위해 Apple Developer Program 서명 앱을 배포하는 유일한 옵션이다. |
| Developer ID | macOS 앱의 경우 Apple에서 공증했거나 개발자 ID 인증서로 서명한 앱을 Mac App Store 외부에 배포하여 신뢰할 수 있는 개발자임을 사용자에게 보장한다. |
</br>
## Provisioning profile
Xcode에서 앱에 수동으로 서명하려면 Development provisioning profile을 생성해야 한다.
시작하기 전에 App ID, 하나 이상의 개발 인증서 및 하나 이상의 기기가 등록되어 있어야 한다. Xcode가 관리하는 App ID 중 하나를 사용하거나 App ID를 등록할 수 있다. 팀원은 개발 인증서를 만들고 Xcode를 사용하여 기기를 등록해야 한다. 또는 팀에서 사용하는 여러 장치를 개발자 계정에 등록할 수 있다.
macOS를 제외한 Apple 플랫폼은 임의의 타사 코드(서드 파티)를 실행하지 않는다. 서드 파티의 모든 실행은 Apple의 승인을 받아야 한다. 이 권한 부여는 provisioning profile의 형태로 제공되며 다음 다섯 가지 기준을 함께 묶는다.
* 코드에 서명할 수 있는 사람이 누구인지
* 서명할 수 있는 앱은 무엇인지
* 해당 앱은 어디에서 실행할 수 있는지
* 해당 앱은 언제 실행할 수 있는지
* 해당 앱에 어떻게 자격이 부여될 수 있는지
웹 사이트를 직접 사용하거나 Xcode 또는 App Store Connect API를 사용하여 간접적으로 Apple 개발자 웹 사이트를 사용하여 provisioning profile을 생성한다.
Apple 개발자 웹 사이트에서 프로필을 만들 때 암호화하여 서명한다. 기기에서 앱을 실행하면 기기는 이 서명을 확인하여 프로필이 유효한지 확인하고 유효한 경우 앱이 프로필의 기준을 충족하는지 확인한다.
Provisioning profile에 대한 한 가지 흥미로운 edge case가 있다. App Store에 앱을 제출하면 App Store는 배포 프로세스의 일부로 앱에 다시 서명한다. 이를 수행하기 전에 앱이 올바르게 서명되고 provisioning 되었는지 확인한다. 이 검사는 각 개별 기기가 추가 보안 검사를 수행할 필요가 없으므로 최종 앱에 provisioning profile이 없음을 의미한다. 그러나 서드파티 코드는 App Store 배포 프로세스 중에도 여전히 profile에 의해 승인되어 있다.
</br>
## Code signing
앱에 code sign을 하면 앱이 알려진 소스에서 왔으며 마지막으로 서명된 이후 수정되지 않았음을 사용자에게 보장한다. 앱이 앱 서비스를 통합하거나 기기에 설치되거나 App Store에 제출되기 전에 Apple에서 발급한 인증서로 서명되어야 한다.
기기에서 앱을 실행하고 CloudKit, Game Center, 인앱 구매와 같은 특정 앱 서비스를 사용하기 위해 앱에 code sign을 해야한다. 개발에 사용하는 기기를 등록하고 sign에 사용하는 provisioning profile에 추가해야한다. Automatic signing(권장)을 사용하는 경우 Xcode는 필요할 때 이러한 development signing asset을 생성한다. 이후, Xcode는 앱을 App Store Connect에 업로드하여 테스트용으로 또는 App Store를 통해 배포할 때 Distribution signing asset을 생성할 수 있다.
앱에 code sign을 하려면 Xcode 프로젝트의 각 target을 동일한 팀에 할당해야 한다. 개인으로 등록한다면 1인 팀으로 간주된다. Apple Developer Program의 회원이 아닌 경우 Xcode에서 개인 팀을 생성한다.
</br>
## Signing certificate
Apple에서 발급한 서명 인증서를 요청, 다운로드 및 사용하려면 Apple Developer Program 멤버십이 필요하다.
Signing certificate(서명 인증서)는 build 및 archive 프로세스 중에 코드 서명(code signing)에 사용되는 디지털 ID이다.
서명 인증서에는 Apple에서 발행한 공개-개인 키 쌍이 포함된 인증서가 포함되며 키체인에 저장된다. 개인 키는 로컬에 저장되므로 계정 암호처럼 보호할 것. 인증서가 Apple과 같은 인증 기관에서 발급되었는지 확인하려면 중간 인증서(intermediate certificate)도 키체인에 있어야 한다.
Xcode를 설치하면 Apple의 중간 인증서가 키체인에 추가된다. 그 다음 Xcode를 사용하여 서명 인증서를 만들고 앱에 서명한다. 서명 인증서가 키체인에 추가되고 해당 인증서가 개발자 계정에 추가된다. 조직으로 등록하면 개발자 계정에 팀 구성원이 만든 모든 인증서가 표시된다.

아카이브?
앱을 배포하기 전 최종 빌드 후 해당 실행 파일을 포장하는 과정
컴파일 -> 링킹 -> 빌드 -> 코드사이닝 -> 아카이빙