App Signing에 대하여
실제 디바이스에서 run 하고싶어요..
우리는 앱을 개발하고, 배포한다.
iOS 앱을 Simulator로 run할 때는 그냥 하면 된다.
하지만, 실제 핸드폰을 연결해서 run 하는 순간 우리는 다음과 같은 에러를 마주한다.
Signing for "FirstSwiftUI" requires a development team. Select a development team in the Signing & Capabilities editor.
Signing을 하는데 team이 필요하다.는 오류다.
음.. 실제 핸드폰에 연결하려면 Signing 이란걸 해야되는데, 그럴려면 team이 필요하다. 정도로 해석할 수 있다.
그리고 시키는 대로 Signing & Capabilities에 가보면 에러를 볼 수 있다.
그리고 Automatically manage signing이 체크되어있는 것도 볼 수 있다.
만약 체크를 해제하고, 다시 run을 하면 에러가 바뀐다.
"FirstSwiftUI" requires a provisioning profile. Select a provisioning profile in the Signing & Capabilities editor.
프로비저닝 프로파일이 필요하다고 한다.
여기서 알 수 있는건,
- 실제 핸드폰에서 앱을 실행하려면 Signing이란걸 해야 한다.
- Signing은 Automatically하게 관리할 수가 있다.
- Automatically → team / NonAutomatically → Provisioning profile 을 필요로 한다.
Automatically manage 하게되면 team을 기반으로 뭔가 자동으로 생성해주나 보다. 정도로 이해하자.
그럼 Signing이 뭘까?
https://help.apple.com/xcode/mac/current/#/devfbe995ebf
앱에 Signing이라는걸 한다.
그러면 앱이 깔리고 실행될 때, 시스템(운영체제 - iOS)는 이 Signing을 통해 누가 앱에 서명을 했는지, 앱이 서명된 후에 수정되진 않았는지 체크할 수 있다.
자 다시, 두가지를 체크할 수 있다.
- 누가 앱에 서명을 했는지
- 서명된 후에 수정되지 않았는지
인증서
일단 "1. 누가 앱에 서명을 했는지"에서 "누가"의 조건은 Apple에 의해 인증된 사용자이다.
이 때 필요한게 인증서이다.
Xcode는 앱을 빌드할 때 서명 인증서(signing certificate)를 사용해서 앱에 서명한다. 인증서는 개발자가 Apple에 발급 요청(요청서를 CSR - Certificate Signing Request이라고 한다)을 해서 받는 건데, CSR을 만들 때 이메일 주소, 이름을 넣어서 애플에 제출하면, 애플에서 내부에 Public key를 포함하여 인증서를 발급해준다. 인증서는 사실 크게 2파트로 나눌 수 있는데, 앞에서 말한 Public key가 포함된 인증서 조각과, 이것과 쌍이 되는 Private key 조각이다. 인증서를 만들어서 apple developer에서 download받으면 Public key가 포함된 조각을 받는거고, Private key는 CSR을 만든 컴퓨터의 keychain에 저장되어 있다. 그래서 만약 다른 사람과 인증서를 공유하고자 한다면, CSR을 만든 컴퓨터에서 Export해서 private key까지 포함된 .p12 파일을 생성하고, 이걸 공유하는 식이다.
참고
https://help.apple.com/xcode/mac/current/#/dev3a05256b8
XCode는 내가 앱을 빌드, 아카이브 할 때 App에 code sign을 한다. 필요한 경우, XCode는 인증서를 요청하고 서명 인증서(signing certificate)를 나의 keychain에 추가한다. 이 인증서는 public-private key 쌍을 가지고 있다. public key가 있는 인증서가 내 개발자 계정에 추가된다.
Certificate Type
Certificate Type들이 다양하게 있는데, 앱을 개발하고 테스트, 배포하는데 필요한 두가지에 대해 알아보자.
- Apple Development certificate - 이걸 사용해서 기기에서 앱을 실행하고 앱 서비스를 사용할 수 있다. 이건 오직 개발자가 직접 핸드폰을 꽂아서 Xcode run하는 경우만 해당한다.
- Apple Distribution certificate - 이걸 사용해서 너의 testing & 앱스토어 업로드를 위한 App을 배포할 수 있다. 여기서 testing은 테스트용 배포를 의미한다. 그러니까 앱 파일을 어딘가에 공유한다면.. 무조건 Distribution certificate가 필요하다.
배포 인증서(Distribution certificates)는 team에 속하지만, 멤버들 중 Account Holder(No.1) 또는 Admin(No.2)만 배포 인증서(distribution certificates)를 만들 수 있다(개인으로 등록한 경우 계정 소유자만).
인증서 갯수는 2개로 제한된다.
팀의 다른 사람과 서명 인증서를 공유하려면 서명 인증서를 export하고(.p12 파일 생성), 다른 사람의 Mac에서 내보낸 파일을 두 번 클릭하여 키체인에 서명 인증서를 설치한다.
프로비저닝 프로파일 (Provisioning Profile)
위에서 "2. 서명된 후에 수정하지 않았는지" 부분을 체크한다고 했는데.
서명된 후에 수정을 한지는 앱ID로 체크하는 것 같다.(뇌피셜임)
이 ID를 기준으로 같은 앱인지 아닌지를 판단하는 것 같다. (이것도 뇌피셜임)
이렇게 생각한 이유는 Provisioning Profile때문인데, 이 파일은 위에서 Xcode에서 Signing을 Automatically manage하지 않을 때 필요한 파일이였다. 이 파일이 있으면 앱을 Signing 할 수 있다는 뜻!!
그리고 이 Provisioning Profile은 개발자가 만드는 파일인데, 만들 때 필요한 정보는 크게 3가지다. 누가, 어떤걸, 어디다가?
- 인증서 - 위에서 말한 인증서! 프로비저닝 프로파일을 만들려면 인증서가 필요하다.
- 앱ID
- (앱을 실행할)디바이스 UUID들
이 정보들 중 서명된 후에 수정하지 않았는지를 체크할 수 있는 정보는 앱ID 뿐이라고 생각하기 때문에..
아무튼 이 3가지 정보로 만들어진 Provisioning Profile을 다운받아서 Signing 세팅부분에 직접 import 해주면 Signing이 가능하다.
그리고 실행될 디바이스의 UUID들이 들어가므로, 테스팅할 디바이스가 추가될 경우 개발자 페이지에서 디바이스를 추가한 후 이 정보가 포함된 Provisioning Profile을 다시 만들어야 한다.
Automatic signing
이 기능을 체크하면 Xcode가 자동으로 Signing을 관리해준다.
team을 선택하고, Automatically manage signing을 체크하면 된다.
그러면 team(계정)을 기준으로 (필요한 경우) 인증서를 만들어주고, 연결된 장치를 등록시켜주고, 앱ID를 생성하고 편집해주는 과정을 자동으로 Xcode가 해준다.
프로비저닝 파일을 대신하는 기능이기 때문에, 누가 어떤걸 어디다가 정보가 계속 바뀔 수 있다. 그래서 이걸 체크하는 순간.. 기존의 provisioning 파일은 만료되어버린다... 그래서 협업을 할 땐 꼭 주의하자.
근데.. 내가 팀에서 공유한 p12 인증서를 가지고 있고, 앱도 똑같은 앱이고, 기기도 이미 계정에 등록되었는데 Automatically signing을 체크하는 순간 provisioning 파일이 만료된다. 분명 Xcode는 필요한 경우에만 이것들을 새로 만든다고 했는데.
그래서 내 생각에는 인증서나 기기 정보 때문이 아니고 앱을 빌드할 때 Automatically Signing을 하게 되면 앱ID를 소스를 기반으로 Xcode가 임의로 만들지 않을까 생각한다.. 그래서 다른 앱으로 인지하고, 기존의 provisioning을 만료시키는게 아닐까?? ㅎ(뇌피셜)