π λͺ©μ°¨
λ°°κ²½ μλΉμ€λ 무μμΈκ°
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: μ±μ΄ λ°±κ·ΈλΌμ΄λμ μμ΄λ νμ μμΉμ μ κ·Όν μ μμ΅λλ€