BGTaskScheduler: 概要、iOSでのバックグラウンドタスク

著者: IT Sectr 公開日: 2026-03-27 読了時間: 8 分

BGTaskSchedulerは、iOS 13以降のアプリケーションでバックグラウンドタスクをスケジュールおよび実行するためのAppleのフレームワークです。これは廃止されたBackground FetchとperformFetchに代わり、バックグラウンド操作用の統一APIを提供します。Apple Developer Documentation, 2026によると、フレームワークには2種類のタスクが含まれます:長時間操作用のBGProcessingTaskと短時間のコンテンツ更新用のBGAppRefreshTaskです。

重要なポイント

  • BGTaskSchedulerは、古いBackground Fetchに代わる、バックグラウンドタスク管理のためのiOS 13+フレームワークです。
  • BGAppRefreshTaskは、コンテンツ更新のための最大30秒の短いバックグラウンドタスクです。
  • BGProcessingTaskは、リソース集中型操作のための最大数分間の長時間バックグラウンドタスクです。
  • 登録は、Info.plistの識別子を介して、およびコード内のhandleTasksを介して行われます。
  • システムは、ユーザーの行動に基づいてタスクを開始する最適な時間を自動的に決定します。

BGTaskSchedulerとは?

BGTaskSchedulerは、iOS 13で導入されたAppleのシステムフレームワークで、バックグラウンドタスクの実行を集中管理します。登場以前は、開発者はUIApplication backgroundTasks、performFetch、appDelegateでのイベント処理を使用しており、コードの断片化と予測不可能な動作を引き起こしていました。

フレームワークは遅延スケジューリングの原則に基づいて動作します:アプリは一意の識別子でタスクを登録し、iOS自体がそれらを実行する最適なタイミングを決定します。システムはバッテリーレベル、ユーザーアクティビティ、ネットワーク状態、その他の要因を考慮します。

主な機能には、短時間および長時間の両方のバックグラウンド操作が含まれます。AndroidのAlarmManagerとは異なり、BGTaskSchedulerは正確な実行時間を保証しません — システムは条件が不利な場合にタスクを遅延させる権利を留保します。

iOSでのBGTaskSchedulerの仕組み

BGTaskSchedulerは、ハンドラーベースのアーキテクチャを使用します。アプリはタスクタイプごとにハンドラーを登録し、システムは適切なタイミングでそれを呼び出します。フレームワーク自体はタスクを直接実行せず — 実行時期が来たことをアプリに通知するだけです。

タスク登録プロセス

登録は、Info.plistでBGTaskSchedulerPermittedIdentifiers配列を通じてタスク識別子を宣言することから始まります。次に、アプリコードでregisterHandler(forTaskWithIdentifier:)メソッドがハンドラークロージャとともに呼び出されます。

swift
import BackgroundTasks

let taskID = "com.example.app.refresh"

BGTaskScheduler.shared.registerHandler(
    forTaskWithIdentifier: taskID,
    using: DispatchQueue.global()
) { task in
    task.expirationHandler = {
        // 強制終了時に呼び出される
    }
    processBackgroundTask(task as! BGAppRefreshTask)
}

実行のスケジューリング

登録後、アプリはsubmitTaskRequestを介して明示的にタスク実行を要求する必要があります。リクエストにはタスク識別子と可能な最も早い開始日が含まれます。システムはリクエストを保存し、条件が適切と判断したときに処理します。

swift
let request = BGAppRefreshTaskRequest(
    identifier: taskID
)
request.earliestBeginDate = Date(timeIntervalSinceNow: 3600)

do {
    try BGTaskScheduler.shared.submit(request)
} catch {
    print("スケジューリングエラー: \(error)")
}

BGTaskSchedulerのバックグラウンドタスクの種類

BGTaskSchedulerは2つの主要なタイプのタスクを提供し、それぞれが独自のユースケース向けに設計されています。適切なタイプを選択することは、システムによるタスクの実行成功確率に直接影響します。

BGAppRefreshTask

BGAppRefreshTaskは、短時間のバックグラウンドコンテンツ更新用に設計されています:新しいデータの読み込み、サーバーとの同期、ウィジェットの更新。実行時間は30秒に制限されており、その後システムはタスクを強制終了します。このタイプのタスクはBGProcessingTaskよりも頻繁に実行され、優先度が高くなります。

BGProcessingTask

