diff --git a/android/app/build.gradle b/android/app/build.gradle index 9ddb210e2..ef6e97706 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -143,12 +143,12 @@ android { dimension "environment" applicationId "me.tinykitten.trainlcd.dev" versionNameSuffix "-dev" - versionCode 100000270 + versionCode 100000271 versionName "10.1.2" } prod { dimension "environment" - versionCode 100000270 + versionCode 100000271 versionName "10.1.2" } } diff --git a/app.config.ts b/app.config.ts index 20886572f..043d1ff5a 100644 --- a/app.config.ts +++ b/app.config.ts @@ -43,7 +43,7 @@ export default ({ config }: ConfigContext) => ({ }, }, ios: { - buildNumber: '2483', + buildNumber: '2484', bundleIdentifier: process.env.EAS_BUILD_PROFILE === 'production' ? 'me.tinykitten.trainlcd' @@ -60,7 +60,7 @@ export default ({ config }: ConfigContext) => ({ ? 'me.tinykitten.trainlcd' : 'me.tinykitten.trainlcd.dev', permissions: [], - versionCode: 100000270, + versionCode: 100000271, }, owner: 'trainlcd', }); @@ -99,5 +99,6 @@ export default ({ config }: ConfigContext) => ({ + diff --git a/ios/TrainLCD.xcodeproj/project.pbxproj b/ios/TrainLCD.xcodeproj/project.pbxproj index 842152ace..74504f076 100644 --- a/ios/TrainLCD.xcodeproj/project.pbxproj +++ b/ios/TrainLCD.xcodeproj/project.pbxproj @@ -2435,7 +2435,7 @@ CODE_SIGN_ENTITLEMENTS = ProdTrainLCD.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2483; + CURRENT_PROJECT_VERSION = 2484; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = E6R2G33Z36; INFOPLIST_FILE = TrainLCD/Schemes/Prod/Info.plist; @@ -2474,7 +2474,7 @@ CODE_SIGN_ENTITLEMENTS = ProdTrainLCD.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2483; + CURRENT_PROJECT_VERSION = 2484; DEVELOPMENT_TEAM = E6R2G33Z36; INFOPLIST_FILE = TrainLCD/Schemes/Prod/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = TrainLCD; @@ -2533,7 +2533,7 @@ CODE_SIGN_ENTITLEMENTS = TrainLCD/trainlcd.entitlements; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 2483; + CURRENT_PROJECT_VERSION = 2484; CXX = ""; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; @@ -2639,7 +2639,7 @@ CODE_SIGN_ENTITLEMENTS = TrainLCD/trainlcd.entitlements; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = 2483; + CURRENT_PROJECT_VERSION = 2484; CXX = ""; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -2718,7 +2718,7 @@ CODE_SIGN_ENTITLEMENTS = CanaryTrainLCD.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2483; + CURRENT_PROJECT_VERSION = 2484; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = E6R2G33Z36; INFOPLIST_FILE = TrainLCD/Schemes/Dev/Info.plist; @@ -2757,7 +2757,7 @@ CODE_SIGN_ENTITLEMENTS = CanaryTrainLCD.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2483; + CURRENT_PROJECT_VERSION = 2484; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = E6R2G33Z36; INFOPLIST_FILE = TrainLCD/Schemes/Dev/Info.plist; @@ -2968,7 +2968,7 @@ CODE_SIGN_ENTITLEMENTS = RideSessionActivity/CanaryRideSessionActivity.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2483; + CURRENT_PROJECT_VERSION = 2484; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = E6R2G33Z36; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -3019,7 +3019,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 2483; + CURRENT_PROJECT_VERSION = 2484; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = E6R2G33Z36; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -3070,7 +3070,7 @@ CODE_SIGN_ENTITLEMENTS = WatchWidget/ProdWatchWidget.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2483; + CURRENT_PROJECT_VERSION = 2484; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = E6R2G33Z36; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -3128,7 +3128,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 2483; + CURRENT_PROJECT_VERSION = 2484; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = E6R2G33Z36; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -3179,7 +3179,7 @@ CODE_SIGN_ENTITLEMENTS = WatchWidget/CanaryWatchWidget.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2483; + CURRENT_PROJECT_VERSION = 2484; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = E6R2G33Z36; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -3236,7 +3236,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 2483; + CURRENT_PROJECT_VERSION = 2484; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = E6R2G33Z36; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -3284,7 +3284,7 @@ CODE_SIGN_ENTITLEMENTS = RideSessionActivity/ProdRideSessionActivity.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2483; + CURRENT_PROJECT_VERSION = 2484; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = E6R2G33Z36; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -3335,7 +3335,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 2483; + CURRENT_PROJECT_VERSION = 2484; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = E6R2G33Z36; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -3554,7 +3554,7 @@ CODE_SIGN_ENTITLEMENTS = ProdAppClip/ProdAppClip.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2483; + CURRENT_PROJECT_VERSION = 2484; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = E6R2G33Z36; ENABLE_USER_SCRIPT_SANDBOXING = NO; @@ -3610,7 +3610,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 2483; + CURRENT_PROJECT_VERSION = 2484; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = E6R2G33Z36; ENABLE_USER_SCRIPT_SANDBOXING = NO; @@ -3660,7 +3660,7 @@ CODE_SIGN_ENTITLEMENTS = CanaryAppClip/CanaryAppClip.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2483; + CURRENT_PROJECT_VERSION = 2484; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = E6R2G33Z36; ENABLE_USER_SCRIPT_SANDBOXING = NO; @@ -3718,7 +3718,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 2483; + CURRENT_PROJECT_VERSION = 2484; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = E6R2G33Z36; ENABLE_USER_SCRIPT_SANDBOXING = NO; diff --git a/src/constants/location.ts b/src/constants/location.ts index 8679b1f71..a7abf0eb7 100644 --- a/src/constants/location.ts +++ b/src/constants/location.ts @@ -3,7 +3,7 @@ import * as Location from 'expo-location'; export const LOCATION_TASK_NAME = 'trainlcd-background-location-task'; export const LOCATION_ACCURACY = Location.Accuracy.Highest; export const LOCATION_DISTANCE_INTERVAL = 5; -export const LOCATION_TIME_INTERVAL = 1000; +export const LOCATION_TIME_INTERVAL = 3000; export const MAX_PERMIT_ACCURACY = 4000; @@ -14,8 +14,11 @@ export const LOCATION_TASK_OPTIONS: Location.LocationTaskOptions = { accuracy: LOCATION_ACCURACY, distanceInterval: LOCATION_DISTANCE_INTERVAL, timeInterval: LOCATION_TIME_INTERVAL, - // Androidでバッチ配信を無効化し、位置情報をリアルタイムで受け取る - deferredUpdatesInterval: 0, + // expo-task-managerはバックグラウンドでJobScheduler経由でJS側にデータを配信する。 + // deferredUpdatesを両方0にするとFLPの更新ごとにジョブがスケジュールされ、 + // Android 16でクォータ超過によりバックグラウンド更新が停止する。 + // distanceは0にしないと停車中に更新が届かなくなる(AND条件のため) + deferredUpdatesInterval: LOCATION_TIME_INTERVAL, deferredUpdatesDistance: 0, pausesUpdatesAutomatically: false, } as const; diff --git a/src/hooks/useStartBackgroundLocationUpdates.ts b/src/hooks/useStartBackgroundLocationUpdates.ts index 58f203b4d..a8ca3d5c0 100644 --- a/src/hooks/useStartBackgroundLocationUpdates.ts +++ b/src/hooks/useStartBackgroundLocationUpdates.ts @@ -40,8 +40,10 @@ export const useStartBackgroundLocationUpdates = () => { try { // Android/iOS共通でexpo-locationのフォアグラウンドサービスを使用 - // Android 16以降ではJobSchedulerにランタイムクォータが適用されるため、 - // expo-locationのフォアグラウンドサービス内で直接位置更新を実行する必要がある + // Androidではフォアグラウンドサービスにより、バックグラウンドでの位置情報更新の + // スロットリングを回避し、アプリプロセスの生存を維持する(Android 8以降の制約) + // ただしexpo-task-managerのJS配信はJobScheduler経由のため、 + // Android 16のクォータ制限の影響を受ける点に注意 await Location.startLocationUpdatesAsync(LOCATION_TASK_NAME, { ...LOCATION_TASK_OPTIONS, // NOTE: マップマッチが勝手に行われると電車での経路と大きく異なることがあるはずなので