メインコンテンツにジャンプ

iOSのバックグラウンド位置情報の更新が止まる理由

iOSのバックグラウンド位置情報更新を停止する理由: Capacitor アプリの停止、バックグラウンドモード、承認、自動停止、精度とそれぞれの原因の修正方法。

記事のクレジット

マーティン・ドナディュー

ライター

バレリア

レビュアー

ジョーダン

エディター

iOSのバックグラウンド位置情報更新を停止する理由

iOSはアプリを停止するため、バックグラウンド位置情報更新を停止します。Core Locationが失敗するのではなく、Core Locationが失敗するのではなく、iOSはアプリが位置情報のバックグラウンドモードを宣言し、バックグラウンドの更新を有効にし、ユーザーがアプリを離れた後、プロセスを凍結し、修正をキューイングまたはドロップするためです。このガイドでは、__CAPGO_KEEP_0__ アプリで見られるすべての原因とそれぞれの修正方法をリストし、どのように処理するかを示します。 CLLocationManageriOSのバックグラウンド位置情報更新を停止する理由: Capacitor アプリの停止、バックグラウンドモード、承認、自動停止、精度とそれぞれの原因の修正方法。 @capgo/background-geolocation 記事のクレジット

iOSアプリがバックグラウンド状態で扱われる方法

When a user swipes home or locks the phone, iOS gives the app a short window, then suspends it. A suspended app gets no CPU time. For a Capacitor app this means both the native side and the WebView stop running, so your JavaScript callback stops firing too.

ユーザーがホーム画面をスワイプしたり、電話をロックしたりすると、iOSはアプリに短い時間のウィンドウを与え、次にアプリを休止します。休止中のアプリはCPU時間を得られません。__CAPGO_KEEP_0__アプリの場合、ネイティブ側とWebViewが停止し、JavaScriptコールバックも停止します。

1. 位置バックグラウンドモードが未設定です。

Without location 欠落している UIBackgroundModes, どれだけの code を追加しても、更新は流れません。 ios/App/App/Info.plist:

<key>UIBackgroundModes</key>
<array>
  <string>location</string>
</array>

、

、 allowsBackgroundLocationUpdates、 true バックグラウンドモードをplistに含めないと、アプリがクラッシュする。 Capgo プラグインは、パスを渡すときに自動的に設定します。 backgroundMessage 、 start()、したがって、plist キーは配信前に存在する必要があります。

App Review は、バックグラウンド モードが正当化されていることを確認します。レビュー ノートで、どの機能がそれを使用しているかを説明し、レビュアーが機能を確認できるようにしてください。

原因 2: バックグラウンド更新が開始された

Apple の規則: バックグラウンド更新は、 foreground で実行されていた場合にのみ続きます。静音通知、バックグラウンド フェッチ、タスクからセッションを開始することは、標準的な位置情報更新には機能しません。 BGTaskScheduler ユーザー アクションからトラッキングを開始するか、またはアプリを再開するときに:

原因 3:

import { App } from '@capacitor/app';
import { BackgroundGeolocation } from '@capgo/background-geolocation';

let tracking = false;

export async function startTracking() {
  if (tracking) return;
  tracking = true;
  await BackgroundGeolocation.start(
    {
      backgroundMessage: 'Recording your route',
      backgroundTitle: 'Route recording',
      requestPermissions: true,
      distanceFilter: 10,
      url: 'https://api.example.com/v1/points',
    },
    (location, error) => {
      if (error) return console.error(error);
      if (location) console.log(location.latitude, location.longitude);
    },
  );
}

// Re-arm when the user comes back, if the session should be active
App.addListener('appStateChange', ({ isActive }) => {
  if (isActive && shouldBeTracking()) startTracking();
});

declare function shouldBeTracking(): boolean;

パラメータが渡されていなかった backgroundMessage これは __CAPGO_KEEP_0__ プラグインに特有のものであり、最も一般的なバグ レポートです。もし

