2023. 4. 2. 19:14ㆍDevelopers 공간 [Shorts]/Frontend
<분류>
A. 수단
- OS/Platform/Tool : Linux, Kubernetes(k8s), Docker, AWS
- Package Manager : node.js, yarn, brew,
- Compiler/Transpillar : React, Nvcc, gcc/g++, Babel, Flutter
- Module Bundler : React, Webpack, Parcel
B. 언어
- C/C++, python, Javacsript, Typescript, Go-Lang, CUDA, Dart, HTML/CSS
C. 라이브러리 및 프레임워크 및 SDK
- OpenCV, OpenCL, FastAPI, PyTorch, Tensorflow, Nsight
1. What? (현상)
iOS 앱을 개발하다 보면 다양한 ID가 나타나는데 어떤것인지 정리하고 싶어 이 글을 쓰게 되었습니다.
2. Why? (원인)
- X
3. How? (해결책)
먼저 아이디 별로 알고 있어야할 개념에 대해 설명하고 자세하게 설명드리겠습니다.
===============================================================
- UDID(Unique Device Identifier) 및 UUID(Universally Unique Identifier) : Device가 변하지 않는 이상 변하지 않는다.
- IDFV(Identifier for Vendor) : 같은 Device에서 동일한 개발자에 대한 App은 같은 값을 가집니다.
** 위와 무관하게 Google Play Store가 제공하는 광고 식별 값을 ADID, App Store가 제공하는 광고 식별 값을 IDFA라 하며, 앱의 구매자가 한개의 ADID 혹은 IDFA를 가집니다. - Team Name : 애플이 제공한 것으로, 동일한 개발자는 같은 값을 가집니다.
- App ID : "Team ID + Bundle ID" 이며 Team ID는 애플이 제공하고 Bundle ID는 개발자가 제공합니다. 같은 App은 같은 App ID를 가집니다.
ex) TTTTTT.com.domainname.applicationname 에서 TTTTTT는 Team ID, 나머지는 Bundle ID입니다. - Certificate : 애플이 개발이 가능하도록 제공한 인증서로, 재발급 받지 않는 한 변하지 않습니다.
===============================================================
- flutter doctor -v 에 나오는 device ID : 연결시의 아이폰의 UDID입니다. 고유번호이므로 변하지 않습니다.
ex) ... MYPHONE (mobile) DEVICE_UDID_REMOVED ios ios 16.1.1 ... - 디바이스 디버깅 하는 경우 cache Directory Path에 있는 App GUID (path provider혹은photo manager패키지): device에 디버그 모드로 실행할 때마다 얻는 GUID이므로, 매번 변합니다.
ex) /private/var/mobile/Containers/Data/Application/APP_GUID_REMOVED/tmp/flutter-images/FILE_NAME_REMOVED_exif.jpg
ex) /var/mobile/Containers/Data/Application/APP_GUID_REMOVED/Library/Caches/FILE_NAME_REMOVED.png
** GUID(Globally Unique Identifier) : 특정 구성 요소, 하드웨어, 소프트웨어, 파일, 사용자 계정, 데이터베이스 항목 및 기타 항목을 고유하게 식별하기 위해 128 비트 숫자 - device_info_plus 패키지 결과 중 IDFV : 설치된 앱의 Vendor를 위한 ID로, 같은 개발자에 의해 실행되면 같습니다.
ex) DeviceInfoPlugin().iosInfo.identifierForVendor : IDFV_ID_REMOVED - ~/Library/Developer/Xcode/DerivedData 내에 있는 파일 이름 : Pods와 Runner에 ID가 적혀있는데 아직 알아내지 못했습니다만, 단순히 Build파일 ID인 것으로 보입니다..
ex) ModuleCache.noindex
ex) SymbolCache.noindex
ex) Pods-***
ex) Runner-***
** DerivedData는 Xcode 프로젝트의 빌드파일을 저장하는 곳으로, ModuleCache.noindex는 컴파일된 module들, SymbolCache.noindex는 각종 plist등의 심볼들을 저장해둡니다.
** 배포 단계에서는 ~/Library/Developer/Xcode/Archives에 ~.xcarchive 형태로 저장됩니다. - flutter run 으로 debug 모드로 실행할 때, 나오는 Logs : Team Name을 의미하기 때문에 변하지 않습니다.
ex) "Automatically signing iOS for device development using specified development team in Xcode project : TEAM_ID_REMOVED " - ios/Runner.xcodeproj, ios/Runner.xcworkspace 에서의 Automatically manage signing 일 때 Signing & Capabilities : 실제 ID 대신 고유 Name이 적혀있습니다.
App ID : APP_NAME_REMOVED
Certificate : CERTIFICATE_REMOVED
Team : TEAM_NAME_REMOVED
Devices : DEVICE_NAME_REMOVED - ~/Library/MobileDevice/Provisioning Profiles/DEVICE_UDID_REMOVED.mobileprovision 에 대해 openssl smime -in DEVICE_UDID_REMOVED.mobileprovision -inform der -verify 결과 : device의 ID와 team identifier는 역시나 변하지 않습니다.
- Provisioned Devices : DEVICE_UDID_REMOVED
- UUID : DEVICE_UUID_REMOVED
- Access group or team-identifier : TEAM_ID_REMOVED
-----------------------------------------------------------------------------------------------------
<xcodeproj 와 xcworkspace>
- ios/Runner.xcodeproj (+ ios/Runner.xcodeproj/Runner.xcworkspace) :외부 라이브러리 무관하게 프로젝트의 설정파일들.
- ios/Runner.xcworkspace : 외부 라이브러리와 함께 프로젝트를 생성시, 사용하는 외부 라이브러리와 연결하는 설정 파일들이 포함되어있습니다. contents.xcworkspacedata에 보면 본인이 어떤 Pods에 연결되어있는지 설명되어있습니다.
- ios/Pods/Pods.xcodeproj : Pods들이 설치되어 있는 곳입니다.
<iOS앱에 필요한 Signing 과 Provisiobing>
- Signing Certificate : iOS의 앱은 Xcode를 통해 빌드할 때 "개발자의 signing 서명"이 필요하고, 이 signing은 "변하면 안됩"니다. 얻기 위한 절차는 아래와 같습니다.
- CSR (Certificate Siging Request,인증 서명 요청) : 인증서를 위한 신청서로 CertificateSigningRequest.certSigningRequest 파일입니다., "키체인 접근 > 인증서 지원 > 인증 기관에서 인증서 요청"에서 나의 Public Key-Private Key 쌍과 기타 신청서를 생성합니다.(보통 2048bit, RSA)
- 인증서(signing certificate) : 실제 인증서로, development.cer 혹은 ~.cer 파일입니다. 신청서의 Private Key와 합쳐진 인증서로, App Developer 사이트에서 진행하며 아래와 같은 두가지 인증서가 있습니다.
- Apple Development certificate : 개발자용 인증서
- Apple Distribution certificate : 배포용 인증서
- Provisioning Profile : 앱이 어떤 환경에서 언제, 어떤 권한을 가지고 실행 가능한지에 대한 제약 조건들로, embedded.mobileprovision 파일입니다. 위치는 ~/Library/MobileDevice/Provisioning Profiles 입니다.
- App Developer사이트에서 진행하며, 위의 Signing Certificate와 내가 만든 앱의 ID와 device의 UUID가 필요합니다.
- Provisioning Profile을 통해 확인하는 내용
- 앱 ↔ Provisioning Profile : (앱) Bundle ID ↔ (Provisioning Profile) App ID
- 앱 ↔ Provisioning Profile : (앱) Entitlements ↔ (Provisioning Profile) Entitlements, 자격
- 앱 ↔ Provisioning Profile : (앱) 서명 ↔ (Provisioning Profile) 앱에 서명할 수 있는 인증서 목록
- 앱 ↔ Provisioning Profile : (앱) device ↔ (Provisioning Profile) 앱이 동작가능한 device 목록
- Automatic Manage Signing
- 아래는 Manual Sigining과 Automatic Manage Signing을 했을 때의 화면 차이입니다. 아래의 주황색은 Team에 대한 정보인데 이를 기준으로 Signing Certificate와 내가 만든 앱의 ID와 device의 UUID를 만들고, Provisioning Profile까지 만들어줍니다.
** Team : Apple 계정으로 개발자를 명시하는 방법이라고 생각해두시면 됩니다. - 하지만 이렇게 생긴 Provisioning Profile은 매번 삭제되기 떄문에 Release단계에서는 Manual로 해주어야합니다.
- 아래는 Manual Sigining과 Automatic Manage Signing을 했을 때의 화면 차이입니다. 아래의 주황색은 Team에 대한 정보인데 이를 기준으로 Signing Certificate와 내가 만든 앱의 ID와 device의 UUID를 만들고, Provisioning Profile까지 만들어줍니다.
-----------------------------------------------------------------------------------------------------
https://eeyatho.tistory.com/63
https://stackoverflow.com/questions/51387873/xcode-couldnt-find-any-provisioning-profiles-matching
https://engineering.linecorp.com/ko/blog/ios-code-signing/#Entitlements
http://theeye.pe.kr/archives/2440
https://sujinnaljin.medium.com/ios-certificate-%EC%99%80-provisioning-profile-e1b9455e8a51
'Developers 공간 [Shorts] > Frontend' 카테고리의 다른 글
[Flutter] Firebase 추가하고 Analytics 활용하기 (0) | 2023.04.07 |
---|---|
[Flutter] Geolocator 사용하기 (0) | 2023.04.03 |
[Flutter] Platform 정보를 확인하기 위한 방법 정리 (0) | 2023.04.02 |
[Flutter] Stacked에서 view와 viewModel의 생성 순서 (0) | 2023.04.02 |
[Flutter] 버튼에 애니메이션 넣기 (0) | 2023.03.28 |