Sign In With Apple Testflight Entitlement Errors

Sign In with Apple 추가 후 TestFlight 빌드 에러 2연타 해결

Flutter iOS 앱에 Sign In with Apple을 추가하면서 TestFlight 빌드까지 두 가지 에러를 연달아 만났다. 각각 원인이 달라서 정리해둔다. 배경 Sign In with Apple을 활성화하려면 코드만 짜면 되는 게 아니다. Apple Developer Portal에서 App ID에 capability를 추가하고, 프로비저닝 프로파일을 반드시 재생성해야 한다. 기존 프로파일은 Sign In with Apple entitlement를 포함하지 않으므로 그냥 빌드하면 실패한다. 순서대로 하면: developer.apple.com → Identifiers → App ID 선택 Sign In with Apple 체크 → Edit → “Enable as a primary App ID” 선택 → Save Profiles → 기존 App Store 프로파일 Edit → Generate → Download 다운받은 .mobileprovision 파일을 ~/Library/MobileDevice/Provisioning Profiles/ 에 복사 여기까지 하면 준비 완료처럼 보이는데, 막상 flutter build ipa 를 돌리면 에러가 나온다. ...

2025-09-10 · 2분 소요 · Seunghan
Rails Aasa Routing Proc Lambda Git

Rails AASA 라우팅 3가지 함정: proc vs lambda, 경로 누락, git 미추적

iOS 유니버설 링크(Universal Links)를 설정하려면 /.well-known/apple-app-site-association 경로에서 JSON을 반환해야 한다. Rails에서 이걸 라우팅할 때 흔히 빠지는 함정 3가지를 정리한다. 에러 ActionController::RoutingError (No route matches [GET] "/.well-known/apple-app-site-association"): ActionController::RoutingError (No route matches [GET] "/apple-app-site-association"): 배포 서버 로그에서 이 에러가 반복되고, iOS 앱에서 유니버설 링크가 동작하지 않는다. 함정 1: proc을 Rack 앱으로 사용 Rails routes에서 inline으로 파일을 반환하려고 proc을 쓰는 경우가 있다. # 동작하지 않는 코드 get "/.well-known/apple-app-site-association", to: proc { file = Rails.root.join("public/.well-known/apple-app-site-association") [200, { "Content-Type" => "application/json" }, [File.read(file)]] } Rails 라우팅에서 to: 옵션에 Rack 앱을 직접 넣을 때는 env 인자를 받는 callable이어야 한다. proc { } 블록은 인자 없이 정의되어 있어서 Rack 인터페이스를 만족하지 못한다. ...

2025-09-03 · 2분 소요 · Seunghan
Ios Sso Entitlements Testflight Errors

iOS TestFlight 배포 삽질 모음: SSO 에러부터 entitlements mismatch까지

