Flutter Dart Define Api Url Testflight

Flutter TestFlight 빌드에서 API URL이 localhost로 고정되는 문제

Flutter 앱을 TestFlight에 올렸는데 실기기에서 모든 API 요청이 실패하는 경우, --dart-define으로 API URL이 주입되지 않아서 앱이 localhost로 요청을 보내고 있는 게 원인일 수 있다. 증상 시뮬레이터에서는 정상 동작 (로컬 서버에 연결되니까) TestFlight 빌드(실기기)에서는 로그인, API 호출 모두 실패 서버 로그에 해당 요청이 아예 안 찍힘 → 클라이언트가 서버에 요청 자체를 안 하고 있음 원인 Flutter에서 환경별 API URL을 --dart-define으로 주입받는 패턴을 쓰는 경우, 빌드 명령에 이 인자를 빠뜨리면 코드 내 기본값이 사용된다. ...

2025-07-13 · 2분 소요 · Seunghan
Flutter Clean Architecture Multi Feature

Flutter Clean Architecture 실전 - Feature 여러 개 한 번에 추가하기

Flutter 앱에 기능을 한 번에 여러 개 추가할 때 가장 먼저 고민되는 건 폴더 구조다. 기능 하나하나는 단순해 보여도, 여러 개가 동시에 들어오면 금방 엉킨다. Feature별 폴더 구조 Clean Architecture를 기반으로 각 Feature를 아래 구조로 만든다. lib/features/{feature_name}/ ├── data/ │ ├── datasources/ # API 호출 │ └── repositories/ # 인터페이스 구현체 ├── domain/ │ ├── entities/ # 순수 데이터 모델 │ └── repositories/ # 인터페이스 정의 └── presentation/ ├── bloc/ # BLoC (이벤트/상태) └── pages/ # UI 이걸 따르면 기능이 몇 개가 늘어도 구조는 동일하다. 새 기능 추가 = 폴더 복사 + 내용 채우기 수준이 된다. ...

2025-07-09 · 3분 소요 · Seunghan
Flutter Bloc Complex State Management

Flutter BLoC - Q&A 세션처럼 상태가 복잡할 때 설계하기

목록을 불러오고 보여주는 수준의 BLoC는 어렵지 않다. 문제는 세션 기반의 흐름, 예를 들어 “세션을 만들고 → 질문을 추가하고 → 답변을 받고 → 완료” 같은 단계적 워크플로우를 BLoC 하나로 관리할 때다. 상태를 먼저 그려라 BLoC를 코딩하기 전에 상태부터 정의하는 게 순서다. 이 워크플로우에서 UI가 보여줘야 하는 상태를 나열하면: 초기 (아무것도 없음) 세션 목록 로딩 중 세션 목록 표시 새 세션 생성 중 세션 상세 로딩 중 세션 상세 표시 (질문 목록 포함) 질문 추가 중 답변 입력 중 오류 abstract class ReviewQaState {} class ReviewQaInitial extends ReviewQaState {} class ReviewQaLoading extends ReviewQaState {} class ReviewQaSessionListLoaded extends ReviewQaState { final List<QaSession> sessions; ReviewQaSessionListLoaded(this.sessions); } class ReviewQaSessionLoaded extends ReviewQaState { final QaSession session; final List<ReviewQuestion> questions; ReviewQaSessionLoaded({required this.session, required this.questions}); } class ReviewQaQuestionAdded extends ReviewQaState { final ReviewQuestion question; ReviewQaQuestionAdded(this.question); } class ReviewQaError extends ReviewQaState { final String message; ReviewQaError(this.message); } 상태 클래스를 이렇게 구체적으로 나눠야 UI에서 if (state is ReviewQaSessionLoaded) 처럼 명확하게 분기할 수 있다. ...

2025-07-06 · 3분 소요 · Seunghan
Firebase Phone Auth Not Working Diagnosis

Flutter Firebase Phone Auth - SMS가 안 와요? 진단부터 코드 수정까지

Flutter 앱에 전화번호 인증을 붙이고 나서 “인증번호가 안 와요"라는 상황을 마주쳤다. 그리고 개발용 bypass 버튼을 눌러서 인증을 건너뛰고 회원가입을 시도하면 서버에서 “인증이 완료되지 않은 전화번호입니다"가 떴다. 두 문제를 같이 정리한다. 구조부터 파악 Flutter Firebase Phone Auth의 흐름은 이렇다. Flutter → FirebaseAuth.verifyPhoneNumber() → Firebase가 SMS 직접 발송 ↓ 사용자가 코드 입력 ↓ Flutter → Firebase로 코드 검증 → ID Token 획득 ↓ Flutter → 백엔드로 firebase_token 전송 → 서버가 토큰 검증 → PhoneVerification 레코드 생성 ↓ Flutter → 회원가입 요청 → 서버가 PhoneVerification 확인 후 유저 생성 핵심은 SMS 발송 자체를 Firebase가 담당한다는 점이다. Rails나 다른 백엔드에서 Twilio 등을 호출하는 구조가 아니다. ...

2025-07-02 · 3분 소요 · Seunghan
Ios Codesign Testflight Full Setup

iOS 배포 인증서 전체 세팅: Distribution Cert → APNs → Provisioning Profile → TestFlight

