[TIL] Day 63 Flutter 만보기(Health) 기능 iOS / Android 설정 정리

현서·2026년 2월 25일

[TIL] Flutter 9기

목록 보기
75/102

Flutter 만보기 기능 설정 정리

iOS – HealthKit 만보기 설정

문제 원인 요약

iOS에서 health 패키지를 사용하려면 패키지 설치만으로는 부족하며,
Apple 보안 정책상 아래 3가지 필수 조건을 모두 충족해야 한다.

  • 최소 iOS 배포 버전: iOS 14.0 이상
  • 권한 요청 설명 문구(Usage Description) 제공
  • HealthKit 접근 자격(Capability / Entitlements) 활성화

이 중 하나라도 누락되면 앱이 실행 중 강제 종료되거나 권한 요청이 실패한다.

1. iOS 최소 배포 버전 상향 (Podfile)

health 패키지 요구사항에 맞춰 iOS 배포 타겟을 14.0으로 상향하고,
모든 Pod 타겟에도 강제로 동일 버전을 적용했다.

platform :ios, '14.0'

post_install do |installer|
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)
    target.build_configurations.each do |config|
      config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '14.0'
    end
  end
end

2. 권한 요청 설명 문구 추가 (Info.plist)

iOS는 사용자에게 보여줄 권한 요청 이유가 없으면
HealthKit 접근 시 앱을 즉시 종료한다.

<key>NSHealthShareUsageDescription</key>
<string>오늘의 걸음 수를 확인하고 펫의 성장을 체크하기 위해 건강 데이터 읽기 권한이 필요합니다.</string>

<key>NSHealthUpdateUsageDescription</key>
<string>오늘의 걸음 수를 확인하고 펫의 성장을 체크하기 위해 건강 데이터 쓰기 권한이 필요합니다.</string>

3. HealthKit Entitlements 파일 생성

앱이 시스템 차원에서 HealthKit 사용 자격을 가졌음을 증명하기 위한 설정 파일.

📄 ios/Runner/Runner.entitlements

<dict>
  <key>com.apple.developer.healthkit</key>
  <true/>
  <key>com.apple.developer.healthkit.background-delivery</key>
  <true/>
</dict>

4. 빌드 설정에 Entitlements 연결

Xcode 빌드 과정에서 entitlements 파일이 적용되도록 설정 추가

CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;

iOS 주의사항

가장 안전한 방법은 Xcode에서 직접 확인
ios/Runner.xcworkspace 열기
Signing & Capabilities → HealthKit 추가 여부 확인


Android – Health Connect 만보기 문제 해결

문제 현상

requestPermission() 호출 시
👉 권한 팝업이 뜨지 않고 즉시 false 반환
내부적으로 권한 거부 처리 → 스낵바만 표시됨

근본 원인 분석

원인설명
최신 정책Android 14부터 건강 데이터는 registerForActivityResult 기반 권한 요청 필수
Flutter 기본 구조기본 FlutterActivity는 최신 권한 런처 미지원
생명주기 문제권한 런처가 Activity 초기 단계에 붙지 못함

👉 Flutter 기본 Activity 구조 자체가 최신 Health Connect 권한 시스템과 호환되지 않음

해결 전략 요약

FlutterActivity → FlutterFragmentActivity 교체
AndroidManifest에 Health Connect 권한/정책 명시
Dart main() 단계에서 Health 패키지 선 초기화

핵심 코드 변경

1. MainActivity.kt

import io.flutter.embedding.android.FlutterFragmentActivity

class MainActivity : FlutterFragmentActivity()

👉 최신 권한 런처(ActivityResultLauncher) 지원

2. AndroidManifest.xml

<!-- 걸음 센서 -->
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"/>

<!-- Health Connect -->
<uses-permission android:name="android.permission.health.READ_STEPS"/>
<uses-permission android:name="android.permission.health.READ_ACTIVE_CALORIES_BURNED"/>

<!-- Health Connect 앱 인식 -->
<queries>
  <intent>
    <action android:name="androidx.health.ACTION_SHOW_PERMISSIONS_RATIONALE" />
  </intent>
</queries>

3. main.dart – 초기화 타이밍 수정

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  Health().configure();
  runApp(MyApp());
}

👉 권한 런처를 앱 렌더링 전에 선장착

테스트 & 배포 시 주의사항

⚠️ 안드로이드 에뮬레이터
에뮬레이터는 실제 걸음 수 데이터 없음
반드시 실기기 테스트 필요

⚠️ Google Play 심사 대비
데이터 보안 섹션에 명시 필요:
걸음 수 수집
외부 서버 전송 없음
펫 성장(게임 기능) 목적 한정 사용

0개의 댓글