この問題は、Capgo プラグインに特有であり、最も一般的なバグ報告です。 backgroundMessage 更新は停止し、 allowsBackgroundLocationUpdates stays false 原因 3:

原因 4: 誤った認可レベル、または 1 回だけ許可

多くの開発者は、常にバックグラウンドでトラッキングする必要があると考えているが、必要ない。 Apple のドキュメントによると、When In Use 認可を持つアプリは、バックグラウンドの更新が有効な限り、有効な位置情報サービスがある限り、バックグラウンドで実行され続ける。

Always は、他の何かについても重要である: 終了したアプリを再起動すること。 Only region monitoring、significant-change location、visits だけが、アプリを再起動できるのは、Always のみである。

2 つのユーザーの選択肢が静かにバックグラウンドのトラッキングを壊している:

  • 1 回だけ許可。 これは、使用中のアプリが停止したときに有効期限切れになる、When In Use の一時的な許可である。次のセッションでは、「未決定」という状態から始まる。
  • 使用中の場合、Always のプロンプトは表示されない。 Always を要求すると、iOS は、時期を選んで、画面に表示されていないときにアップグレードプロンプトを表示する可能性がある。

セッションを開始する前に、実際の状態を確認してください:

import { BackgroundGeolocation } from '@capgo/background-geolocation';

const status = await BackgroundGeolocation.checkPermissions();

if (status.location !== 'granted') {
  await BackgroundGeolocation.requestPermissions({ permissions: ['location'] });
}

if (status.backgroundLocation === 'when_in_use') {
  // Background tracking still works for standard updates.
  // Explain why Always helps if you also rely on geofences.
}

iOS の場合、 backgroundLocation 戻る when_in_use または granted / always、正しい説明を表示するため、推測するのではなく。

原因 5: Core Location が自動的に更新を停止しました。

CLLocationManager.pausesLocationUpdatesAutomatically のデフォルト値は trueです。iOS がユーザーが動いていないと判断した場合、バッテリーを節約するために更新を停止します。使用中のアプリの場合、停止はアプリが再起動するまでの間、位置アクセスを終了し、Core Location は自動的に再開しません。

The Capgo プラグインは pausesLocationUpdatesAutomatically = false in its native code, so this one is handled. If you write your own native code, or use another plugin, check this property first.

のネイティブ

Capacitor distanceFilter を書き込んだり、別のプラグインを使用したりした場合は、このプロパティを確認してください。

  • 原因 6: デバイスが静止状態でフィルタが大きい distanceFilter.
  • Use minIntervalMs 静止状態で心拍数を必要とする場合は、フィルタリング範囲を小さくするかゼロに設定してください。そうすると、ネイティブのPOSTの送信頻度を制限することができます。
await BackgroundGeolocation.start(
  {
    backgroundMessage: 'Vehicle tracking active',
    distanceFilter: 0,
    minIntervalMs: 120_000, // at most one native POST every 2 minutes
    url: 'https://api.example.com/v1/vehicle-points',
  },
  () => {},
);

原因 7: Precise Location がオフです

iOS 14 以降のユーザーは、アプリの Precise Location をオフにできます。 まだ更新を受け取ることができますが、精度は数 km になり、頻度も低くなります。データ (大きい値) を検出して、ユーザーに Precise Location の重要性を説明してください。配送アプリやフィットネスアプリを開発している場合は、オンボードイングでこの情報を表示してください。 accuracy 原因 8: ユーザーがアプリを終了しました

原因8:ユーザーがアプリを終了した

オプション:

Options:

  • 重要な場所に常に許可された geofence を設定して、iOS がアプリをバックグラウンドで再起動できるようにしてください。
  • サーバーがポイントを受信停止したときに、ユーザーにアプリを開くようにリマインドするメッセージを送信してください。
  • 原因 9: JavaScript は実行されていませんが、ネイティブは実行されていて

JavaScript は実行されていてもnativeは実行されている