Flutter 앱을 TestFlight에 올리는 과정에서 코드 서명 관련 설정을 처음부터 다시 잡으면서 정리한 내용이다. Xcode 자동 서명이 아닌 수동 + App Store Connect API Key 방식으로 진행했다. 전체 흐름 [1] Distribution Certificate 발급 [2] APNs Certificate 발급 (CSR 생성 필요) [3] App ID에 Push Notifications 활성화 [4] Provisioning Profile 생성 (App Store, Push 포함) [5] xcodebuild archive + export (API Key 인증) [6] xcrun altool로 TestFlight 업로드 1. Distribution Certificate Apple Developer → Certificates → + → Apple Distribution 선택. ...

2025-06-18 · 4분 소요 · Seunghan
Google Oauth Keeps

Flutter 앱 Google OAuth 동의 화면 인증 셋업 정리

Flutter 앱에 Google 로그인을 붙이면서 OAuth 동의 화면 인증까지 진행한 과정을 정리한다. Firebase 없이 Google Cloud Console에서 직접 OAuth 클라이언트 ID를 발급받아 연동하는 경우, 동의 화면 설정과 인증 제출 과정에서 예상치 못한 에러가 자주 발생한다. 실제로 겪은 삽질 위주로 기록한다. 전체 흐름 요약 Google Cloud Console에서 OAuth 2.0 클라이언트 ID 생성 (iOS 타입) 동의 화면 브랜딩 설정 앱 도메인 및 개인정보처리방침 URL 등록 필요한 범위(scope) 설정 인증 제출 및 프로덕션 전환 브랜딩 설정 Google Cloud Console → API 및 서비스 → OAuth 동의 화면 → 브랜딩 에서 아래 항목을 입력한다. ...

2025-06-11 · 3분 소요 · Seunghan
Flutter Testflight Push Notifications Entitlement

Flutter TestFlight 빌드 오류: Push Notifications 엔트리포인트 문제

Flutter 앱을 TestFlight에 처음 올려보면서 겪은 빌드 오류와 해결 과정을 정리한다. 오류 상황 flutter build ipa --release 후 xcrun altool로 업로드를 시도하자 업로드 자체가 아니라 빌드 단계에서 Xcode 아카이브가 실패했다. error: Provisioning profile "iOS Team Provisioning Profile: *" doesn't include the aps-environment entitlement. 업로드 커맨드: xcrun altool --upload-app \ --type ios \ --file "build/ios/ipa/app.ipa" \ --username "$APPLE_ID" \ --password "$APPLE_APP_PASSWORD" 원인 ios/Runner/Runner.entitlements 파일에 아래 항목이 들어가 있었다. <key>aps-environment</key> <string>production</string> 이 키는 Push Notifications 기능을 활성화한 Provisioning Profile에서만 허용된다. Wildcard(*) 프로비저닝 프로파일은 Push Notifications을 지원하지 않기 때문에 아카이브 시점에 충돌이 발생한다. ...

2025-06-08 · 2분 소요 · Seunghan
Flutter Google Signin Ios Setup

Flutter Google Sign-In iOS 설정: GoogleService-Info.plist CLIENT_ID 누락 문제

Flutter 앱에서 google_sign_in 패키지로 Google 로그인을 구현했는데 iOS에서만 동작하지 않는 경우, GoogleService-Info.plist에 CLIENT_ID가 없는 게 원인인 경우가 많다. 문제 Android에서는 Google 로그인이 잘 되는데 iOS에서는 로그인 창이 뜨지 않거나 에러가 발생한다. Firebase 콘솔에서 iOS 앱을 등록하고 GoogleService-Info.plist를 다운로드해서 프로젝트에 추가했지만, 기본 다운로드 파일에는 CLIENT_ID가 포함되지 않는 경우가 있다. GoogleService-Info.plist에 CLIENT_ID 추가 1. iOS OAuth 클라이언트 확인 Google Cloud Console → API 및 서비스 → 사용자 인증 정보로 이동한다. Firebase 프로젝트를 생성하면 자동으로 iOS용 OAuth 클라이언트가 생성되어 있다. 클라이언트 ID 형식은 아래와 같다. ...

2025-06-04 · 2분 소요 · Seunghan
Dart Api Integration

DART Open API 연동 삽질기 (Rails + Flutter)

DART Open API를 Rails 백엔드에 연동하면서 겪은 과정을 정리한다. 공시 모니터링, 감사의견, 지배구조, 재무지표, 지분공시 5개 영역을 구현했고 각 단계마다 삽질이 있었다. 구현 구조 각 데이터 유형마다 모델과 ActiveJob을 하나씩 만들었다. Job은 DART API를 호출해서 upsert_all로 DB에 넣는 단순한 구조다. DartCorpCodeSyncJob → dart_companies (기업 마스터) DartDisclosureSyncJob → dart_disclosures (공시 목록) DartMajorEventSyncJob → dart_major_events (상장폐지 트리거 이벤트 — DS001) DartAuditOpinionSyncJob → dart_audit_opinions (감사의견 — DS002/DS003) DartGovernanceSyncJob → dart_executives / dart_major_shareholders (DS004/DS005) DartFinancialIndexSyncJob → dart_financial_indexes (fnlttSinglAcntAll) DartEquityReportSyncJob → dart_equity_reports (지분공시) 삽질 1: upsert_all + update_only + updated_at 중복 가장 먼저 터진 오류. ...

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