BGProcessingTaskは、より長時間の操作向けに設計されています:メディアファイルの処理、Core Dataのインデックス作成、バックアップの作成。タスクは数分間実行できますが、システムはそれをあまり頻繁に起動せず、好条件(電源接続、安定したWi-Fi、デバイスの負荷が低い)でのみ実行します。

パラメータBGAppRefreshTaskBGProcessingTask
時間制限30秒数分
起動頻度高い低い
条件任意電源 + Wi-Fi
電源要件なし推奨
フィード更新ビデオ処理

登録とスケジューリング

正しい登録は、BGTaskSchedulerが機能するための必須条件です。タスクがInfo.plistに登録されていない場合、システムは実行要求を無視します。

Info.plistでの登録

Info.plistファイルには、文字列識別子のリストを含むBGTaskSchedulerPermittedIdentifiers配列を含める必要があります。各識別子はアプリ内で一意でなければなりません。Appleは逆ドメイン表記法の使用を推奨しています。

xml
<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
    <string>com.example.app.refresh</string>
    <string>com.example.app.processing</string>
</array>

スケジューリングとキャンセル

タスクをスケジュールするには、submitTaskRequestメソッドを使用します。タスクが不要になった場合は、cancelTaskRequestまたはcancelAllTaskRequestsを介してキャンセルできます。システムはアプリが削除されたりデータがリセットされたりした場合にも自動的にタスクをキャンセルします。

タスク状態の監視

BGTaskSchedulerは、getPendingTaskRequestsを通じてスケジュールされたタスクの状態を追跡する機能を提供します。このメソッドは、タイプ、識別子、earliestBeginDateに関する情報とともに、すべてのアクティブなリクエストのリストを返します。各リクエストについて、既に完了またはキャンセルされたかどうかを確認し、再スケジュールするかどうかを決定できます。

システムはバックグラウンドタスクの成功に関する直接的なコールバックを提供しないことに注意することが重要です — ハンドラー自体がタスクプロパティを介して結果を報告する必要があります。setTaskCompletedを使用すると、タスクを正常に完了としてマークでき、その後システムはこのタイプの次のスケジュールされたタスクを起動できます。タスクがsetTaskCompletedを呼び出さない場合、システムはタイムアウトまたは強制終了時に完了したと見なします。

診断には、ハンドラーでOSLogを使用し、MacのConsole.appでログを表示することをお勧めします。Appleはバックグラウンドタスクのパフォーマンス分析用のMetricKitツールも提供しています — 実行時間、エネルギー消費、起動頻度に関するデータを収集し、最適化に使用できます。

swift
// 特定のタスクをキャンセル
BGTaskScheduler.shared.cancel(taskRequestWithIdentifier: taskID)

// すべてのタスクをキャンセル
BGTaskScheduler.shared.cancelAllTaskRequests()

// スケジュールされたタスクを確認
BGTaskScheduler.shared.getPendingTaskRequests { requests in
    print("\(requests.count) 件のタスクがスケジュールされました")
}

制限と推奨事項

BGTaskSchedulerは、バックグラウンド作業に厳しい制限を課します。システムは条件が不利な場合、タスクを無期限に遅延させる可能性があります。開発者は、このフレームワークがリアルタイムタスク向けではないことを理解する必要があります。

主な制限には以下が含まれます:システムは指定された時間でのタスク実行を保証せず、同時タスクの最大数が制限され、エネルギー消費が厳密に制御されます。複数のタスクを連続して実行すると、マージまたはキャンセルされる可能性があります。

実行の可能性を高めるには、BGProcessingTaskの場合は1時間以上、BGAppRefreshTaskの場合は15分以上のearliestBeginDateを設定することをお勧めします。expirationHandlerを処理することも重要です — タスクが制限時間内に完了できない場合、システムは適切な終了のためにこのハンドラーを呼び出します。継続的なバックグラウンド作業サイクルを維持するために、再スケジューリングはハンドラー自体の中で行う必要があります。

もう1つの重要な制限は、ネットワークリクエストに関するものです。BGTaskSchedulerはタスク実行中のアクティブなネットワーク接続を保証しません。アプリはNWPathMonitorを介してネットワークの可用性を独立して確認し、接続がない場合は処理を延期する必要があります。これは、特定のタイプのネットワークに接続されている場合にのみタスクをアクティブ化できるAndroid JobSchedulerとは異なります。実際には、開発者は信頼性の高いデータ読み込みのためにBGTaskSchedulerをNSURLSessionのバックグラウンドURLセッションと組み合わせることがよくあります。

macOSおよびwatchOSとの互換性

