コンテンツにスキップ

バックグラウンドタスク

本 SDK は下記の目的のために、エンドユーザーが App を起動していないときもバックグラウンドタスクを実行させる必要があります。

  • ユーザーが App を起動していないときもGPS配信またはBluetooth配信を実施する
  • ユーザーの App 利用状況を集計し、FANSHIP 管理画面から確認できるようにする

バックグラウンドタスクを実行するための方法として、下記の3つの方法があります

  1. Background Tasks API の Background App Refresh Tasks (以下 BGAppRefresh) を利用する
  2. Background Tasks API の Background Processing Tasks (以下 BGProcessing) を利用する
  3. 旧バックグラウンドフェッチ を利用する

BGAppRefresh と BGProcessing について

BGAppRefresh と BGProcessing はどちらも iOS 13 から追加された Background Tasks API に属する機能ですが、発動タイミングやタスクを実行可能な制限時間等が両者間で異なります。

Appleのドキュメント Choosing Background Strategies for Your App をご覧の上、ご利用のプロジェクトにおいて適切なものをお選びください。

なお、Background Tasks API の仕様に関するお問い合わせは、お手数ですが Apple Developer サポート にて行っていただきますようお願い致します。

iOS 13 未満では Background Tasks API は利用できません

Background Tasks API は、 iOS 13 から導入された機能であるため、iOS 12 以下においては動作いたしません。

そのため、 App のサポートOSバージョンに iOS 12 以下が含まれる場合は、「iOS 12 以下の端末で実行された場合に限り、旧バックグラウンドフェッチ処理を実行する」といった実装をご検討ください。

以下、各方法の実装手順をご説明します。

[共通設定] plist の設定

BGAppRefresh または BGProcessing を使用する場合は Permitted background task scheduler identifiers を登録する必要があります。

plist-bgtask.png

  1. TARGETS > Info > Custom iOS Target Properties 内に、キー Permitted background task scheduler identifiers を追加します。
  2. キーに対する値の Type が Array になっていることを確認します。
  3. Array の中に Item を1行追加します。
  4. 追加した Item の Type が String になっていることを確認します。
  5. Item の値に識別子を設定します。
    • 識別子は他と重複しないような文字列を設定してください。
      • BGAppRefreshBGProcessing を同時に利用する場合は、それぞれ異なる値を設定する必要があります。
  6. SdkSettings.plist 内のキー FanshipBGTaskSchedulerPermittedIdentifiers の値に、同じ識別子を設定する。

[BGAppRefresh] を利用する

  1. TARGETS > Capabilities > Background Modes にて、下記のチェックボックスをオンにします。
    • Background fetch
  2. -[AppDelegate applicationDidEnterBackground:] 内部にて、-[PopinfoReceiver scheduleAppRefreshTask] をコールします。

    - (void)applicationDidEnterBackground:(UIApplication *)application {
        if (@available(iOS 13.0, *)) {
            [popinfoReceiver enterBackgroundTask];
        }
    }
    
    func applicationDidEnterBackground(_ application: UIApplication) {
        if #available(iOS 13.0, *) {
            popinfoReceiver.enterBackgroundTask()
        }
    }
    

[BGProcessing] を利用する

  1. TARGETS > Capabilities > Background Modes にて、下記のチェックボックスをオンにします。
    • Background fetch
    • Background processing
  2. フラグ FANSHIP_BG_PROCESSING_TASK_USE を有効にします。以下のいずれかを実施してください。
    • Build Settings > Apple Clang - Processing > Preprocessor MacrosFANSHIP_BG_PROCESSING_TASK_USE=1 をセットする。
    • ビルド時の引数に OTHER_CFLAGS="-DFANSHIP_BG_PROCESSING_TASK_USE=1" をセットする
  3. -[AppDelegate applicationDidEnterBackground:] 内部にて、-[PopinfoReceiver enterBackgroundTask] をコールします。

    - (void)applicationDidEnterBackground:(UIApplication *)application {
        if (@available(iOS 13.0, *)) {
            [popinfoReceiver enterBackgroundTask];
        }
    }
    
    func applicationDidEnterBackground(_ application: UIApplication) {
        if #available(iOS 13.0, *) {
            popinfoReceiver.enterBackgroundTask()
        }
    }
    

Background Tasks API 間の同時利用

一般に一つの App 内で BGAppRefresh と BGProcessing は同時に利用できますが、本SDKのバックグラウンドタスクは動作を安定させるために BGAppRefresh または BGProcessing のいずれか一方を利用して実装する形式となっています。

[旧バックグラウンドフェッチ] を利用する

バックグラウンドフェッチ発動時にコールされるアプリケーションデリゲートメソッドを以下のように記述してください。

旧バックグラウンドフェッチは SDK バージョン 5.2.2 以下における標準的な実装方法でした。2021年12月時点ではiOS15においても問題なく動作します。

-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    [popinfoReceiver enterBackgroundFetch];
    completionHandler(UIBackgroundFetchResultNewData);
}
func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    popinfoReceiver.enterBackgroundFetch()
    completionHandler(.newData)
}

iOS 13 以降の Background Fetch API について

iOS 13 以降、 BackgroundTasks の追加にともない、旧バックグラウンドフェッチは deprecated となりました

Apple は上記に関して廃止までの詳細なロードマップを発表しておらず、また iOS13 以上の OS のみで利用できることから、数年ほど(少なくともXcodeのサポートデバイス一覧から iOS12 以下が消失するまで)は引き続き利用できるものと予想されます。

Background Tasks API と旧バックグラウンドフェッチとの同時起動

Background Tasks API と旧バックグラウンドフェッチは、一般には同時に作動させるような利用が想定されていないと考えられており、SDKの動作不安定を招く可能性がありますので、推奨されません。