Flutter 앱 여러 개를 TestFlight에 올리면서 반복적으로 마주친 에러들을 정리했다. 1. Apple Sign-In 에러 1000 SignInWithAppleAuthorizationException(AuthorizationErrorCode.unknown, The operation couldn't be completed. (com.apple.AuthenticationServices.AuthorizationError error 1000.)) 원인 Runner.entitlements에 Sign in with Apple capability가 없어서 발생한다. 해결 두 곳 모두 설정해야 한다. ① ios/Runner/Runner.entitlements <key>com.apple.developer.applesignin</key> <array> <string>Default</string> </array> ② Apple Developer Console developer.apple.com → Identifiers → 앱 Bundle ID 선택 → Sign in with Apple 체크 → Save 프로비저닝 프로파일이 이미 있다면 재생성이 필요하다. ...

2025-08-30 · 4분 소요 · Seunghan
Ios Itms 90683 Permission Strings

App Store Connect ITMS-90683: Info.plist 권한 purpose string 누락 오류 해결

TestFlight에 IPA를 업로드하고 몇 분 후 App Store Connect에서 메일이 온다. ITMS-90683: Missing purpose string in Info.plist The app's Info.plist file is missing a required purpose string for one or more of the following API categories: NSPhotoLibraryUsageDescription 업로드 자체는 성공했지만 앱 배포 전 Apple이 자동으로 검사해서 이 메일을 보낸다. 수정하지 않으면 App Store 심사 제출 시 거절된다. 왜 이 오류가 발생하는가 iOS는 카메라, 사진 라이브러리, 마이크 등 민감한 API에 접근할 때 사용자에게 권한 팝업을 보여준다. 이 팝업에 표시되는 설명 문구가 Info.plist에 없으면 Apple이 오류로 처리한다. ...

2025-08-27 · 3분 소요 · Seunghan
Ios Gidclientid Info Plist Missing

Flutter iOS Google Sign-In: GIDClientID가 Info.plist에 없을 때

Flutter iOS 앱에서 Google Sign-In을 구현할 때 Firebase를 쓰지 않고 Google Cloud Console에서 직접 OAuth 클라이언트 ID를 발급받는 경우가 있다. 이때 GIDClientID를 Info.plist에 명시적으로 추가하지 않으면 런타임에 에러가 발생한다. Firebase 프로젝트를 쓰는 경우 GoogleService-Info.plist가 이 역할을 자동으로 대신해주기 때문에 의식하지 못하고 지나치기 쉬운 설정이다. 이 글에서는 에러 원인과 해결 방법을 정리한다. 에러 메시지 PlatformException(google_sign_in, No active configuration. Make sure GIDClientID is set in Info.plist., null, null) 원인 google_sign_in iOS SDK는 초기화 시 Info.plist에서 GIDClientID 키를 읽는다. ...

2025-08-23 · 2분 소요 · Seunghan
Flutter Testflight Makefile Automation

Flutter TestFlight 업로드 자동화 - Makefile로 한 줄에 끝내기

Flutter iOS 앱을 TestFlight에 올리는 과정은 단계가 많다. flutter build ipa, Xcode 아카이브, altool 업로드… Makefile로 묶어두면 make testflight 한 줄로 끝난다. 최종 Makefile .PHONY: build-ipa testflight clean EXPORT_OPTIONS = ios/ExportOptions.plist API_KEY = YOUR_API_KEY_ID API_ISSUER = YOUR_ISSUER_ID IPA_DIR = build/ios/ipa IPA_FILE = $(IPA_DIR)/Talkk.ipa # ← 앱 Display Name과 일치해야 함 build-ipa: flutter build ipa --release --export-options-plist=$(EXPORT_OPTIONS) testflight: build-ipa @echo "📦 TestFlight 업로드 중..." xcrun altool --upload-app \ --type ios \ --file "$(IPA_FILE)" \ --apiKey $(API_KEY) \ --apiIssuer $(API_ISSUER) \ --verbose @echo "✅ TestFlight 업로드 완료!" clean: flutter clean && flutter pub get ExportOptions.plist 설정 flutter build ipa는 내부적으로 Xcode 아카이브 후 IPA를 만든다. 이 과정에서 서명 방식, 팀 ID, App Store Connect API 키 등을 지정하는 파일이 필요하다. ...

2025-08-20 · 3분 소요 · Seunghan
Flutter Testflight Crash Firebase Init Missing

Flutter TestFlight 크래시 - Firebase.initializeApp() 누락

TestFlight 빌드를 올렸는데 앱을 열자마자 즉시 종료됐다. 시뮬레이터와 디버그 빌드에서는 멀쩡했다. 원인은 Firebase.initializeApp() 호출 누락이었다. 왜 디버그에서는 괜찮고 릴리즈에서만 터지나 firebase_core를 추가하면 iOS native Firebase SDK가 CocoaPods를 통해 앱 바이너리에 포함된다. 앱이 실행되면 iOS 런타임이 GoogleService-Info.plist를 감지하고 native SDK 내부 초기화를 시작한다. Flutter Dart 레이어에서 Firebase.initializeApp()을 호출하지 않으면 native SDK ↔ Dart 브리지 사이의 동기화가 깨진다. 디버그 빌드에서는 실행 속도가 느리고 타이밍 여유가 있어 어물쩍 넘어가는 경우가 있지만, 릴리즈 빌드는 AOT 컴파일로 실행 속도가 빨라지면서 타이밍 차이가 드러나 크래시로 이어진다. ...

2025-08-16 · 2분 소요 · Seunghan
Flutter Testflight Build Number Mismatch

Flutter TestFlight 빌드 번호 불일치: pubspec.yaml +9인데 TestFlight에서 빌드 11로 표시되는 이유

Flutter iOS 앱을 TestFlight에 업로드했을 때 pubspec.yaml에 설정한 빌드 번호와 TestFlight에 표시되는 빌드 번호가 다른 경우가 있다. 예를 들어 version: 1.0.1+9로 설정했는데 TestFlight에서는 빌드 11로 표시된다. 왜 빌드 번호가 달라지는가 Flutter의 빌드 번호 흐름: pubspec.yaml version: 1.0.1+9 ↓ flutter build ios --no-codesign ↓ CFBundleVersion = 9 (Runner.app) ↓ xcodebuild archive -allowProvisioningUpdates ↓ Xcode 자동 서명 과정에서 App Store Connect 최신 빌드 번호 조회 ↓ 최신 빌드가 10이면 → CFBundleVersion을 11로 덮어씀 ↓ TestFlight에는 빌드 11로 업로드됨 xcodebuild에 -allowProvisioningUpdates 옵션을 주면 Xcode가 App Store Connect API를 통해 자동 서명을 처리하는데, 이 과정에서 이미 업로드된 빌드 번호와 충돌을 피하기 위해 CFBundleVersion을 자동으로 증가시킨다. ...

2025-08-13 · 2분 소요 · Seunghan
Flutter Singleton Plugin Eager Init Crash

Flutter 싱글톤에서 iOS 플러그인 인스턴스를 즉시 생성하면 크래시가 난다

iOS 네이티브 플러그인을 사용하는 Flutter 앱에서 싱글톤 패턴을 쓸 때 흔히 저지르는 실수가 있다. 플러그인 인스턴스를 클래스 필드에서 즉시 생성하는 것이다. 문제가 되는 패턴 class CloudSyncService { CloudSyncService._(); static final CloudSyncService instance = CloudSyncService._(); // ❌ 클래스 필드에서 즉시 생성 final _iCloudSync = IcloudStorageSync(); } static final instance = CloudSyncService._() 는 Dart에서 클래스가 처음 참조되는 시점에 실행된다. main.dart 상단에 import만 해도 static field initializer가 돌 수 있다. 이 시점은 WidgetsFlutterBinding.ensureInitialized() 이전일 수 있고, Flutter 엔진의 플러그인 채널 등록이 완료되기 전이다. 이 상태에서 IcloudStorageSync() 같은 네이티브 플러그인 인스턴스를 생성하면 플랫폼 채널을 찾지 못해 크래시가 발생한다. ...

2025-08-10 · 2분 소요 · Seunghan
Flutter Ios Workmanager Crash Bgtaskscheduler

Flutter iOS 크래시: workmanager의 BGTaskScheduler NSException이 Dart try-catch에 잡히지 않는 문제

Flutter 앱을 TestFlight에 올렸는데 앱 실행 즉시 크래시가 발생하는 경우가 있다. 코드에 try-catch를 감싸뒀는데도 크래시가 잡히지 않는다면 workmanager 패키지의 iOS BGTaskScheduler 문제일 가능성이 높다. 증상 앱을 켜자마자 즉시 크래시 (스플래시도 안 뜸) 시뮬레이터/실기기 모두 동일 try-catch로 감쌌는데도 앱이 죽음 로컬 debug 빌드에서는 정상 동작하다가 release 빌드에서만 크래시 크래시 로그 분석 macOS 크래시 리포트는 ~/Library/Logs/DiagnosticReports/에 .ips 파일로 저장된다. ls ~/Library/Logs/DiagnosticReports/ | grep Runner # Runner-2026-02-25-190740.ips .ips 파일을 파싱하면 스택 트레이스를 확인할 수 있다. ...

2025-08-06 · 2분 소요 · Seunghan
개인정보처리방침 문의