macOS Catalina以降、BGTaskSchedulerはMacでも使用可能です。これにより、Apple Siliconで実行されるUIKitアプリ向けのクロスプラットフォームバックグラウンドタスクを作成できます。watchOSでは、フレームワークの機能は制限されており — コンプリケーションの更新やiPhoneとのデータ同期のための短いBGAppRefreshTaskのみが利用可能です。開発者はバックグラウンドアーキテクチャを計画する際にプラットフォームの違いを考慮する必要があります。

デバッグおよび診断ツール

AppleはBGTaskSchedulerをデバッグするためのいくつかのツールを提供しています。lldbのコマンドe -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.example.task"]は、システム制限をバイパスしてバックグラウンドタスクを強制的に起動します。XcodeのDebugメニューには、短いバックグラウンド更新をエミュレートするSimulate Background Fetchフラグがあります。パフォーマンス分析にはMetricKitが使用されます — 各タスクの起動頻度、実行時間、エネルギー消費に関する情報を収集します。このデータは、スケジューリング頻度の最適化と適切なタスクタイプの選択に役立ちます。

実際には、BGTaskSchedulerはウィジェットデータの更新、iCloud同期、コンテンツを含むプッシュ通知の処理、Spotlight検索のインデックス作成に適しています。リアルタイム分析、チャットアプリケーション、または即時実行を必要とするタスクには適していません。

Appleのリソースとドキュメント

BGTaskSchedulerの詳細な学習には、Appleは公式のWWDCドキュメントを推奨しています:「Advances in Background Tasks」セッション(2020)では廃止されたAPIからの移行をカバーし、「Background Tasks in Practice」(2021)では実際の使用例が含まれています。Energy Efficiency Guideセクションも有用で、フレームワークがAppleの全体的な省エネ戦略にどのように適合するかを説明しています。コード例は、GitHubの公式Apple DeveloperリポジトリでiOSおよびmacOS用の完全なプロジェクトとともに利用可能です。

よくある質問

BGTaskSchedulerはiOS 12のBackground Fetchとどう違うのですか?

Background Fetchはアプリごとに1つのバックグラウンドタスクに制限され、優先順位メカニズムがありませんでした。BGTaskSchedulerは異なるタイプの複数タスクをサポートし、統一APIと自動エネルギー管理を提供します。

BGTaskSchedulerにはいくつのバックグラウンドタスクを登録できますか?

Appleは登録できる識別子の数に明示的な制限を設けていませんが、実際には5~10個以上のタスクを使用しないことをお勧めします。数を増やすと、システムリソースの競合により各タスクが実行される確率が低下します。

実際のデバイスでBGTaskSchedulerの実行をデバッグするには?

デバッグには、lldbでコマンドe -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.example.task"]を使用します。システム制限をバイパスしてタスクを強制的に起動します。DebugメニューのXcode Simulate Background Fetchフラグも利用可能です。

アプリが強制終了された場合でもBGTaskSchedulerはタスクを実行できますか?

はい、BGTaskSchedulerはユーザーによってアプリが強制終了された場合でもプロセスを起動できます。ただし、システムが追加の遅延を適用する可能性があり、すべてのタスクタイプがこのシナリオでの実行を保証するわけではありません。

タスクが割り当てられた時間内に完了しない場合はどうなりますか?

システムはexpirationHandlerを呼び出し、タスクに終了する必要があることを通知します。アプリがこの信号を無視して動作を続けると、iOSはプロセスを強制終了します。その後、システムはアプリのすべてのバックグラウンドタスクの優先度を下げる可能性があります。

まとめ

  • BGTaskSchedulerは、iOS 13+およびmacOS Catalina+ですべてのバックグラウンドタスクを管理するためのAppleの統一フレームワークです。
  • 2つのタスクタイプ — 最大30秒のBGAppRefreshTaskと最大数分のBGProcessingTask — がさまざまなバックグラウンド作業シナリオをカバーします。
  • 登録はInfo.plist(識別子)とコード(registerHandler)の2箇所で必要です。
  • スケジューリングはearliestBeginDateを指定したsubmitTaskRequestを介して — システムが最適な開始タイミングを選択します。
  • ExpirationHandlerは、システムによるタスクの強制終了を処理するために必須です。
  • 制限事項には、実行の保証なし、エネルギー消費の制御、デバイス状態への依存が含まれます。
  • 使用 BGTaskSchedulerはコンテンツ更新、同期、インデックス作成に使用しますが、リアルタイムタスクには使用しません。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください