OEM の電源管理
積極的なバッテリー セーバーを使いこなす
すべてを完璧に構成し、POST_NOTIFICATIONS を使用してフォアグラウンド サービスをリクエストした場合でも、特定の Android メーカー (OEM) は、独自の非常に積極的な「バッテリー セーバー」エンジンをカスタム Android フォーク (MIUI、EMUI、ColorOS など) に組み込んでいます。
これらの積極的なタスクキラーは、標準の Android API ルールに関係なく、数分間画面がオフになった後にアプリを終了します。 Tracelet の Settings Health API は、これらのデバイスを検出し、ユーザーを適切な非表示の設定メニューに自動的にルーティングしてアプリをホワイトリストに登録するための包括的なスイートを提供します。
サポートされているメーカーと動作
Tracelet は、100 以上の OEM 固有のインテント構造の内部レジストリを維持します。 Tracelet.showPowerManager() を呼び出すと、エンジンはデバイスのブランドを自動的に検出し、正しいディープリンクを起動します。
弊社がサポートする主な OEM と、showPowerManager() が開くものは次のとおりです。
📱 Xiaomi / POCO / Redmi (MIUI / HyperOS)
- 問題: MIUI には、悪名高い厳格な「自動起動」マネージャーと、5 分間のスリープ後にバックグラウンド サービスを停止する「バッテリー セーバー」があります。
- Tracelet が開くもの:
- 非表示の 自動開始 メニュー (ユーザーはアプリをオンに切り替える必要があります)。
- 特定のアプリ バッテリー セーバー メニュー (ユーザーは 「制限なし」 を選択する必要があります)。
📱 Huawei / 名誉 (EMUI)
- 問題: EMUI の「アプリ起動」マネージャーは、手動で管理するように明示的に設定されていない限り、アプリを強制終了します。
- Tracelet で開く内容: アプリ起動 設定画面。ユーザーはアプリのチェックを外し、「自動起動」、「二次起動」、「バックグラウンドで実行」がすべて有効になっていることを確認する必要があります。
📱 サムスン (OneUI)
- 問題: Samsung は、数日間開かれていないアプリを「ディープ スリープ アプリ」リストに積極的に追加し、すべてのバックグラウンド実行を永久に切断します。
- Tracelet が開くもの: 監視されていない/スリープ状態にないアプリ メニュー。ユーザーはアプリを永続的なホワイトリストに追加できます。
📱 OnePlus / Oppo (OxygenOS / ColorOS)
- 問題: バックグラウンド タスクを自動最適化する積極的な「アプリ バッテリー管理」。
- Tracelet で開く内容: アプリの自動起動 および バッテリーの最適化 画面。
📱 Vivo (Funtouch OS)
- 問題: アプリがバックグラウンドで高電力を消費するのを制限します。
- Tracelet が開く内容: バックグラウンドでの消費電力が高い ホワイトリスト メニュー。
🌐 その他のデバイスと DontKillMyApp
Tracelet のディープリンク エンジンで明示的にカバーされていないデバイスの場合、または特定のメーカーによって課される正確な技術的制約を理解したい場合は、DontKillMyApp.com をチェックすることを強くお勧めします。これは、バックグラウンド タスクの積極性によってスマートフォンをランク付けし、ほぼすべての Android デバイスの手動構成手順を提供する、コミュニティ主導の素晴らしいリソースです。
緩和フローの実装
このチェックは、アプリのオンボーディング フロー中、またはメイン ダッシュボードで実行する必要があります。
import 'package:tracelet/tracelet.dart' as tl;
// 1. Check the device health
// Returns a Map<String, dynamic> containing the boolean flags
final health = await tl.Tracelet.getSettingsHealth();
// 2. Check if the device is a known aggressive OEM
if (health['isAggressiveOem'] == true) {
// 3. Check if the user has already whitelisted your app
if (health['isIgnoringBatteryOptimizations'] == false) {
// 4. Show a custom Flutter dialog explaining WHY they need to do this
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text("Background Tracking Required"),
content: Text("To ensure your route is recorded, please select 'No Restrictions' on the next screen."),
actions: [
TextButton(
onPressed: () async {
Navigator.pop(context);
// 5. Open the specific manufacturer's hidden power menu
// Returns true if the intent successfully launched the screen, false otherwise.
final success = await tl.Tracelet.showPowerManager();
if (!success) {
// Fallback: Open standard Android battery settings
await tl.Tracelet.openBatterySettings();
}
},
child: Text("Configure"),
)
]
)
);
}
}UX ベスト プラクティス: ランダムに、またはアプリの起動直後に showPowerManager() を呼び出さないでください。常にその前に、コンテキスト性の高い Flutter UI ダイアログを配置します。ユーザーが突然、何の脈絡もなく恐ろしい「バッテリー最適化」システム画面にテレポートされたら、パニックになってアプリをアンインストールするでしょう。
リアルタイムの運転手/車両追跡の信頼性
タクシー、配送、およびフリート アプリを構築しているチームからの最も一般的な質問は次のとおりです。「Tracelet は、Xiaomi、Poco、Infinix、Tecno、およびその他の積極的な OEM で一日中追跡し続けることができますか?」 これが正直で実用的な答えです。
Tracelet が自動的に処理するもの
これらの緩和策は自動的に適用されます。構成は必要ありません。
FOREGROUND_SERVICE_TYPE_LOCATIONを使用したフォアグラウンド サービス — Android が許可する最高のバックグラウンド優先度。START_STICKY— メモリ圧迫が発生した後、OS はサービスを再作成します。- OEM 安全なウェイクロック — Huawei では、PowerGenie によってホワイトリストに登録されたウェイクロック タグであり、「不明な」ウェイクロックを保持しているためにプロセスが強制終了されないようにします。
- ブートレシーバー ウェイクロック —
BOOT_COMPLETED中の短いウェイクロック。再起動後にフォアグラウンド サービスが確立されるまでプロセスが存続します。 - コンシューマ ProGuard/R8 ルール — リリース ビルドがサービス、レシーバー、および Room エンティティを削除するのを防ぎます。
避けられない手動ステップ
ユーザーがアプリをホワイトリストに登録しない限り、バックグラウンド ロケーション ライブラリは OEM の強制終了をオーバーライドできません。 MIUI、EMUI、ColorOS、HiOS/XOS、および同様の ROM は、標準の Android ルールを意図的に無視します。これらのデバイスでは、バッテリー最適化の免除 + 自動起動は終日の信頼性を実現するための重要な要件です。これらをオプションの追加機能ではなく、必須のオンボーディング手順として扱います。
免除に関するドライバーのシフトの開始をゲートします。
final ignoring = await tl.Tracelet.isIgnoringBatteryOptimizations();
final health = await tl.Tracelet.getSettingsHealth();
if (health['isAggressiveOem'] == true && !ignoring) {
// Walk the user through showPowerManager() + battery-optimization exemption
// BEFORE letting them go "on shift".
}OEM がトラッキングを抑制または停止したときの検出
Tracelet.getHealth()— 1 回の呼び出しで、追跡状態、プロバイダーの状態、許可/承認、省電力モード、バッテリー最適化の除外、保留中の非同期数が自動検出された警告とともに返されます。 「デバイスの健全性」ダッシュボードに最適です。onProviderChangeイベント — 位置情報サービス/GPS 状態が変化すると発生します。- バックエンドの失効ウォッチドッグ — すべての修正にはタイムスタンプが付けられ、永続化されるため、各デバイスの 最終修正時間 をサーバー上の予想される頻度と比較し、ストリームが沈黙したデバイス (OEM キルの典型的な特徴) を数分以内に報告します。
終日追跡のための推奨設定チェックリスト
- 明確な根拠フローを使用して
Always/ バックグラウンド位置 の許可をリクエストします。 - 継続的な通知を使用して フォアグラウンド サービスを実行します。継続的な追跡については交渉の余地がありません。
- アプリを閉じて再起動しても追跡が継続されるように、
stopOnTerminate: falseとstartOnBoot: trueを設定します。 - オンボーディング中に、
getSettingsHealth()を呼び出します。isAggressiveOemが true の場合、showPowerManager()およびバッテリー最適化の除外手順をユーザーに説明します。isIgnoringBatteryOptimizations()でゲート シフト スタート。 - HTTP Sync (バッチアップロード) を使用して、短期間のネットワークギャップによってデータが失われないようにします。
- バックエンドの失効ウォッチドッグを追加して、デバイスがすぐに暗くなることを操作で確認できるようにします。
- 実際のデバイスで現場の問題を診断できるように、
tracelet_doctor(またはgetHealth()) を非表示のサポート画面で出荷します。
バックグラウンドの信頼性はデバイスと ROM のバージョンに固有であるため、最も信頼できる「ケーススタディ」は、サンプル アプリと tracelet_doctor を実際のターゲット デバイスの組み合わせで 1 日実行することです。これは、包括的な主張よりもはるかに現実世界の動作を反映しています。