말랑한 하루
[Flutter] (Project) MapleSpy: 45. Flutter build ipa 본문
Flutter buidl ipa가 성공적으로 완료되기 위한 처음 과정부터 자세히 기록한 칼럼입니다. ipa build 자체만 보고 싶으시다면, 맨 아래로 이동하세요.
※ reference : https://docs.flutter.dev/deployment/ios
🐇 App Store Connect에 앱 등록
App Store Connect에서 앱의 수명 주기를 관리할 수 있습니다. 앱의 이름과 설명을 정의하고, 스크린 샷을 추가하고, 가격을 설정하고, AppStore 및 TestFlight에 대한 릴리즈를 관리합니다.
🥕 Bundle ID 등록
모든 iOS 애플리케이션은 Apple에 등록된 고유 식별자인 Bundle ID와 연결되어 있기 때문에 필수로 등록해야합니다.
- 개발자 계정의 App ID 페이지에 접근합니다.
⇒ url : https://developer.apple.com/account/resources/identifiers/bundleId/add/bundle
- "+"를 클릭하여, iOS 앱 개발을 선택 후 새로운 Bundle ID를 생성합니다.
- 앱 이름을 입력하고 명시적(Explicit) 앱 ID를 선택한 후 ID를 입력하세요.
- 앱에서 사용하는 서비스를 선택한 다음 계속을 클릭하세요 .
- 다음 페이지에서 세부 사항을 확인하고 등록을 클릭하여 번들 ID를 등록하세요.
🥕 App Store Connect에서 애플리케이션 기록 생성
- App Store Connect에 접근합니다.
⇒ url : https://appstoreconnect.apple.com/apps
- "+"를 클릭하여 새 앱을 선택 후, 세부 정보를 입력합니다.
- iOS가 선택됐는지 확인하세요. 단, Flutter는 tvOS를 지원하지 않으므로 해당 칸이 선택되지 않은 채로 두어야 합니다.
- 앱의 세부정보로 이동 후, 앱 정보를 선택합니다.
- 일반 정보 섹션에서 이전 단계에서 등록한 Bundle ID를 선택합니다.
🐇 Xcode 프로젝트 설정 검토
※ reference : https://docs.flutter.dev/deployment/ios#review-xcode-project-settings
Xcode 작업 영역에서 가장 중요한 설정을 검토하는 방법을 다룹니다. 그 전에 앱 배포에 대한 섹션을 먼저 진행해야 좋습니다.
🥕 앱 배포 준비
※ reference : https://help.apple.com/xcode/mac/current/#/dev91fe7130a
언제든지 프로젝트 설정을 편집할 수 있지만, 개발 중에 일부 설정이 필요합니다. 다른 것들은 테스트를 위해 앱을 배포할 때 권장되며, 앱을 업로드 한 후 나중에 앱 심사에 제출할 때 필요합니다. 이 섹션에서는 App Store Connect에 앱을 업로드하기 전에 앱에 대한 모든 필수 정보를 제공하는 단계입니다.
🍒 Bundle ID 설정
Bundle ID는 시스템 전체에서 앱을 고유하게 식별합니다. 첫 번째 빌드를 업로드한 후에는 App Store Connect에서 Bundle ID를 변경할 수 없으므로 신중하게 설정하세요.
🍒 팀에게 대상 할당
※ reference : https://help.apple.com/xcode/mac/current/#/dev23aab79b4
TestFlight를 사용하거나, App Store를 통해 앱을 배포하려면 Apple Developer Program에 속한 팀에 대상을 할당해야 합니다.
🍒 버전 번호 및 빌드 문자열 설정
App Store Connect에서는 이를 사용하여 App Version과 일치시키므로, 앱을 배포하기 전에 버전 번호와 빌드 문자열을 설정해야 합니다.
🍒 앱 카테고리 설정
카테고리는 사용자가 App Store에서 앱을 찾는 데 도움이 됩니다.
🍒 배포 정보 설정 편집
App Store Connect와 일치해야 하는 경우가 존재하므로, 앱을 배포하기 전에 배포 정보 설정을 편집하세요
🍒 앱 아이콘 추가
기기의 다양한 위치에서 앱을 나타내고 App Store Connect 유효성 검사 테스트를 통과하려면 앱 아이콘을 추가해야 합니다.
🍒 시작 화면 제공(iOS)
프로젝트 편집기의 일반 창에 존재하는 "앱 아이콘 및 실행 이미지"에서 시작 화면 및 시작 이미지를 지정해줍니다.
🍒 보호된 리소스에 액세스하기 위한 사용법 제공
🥕 Xcode 프로젝트 설정
관련 설정은 Xcode에서 "Runner" → "Info" 경로를 통해 확인하고 설정할 수 있습니다. Flutter의 경우 대부분 환경 변수 값으로 설정되어 있기 때문에, 특별하게 수정하지 않아도 됩니다.
🍒 Xcode에서 대상 설정으로 이동합니다.
Flutter Project Directory의 최상단 터미널 창에서 다음 명령어를 실행하여 프로젝트의 기본 Xcode 작업공간을 엽니다.
open ios/Runner.xcworkspace
앱 설정을 보려면 Xcode 탐색기에서 Runner 대상을 선택하세요.
🍒 Display Name
⇒ 앱의 표시 이름
🍒 Bundle Identifier
⇒ App Store Connect에 등록한 App ID
🍒 서명 및 기능 탭에서, Automatically manage signing
⇒ Xcode가 앱 서명 및 프로비저닝을 자동으로 관리해야 하는지 여부입니다. 이는 true가 기본으로 설정되어 있으며, 대부분의 앱에 충분하게 동작합니다.
🍒 Team
⇒ 등록된 Apple 개발자 계정과 연결된 팀을 선택하세요. 필요한 경우 계정 추가…를 통해 설정을 업데이트할 수 있습니다.
이 과정에서 다음의 에러를 만날 수 있습니다.
⚠️ Communication with Apple failed, Apple과 통신에 실패했습니다.
⚠️ No profiles for ‘~’ were found, ~에 대한 프로파일을 찾을 수 없습니다.
두 문제 모두 profiles를 찾을 수 없음에 시작된 것 같기 때문에, "developer.apple.com/account/profiles/list" 경
로를 통해 새로운 Profiles를 등록하여 해결하려 했습니다.
이 문제를 해결하는 과정을 진행하는 순서는 다음과 같이 진행할 수 있습니다. 만약 팀원이 없는 경우, ★이 표시된 부분만 진행하시면 됩니다. 또한, 하위 부분의 기술은 Flutter로 개발된 아주 간단한 프로젝트를 배포하는 과정을 담고 있으므로 생략된 부분이 많을 수 있습니다.
1) 개인 개발자 계정에 팀원 초대
⇒ "https://appstoreconnect.apple.com/" 경로에서 "사용자 및 액세스"를 통해 접근하고, "+”를 클릭하여 새로운 사용자를 추가할 수 있습니다.
★ 2) CertificateSigningRequest 생성
⇒ Profiles 등록에 필요한 인증서를 macOS 내부 "키체인 접근" 앱을 통해 생성할 수 있습니다.
"키체인 접근" 메뉴 → 인증서 지원 → 인증 기관에서 인증서 요청 경로를 통해 진행할 수 있습니다. 이때, "디스크에 저장"을 클릭하여 "이메일"과 "이름"을 입력하세요. 이름의 경우, 개인이 인식할 수 있는 용도로 저장합니다.
★ 3) Apple Developer 에서 Certificates를 생성합니다.
개발용(iOS Development)와 배포용(iOS Distribution) 2개의 인증서를 생성하고, 개발 인증서의 경우 팀원에게 공유하여 사용하는 것이 일반적이라고 합니다.
만약 Flutter로 배포를 위한 진행을 하기 위해선 iOS Distribution에 대한 인증서를 생성하는 것이 합당한 행위일 것 같습니다.
★ 4) 인증서를 "키체인"에 등록
키체인 접근 앱 → 내 인증서 탭을 선택하여 다운로드 받은 인증서를 Drag and Drop 해줍니다.
★ 5) 인증서와 Xcode 연동
[ command + , ] 조합을 통해 환경 설정에 접근합니다. 이후, Account Tap을 선택하고 Apple ID를 선택하여 "Manage Certificates"를 클릭하여 Certificates를 확인하고, “Download Manual Profiles"를 클릭하면 완료됩니다.
★ 6) Apple Developer에 App 등록
"Identifiers” 탭을 선택 후, Bundle ID를 활용하여 새롭게 추가합니다.
7) 테스트 기기 등록
"Devices" 탭을 선택하여 기기를 등록할 수 있습니다. 단 간단한 Flutter 프로젝트를 실행하며 macOS 내부 Simulator로 테스트하는 경우, 바로 배포를 진행하기 때문에 진행하지 않아도 됩니다.
★ 8) Provisioning Profiles 생성
App Store Connect에 배포를 하기 위해서 사용하기 때문에, Provisioning Profiles를 생성할 때 "App Store Connect"를 선택하고 Provisioning Profiles Name을 자유롭게 입력하세요.
만약 Xcode에서 개발을 진행한다면, 위에서 진행할 때 개발용/배포용을 나눠 Profiles를 생성하고 Debug/Release에 개별적으로 등록하는 것이 좋습니다.
위 모든 과정에서 macOS 내부 인증서를 사용할 때, 대부분의 경우 "Xcode later 11"이라 표기된 인증서를 사용하라고 이야기 하고 있습니다. 내부 규약에 어떤 차이가 존재하는지 설명드릴 수 없는 점 죄송합니다.
★ 9) Xcode에 Profile 등록
생성한 Profile을 Xcode에 수동으로 등록합니다. Xcode의 AppIcon이 표기된 Runner에서 다양한 정보를 설정할 수 있는데, Signing & Capabilities 탭에서 Automatically manage signing을 해제 후 생성했던 Provisioning Profile을 선택합니다.
★ 10) VsCode에서 IPA Build
하위 작성될 App Bundle 생성 시 사용되는 메소드 "flutter build ipa"를 입력하고 대기합니다.
이후 오류 없이 모든 과정이 완료되면 "exportArchive" 오류를 반환하는데, 함께 제공되는 "open {path}" 구문을 실행하여 Xcode에서 Distribution을 완료하면 App Store Connect에 버전이 정상적으로 올라가게 됩니다.
🍒 빌드 설정 탭의 배포 섹션에서 iOS Development Target
⇒ 앱이 지원하는 최소 iOS 버전을 의미합니다. Flutter는 iOS 12이상을 지원합니다.
🐇 앱 배포 버전 업데이트
Xcode 프로젝트에서 Deployment Target을 변경한 경우, "ios/Fklutter/AppframeworkInfo.plist에 접근하여 "MinimumOSVersion" 값이 Flutter 앱과 일치하도록 설정하세요.
🐇 앱 아이콘 추가
새로운 Flutter 앱이 생성되면 아이콘 세트가 생성됩니다. 아이콘 세트는 "ios" → "Runner" → "Assets.xcassets"를 변경하여 설정할 수 있습니다.
이후, 새롭게 Flutter 앱을 시작하면서 변경된 내용을 확인할 수 있습니다.
🐇 시작 이미지 추가
앱 아이콘과 마찬가지로, 시작 이미지를 변경할 수 있습니다. 변경된 사항은 Hot Restart를 통해 확인할 수 있습니다.
🐇 Build archive 생성 및 App Store Connect에 업로드
App Store 또는 TestFlight에서 사용자에게 앱을 출시할 준비가 되었을 때, 릴리즈 빌드를 준비해야 합니다.
🐇 앱 빌드 및 버전 번호 업데이트
Flutter는 pubspec.yaml 파일에서 버전 번호를 업데이트 할 수 있습니다. 다음과 같이 버전, 빌드번호를 재 정의하여 ipa파일을 빌드할 수도 있습니다. 보다 다양한 방법이 있으나, pubspec.yaml을 통해 공통으로 관리하는 것을 추천합니다.
flutter build ipa --build-name--build-number
🐇 앱 번들 만들기
프로젝트 드렉토리에서 다음 명령어를 통해 앱 번들을 만들 수 있습니다.
flutter build ipa
그러면 다음 경로에 빌드 아카이브(파일)이 생성됩니다.
..xcarchivebuild/ios/archive/.ipabuild/ios/ipa
이때, Dart 코드를 난독화하여 리버스 엔지니어링을 더 어렵게 만드는 "--obfuscate" 와 "--split-debug-info"를 추가하는 것이 좋습니다.
즉 완벽한 방법으로는 다음과 같이 진행할 수 있습니다. 두 방법은 항상 같이 진행되어야 합니다.
flutter build ipa --obfuscate --split-debug-info
App Store에 배포하지 않는 경우 선택적으로 내보내기 방법을 다음과 같이 진행할 수도 있으나, 대게의 경우 App Store에 배포하기 위해 앱 번들을 만들기 때문에 해당되지 않을 겁니다.
--export-method ad-hoc
--export-method development
--export-method enterprise
만약 후위 export-method를 사용할 수 없는 Flutter 버전에서는, "build/ios/archive/MyApp.xcarchive"아래에 지침을 열어서 Xcode에서 앱을 검증하고 배포하길 바랍니다.
Xcode에서 Signing & Certificate에서 수동으로 Profile을 설정해 놓은 경우, VsCode에서 빌드 완료 시 다음과 같은 에러가 뜰 수 있다.
Encountered error while creating the IPA:
error: exportArchive: "Runner.app" requires a provisioning profile.
Try distributing the app in Xcode: {path}
Runner.app 자체가 Provisioning profile을 필요로하므로, Xcode위에서 한번 더 앱을 배포 해주라는 이야기다.
'개발 > Flutter' 카테고리의 다른 글
[Flutter] (Project) MapleSpy: 45. App Store 출시 준비 (0) | 2024.04.11 |
---|---|
[Flutter] (Project) MapleSpy: 44. App Store 개발자 계정 만들기(개인) (0) | 2024.04.11 |
[Flutter] (Project) MapleSpy: 43. macOS 프로젝트 App Icon 설정 (0) | 2024.04.11 |
[Flutter] (Project) MapleSpy: 42. macOS 프로젝트 실행 with iOS Simulator (0) | 2024.04.11 |
[Flutter] (Project) MapleSpy: 41. macOS 환경 설정 with Flutter (0) | 2024.04.11 |