배경 서비스란 무엇인가
Flutter 개발을 하면서 앱이 백그라운드에서도 특정 작업을 계속 수행해야 할 경우가 있습니다. 예를 들어, GPS 위치 정보를 수집하거나, 푸시 알림을 받거나, 데이터를 동기화하는 등의 작업들이 그렇습니다.
이런 상황에서 사용하는 것이 flutter_background_service 패키지입니다. 이 패키지를 통해 앱이 포그라운드에 있지 않아도 백그라운드에서 안정적으로 작업을 수행할 수 있습니다.
💡 알아두기: 백그라운드 서비스는 단순히 코드만 작성해서는 작동하지 않습니다. 운영체제 차원에서의 권한 설정이 필수적입니다.
왜 권한 설정이 중요한가
스마트폰 사용자들의 프라이버시 보호를 위해 안드로이드와 iOS 모두 엄격한 권한 관리 시스템을 운영하고 있습니다. 앱이 백그라운드에서 실행되려면 사용자의 동의 하에 필요한 권한들을 미리 획득해야 합니다.
권한 없이 백그라운드 작업을 시도하면:
- 앱이 중단되거나 강제 종료될 수 있습니다
- 기기 성능이 저하될 수 있습니다
- 배터리를 과도하게 소비할 수 있습니다
- 사용자에게 신뢰를 잃을 수 있습니다
- 앱 스토어에 등록할 때 심사 불통과될 수 있습니다
⚠️ 중요: 특히 Google Play나 App Store에 앱을 배포할 계획이라면, 요구되는 권한들에 대해 명확한 사유를 설명해야 합니다. 그렇지 않으면 심사 거부를 당할 수 있습니다.
안드로이드 권한 설정 완벽 정리
필요한 주요 권한들
안드로이드에서 백그라운드 서비스를 구현할 때는 여러 권한이 필요합니다. 각각의 역할을 이해하고 적절히 설정해야 합니다.
FOREGROUND_SERVICE 권한
FOREGROUND_SERVICE는 백그라운드 서비스를 포그라운드 모드로 실행할 때 필수 권한입니다. 포그라운드 서비스는 사용자가 인지할 수 있도록 항상 알림을 표시합니다. 이는 배터리 소비를 줄이고 시스템이 앱을 종료하지 않도록 보호해줍니다.
AndroidManifest.xml 파일에 다음을 추가해야 합니다:
또한 service 태그에도 foregroundServiceType을 명시해줘야 합니다. 앱의 목적에 따라 다양한 타입이 있습니다:
- location: 위치 정보를 지속적으로 수집하는 경우
- health: 건강 관련 데이터를 수집하는 경우
- media_playback: 음악이나 비디오 재생
- data_sync: 데이터 동기화
ACCESS_BACKGROUND_LOCATION 권한
백그라운드에서 GPS 위치 정보를 수집해야 한다면 ACCESS_BACKGROUND_LOCATION 권한이 필요합니다. 이는 매우 민감한 권한이므로 주의가 필요합니다.
⚠️ 주의: ACCESS_BACKGROUND_LOCATION 권한을 사용하려면 Google Play에 앱을 등록할 때 권한이 필요한 정당한 사유를 제출해야 합니다. 명확한 이유 없이 사용하면 심사 불통과될 가능성이 높습니다.
많은 개발자들이 이 권한 때문에 어려움을 겪고 있습니다. 대신 포그라운드 서비스와 제한된 백그라운드 작업을 조합해서 문제를 해결하는 방법도 있습니다.
POST_NOTIFICATIONS 권한
Android 13(API 레벨 33) 이상에서는 알림을 표시하기 위해 POST_NOTIFICATIONS 권한이 필수입니다.
이 권한이 없으면 백그라운드 서비스의 알림이 표시되지 않을 수 있습니다.
AndroidManifest.xml 전체 예시
실제로 필요한 권한들을 AndroidManifest.xml에 정의하는 방식은 다음과 같습니다:
<uses-permission android:name=”android.permission.FOREGROUND_SERVICE” />
<uses-permission android:name=”android.permission.POST_NOTIFICATIONS” />
<uses-permission android:name=”android.permission.ACCESS_BACKGROUND_LOCATION” />
<application>
…
<service
android:name=”id.flutter.flutter_background_service.BackgroundService”
android:foregroundServiceType=”location” />
</application>
</manifest>
런타임 권한 요청
AndroidManifest.xml에 권한을 선언하는 것만으로는 부족합니다. Android 6.0 이상에서는 런타임에 사용자에게 권한을 명시적으로 요청해야 합니다.
백그라운드 서비스를 시작하기 전에, 서비스가 필요로 하는 권한들이 이미 부여되어 있는지 확인해야 합니다. 만약 권한이 없다면 사용자에게 권한을 요청하는 대화상자를 띄워야 합니다.
💡 팁: Flutter의 permission_handler 패키지를 사용하면 권한 요청 프로세스를 쉽게 관리할 수 있습니다.
iOS 권한 설정 완벽 정리
iOS의 특수한 환경
iOS는 안드로이드보다 훨씬 더 엄격한 백그라운드 작업 정책을 가지고 있습니다. iOS에서 백그라운드 작업은 매우 제한적이며, 시스템에서 허용하는 특정 상황에서만 실행됩니다.
iOS에서는 포그라운드 서비스라는 개념이 없습니다. 대신 Xcode에서 설정해야 할 여러 항목들이 있습니다.
Info.plist 설정
iOS에서 백그라운드 작업을 수행하려면 Info.plist 파일에 필요한 권한들을 명시해야 합니다. 특히 위치 정보를 사용하는 경우 반드시 설정해야 합니다.
위치 정보 접근 권한은 두 가지로 나뉩니다:
- NSLocationWhenInUseUsageDescription: 앱 사용 중일 때만 위치에 접근할 수 있습니다
- NSLocationAlwaysAndWhenInUseUsageDescription: 앱이 백그라운드에 있어도 항상 위치에 접근할 수 있습니다