A subtle one. Native code can receive a location while the WebView is suspended, or while it is still alive but not processing timers or network calls quickly. If you send points with fetch 原因 8: ユーザーがアプリを終了しました

Capacitorのプラグインを使用します。 url オプション。各ポイントは、ネイティブの code から、同じ JSON で POST されます。 Location type plus "source": "native"背景の作業のために場所の場所を超えて読むことを読む。

背景タスクのしくみを__CAPGO_KEEP_0__で読んでください。 背景タスクのしくみをCapacitorで読んでください。 と見る @capgo/capacitor-background-task.

原因10: 低電力モードと熱状態

青い指標

iOSは、場所を使用するアプリに、背景で使用している場合に、ステータスバーに青いピルを表示します。Capacitorのプラグインは

When an app with When In Use authorization uses location in the background, iOS shows a blue pill in the status bar. The Capgo plugin sets showsBackgroundLocationIndicator to true バックグラウンドセッションの場合、ユーザーは期待し、レビュアーもそう考えています。隠そうとしないでください、ユーザーは信頼しています。

これらのバグを捕捉するテスト計画

シミュレータでのテストだけでは、バックグラウンドの位置情報では十分ではありません。実際のiPhoneを使用して:

  1. リリース構成をビルドしてください、デバッグ構成だけではありません。Xcodeにアタッチされたデバッグビルドは、ライフサイクル処理が異なります。
  2. フォアグラウンドセッションを開始し、電話をロックし、20分間歩きますか、運転しますか。
  3. 「1回だけ許可する」、「精度の低い位置情報」、「低消費電力モード」で繰り返します。
  4. サーバーログを確認してください source: "native" ポイントだけではなく、インアプリログも確認してください。
  5. セッション中、強制終了し、次の起動時にアプリが何が起こったかを説明するようにします。

アドホックビルドのためにデバイスのUDIDが必要な場合は、 iOSのUDIDファインダ Safariから取得します。ビルドにMacとXcode 26が必要ない場合は Capgo ビルド クラウドで署名されたiOSビルドを生成できます。

トラブルシューティングチェックリスト

症状 おそらく原因 修正
ロック後に秒数で停止 いいえ location バックグラウンドモードがないか backgroundMessage plistキーの追加とパラメータの渡し backgroundMessage
起動時にクラッシュ allowsBackgroundLocationUpdates バックグラウンドモードなし 追加 UIBackgroundModes → location
一度動作したら機能しない ユーザーが一度許可した 説明して再度確認するか、送信する openSettings()
駐車中止 大きい distanceFilter 低くし、使用する minIntervalMs
点が離れていると、精度が低い 精確な位置をオフ ユーザーに有効にするように求める
スワイプで終了 ユーザーがアプリを終了した iOSで想定される場合、再起動用の地理フェンスを使用してください
ネイティブがポイントを獲得するのに対し、サーバーはポイントを獲得しません JavaScript fetch コールバック内 使用する url オプション

Shipping修正

これらの修正のほとんどは、ネイティブの設定や構成に触れており、新しいApp Storeのビルドが必要です。JavaScriptの部分、例えば許可の説明、導入コピー、リトライロジックは、ネイティブのビルドがリリースされた後 Info.plist __CAPGO_KEEP_0__ Live Update Capgo ライブアップデート プラグインを選択する場合、

CapacitorとiOSのバックグラウンド位置情報の更新を停止する理由 Transistorsoftと無料のCapgoプラグイン のトレードオフについて説明しています。

Capacitor アプリ向けの即時更新

ウェブ層のバグが生じた場合、Capgo を通じて修正を配信するのではなく、数日間待ってアプリストアの承認を待つのではなく、ユーザーはバックグラウンドで更新を受け取り、ネイティブの変更は通常のレビュー経路を通じて

最新のブログ記事

Capgo は、プロフェッショナルなモバイルアプリを作成するために必要な最良の洞察を提供します。