iOS에서 health 패키지를 사용하려면 패키지 설치만으로는 부족하며,
Apple 보안 정책상 아래 3가지 필수 조건을 모두 충족해야 한다.
이 중 하나라도 누락되면 앱이 실행 중 강제 종료되거나 권한 요청이 실패한다.
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
iOS는 사용자에게 보여줄 권한 요청 이유가 없으면
HealthKit 접근 시 앱을 즉시 종료한다.
<key>NSHealthShareUsageDescription</key>
<string>오늘의 걸음 수를 확인하고 펫의 성장을 체크하기 위해 건강 데이터 읽기 권한이 필요합니다.</string>
<key>NSHealthUpdateUsageDescription</key>
<string>오늘의 걸음 수를 확인하고 펫의 성장을 체크하기 위해 건강 데이터 쓰기 권한이 필요합니다.</string>
앱이 시스템 차원에서 HealthKit 사용 자격을 가졌음을 증명하기 위한 설정 파일.
📄 ios/Runner/Runner.entitlements
<dict>
<key>com.apple.developer.healthkit</key>
<true/>
<key>com.apple.developer.healthkit.background-delivery</key>
<true/>
</dict>
Xcode 빌드 과정에서 entitlements 파일이 적용되도록 설정 추가
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
가장 안전한 방법은 Xcode에서 직접 확인
ios/Runner.xcworkspace 열기
Signing & Capabilities → HealthKit 추가 여부 확인
requestPermission() 호출 시
👉 권한 팝업이 뜨지 않고 즉시 false 반환
내부적으로 권한 거부 처리 → 스낵바만 표시됨
| 원인 | 설명 |
|---|---|
| 최신 정책 | Android 14부터 건강 데이터는 registerForActivityResult 기반 권한 요청 필수 |
| Flutter 기본 구조 | 기본 FlutterActivity는 최신 권한 런처 미지원 |
| 생명주기 문제 | 권한 런처가 Activity 초기 단계에 붙지 못함 |
👉 Flutter 기본 Activity 구조 자체가 최신 Health Connect 권한 시스템과 호환되지 않음
FlutterActivity → FlutterFragmentActivity 교체
AndroidManifest에 Health Connect 권한/정책 명시
Dart main() 단계에서 Health 패키지 선 초기화
import io.flutter.embedding.android.FlutterFragmentActivity
class MainActivity : FlutterFragmentActivity()
👉 최신 권한 런처(ActivityResultLauncher) 지원
<!-- 걸음 센서 -->
<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>
void main() {
WidgetsFlutterBinding.ensureInitialized();
Health().configure();
runApp(MyApp());
}
👉 권한 런처를 앱 렌더링 전에 선장착
⚠️ 안드로이드 에뮬레이터
에뮬레이터는 실제 걸음 수 데이터 없음
반드시 실기기 테스트 필요
⚠️ Google Play 심사 대비
데이터 보안 섹션에 명시 필요:
걸음 수 수집
외부 서버 전송 없음
펫 성장(게임 기능) 목적 한정 사용