[Flutter] iOS 개발 시 나오는 다양한 ID 정리 (+signing 개념)

2023. 4. 2. 19:14Developers 공간 [Shorts]/Frontend

728x90
반응형
<분류>
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 : 애플이 개발이 가능하도록 제공한 인증서로, 재발급 받지 않는 한 변하지 않습니다.

===============================================================

 

 

  1. flutter doctor -v 에 나오는 device ID : 연결시의 아이폰의 UDID입니다. 고유번호이므로 변하지 않습니다.
    ex) ... MYPHONE (mobile)  DEVICE_UDID_REMOVED              ios            ios 16.1.1 ...
  2. 디바이스 디버깅 하는 경우 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 비트 숫자
  3. device_info_plus 패키지 결과 중 IDFV : 설치된 앱의 Vendor를 위한 ID로, 같은 개발자에 의해 실행되면 같습니다.
    ex) DeviceInfoPlugin().iosInfo.identifierForVendor : IDFV_ID_REMOVED
  4. ~/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 형태로 저장됩니다.
  5. flutter run 으로 debug 모드로 실행할 때, 나오는 Logs : Team Name을 의미하기 때문에 변하지 않습니다.
    ex) "Automatically signing iOS for device development using specified development team in Xcode project : TEAM_ID_REMOVED "
  6. 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
  7. ~/Library/MobileDevice/Provisioning Profiles/DEVICE_UDID_REMOVED.mobileprovision 에 대해 openssl smime -in DEVICE_UDID_REMOVED.mobileprovision -inform der -verify 결과 : device의 ID와 team identifier는 역시나 변하지 않습니다.
    1. Provisioned Devices :  DEVICE_UDID_REMOVED 
    2. UUID : DEVICE_UUID_REMOVED
    3. 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은 "변하면 안됩"니다. 얻기 위한 절차는 아래와 같습니다.
    1. CSR (Certificate Siging Request,인증 서명 요청) : 인증서를 위한 신청서로 CertificateSigningRequest.certSigningRequest 파일입니다., "키체인 접근 > 인증서 지원 > 인증 기관에서 인증서 요청"에서 나의 Public Key-Private Key 쌍과 기타 신청서를 생성합니다.(보통 2048bit, RSA)
    2. 인증서(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와 내가 만든 앱의 IDdevice의 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 목록
[https://sujinnaljin.medium.com/ios-certificate-%EC%99%80-provisioning-profile-e1b9455e8a51]
  • Automatic Manage Signing 
    • 아래는 Manual Sigining과 Automatic Manage Signing을 했을 때의 화면 차이입니다. 아래의 주황색은 Team에 대한 정보인데 이를 기준으로 Signing Certificate와 내가 만든 앱의 ID와 device의 UUID를 만들고, Provisioning Profile까지 만들어줍니다. 
      ** Team : Apple 계정으로 개발자를 명시하는 방법이라고 생각해두시면 됩니다.
    • 하지만 이렇게 생긴 Provisioning Profile은 매번 삭제되기 떄문에 Release단계에서는 Manual로 해주어야합니다.
[manual signing 과 automatic manage signing]

-----------------------------------------------------------------------------------------------------

 


 

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

https://getbingsoo.tistory.com/61

728x90
반응형