iOSでBackground Fetchを実行する | Xamarin.Forms
- 2017/04/26
- 13:47
今回はバックグラウンドフェッチ(Background Fetch)についてご紹介したいと思います。Background FetchとはiOS起動後にある程度の間隔でアプリ内のコードを30秒だけ実行してくれるサービス的な機能です。アプリの起動処理時間を短縮するための事前準備をしたり、データ処理を行ったりすることに良く用いられるとか。しかしながら、その実行間隔を開発者が決めれず、アプリの利用頻度に応じてOSが決定することや、実行時間は30秒という時間は短かすぎで、利用できるケースは極度に限られてきます。バッテリーの消費を避けるためというらしいですが、はっきり言って、30秒では何もできません。ちょっとした通信ぐらいなら可能でしょうというところです。さらにはアプリが手動でKillされている場合、Background Fetchは呼び出されないという仕様です。
※アプリが起動していない場合でもBackgroundFetchを動作させたい場合はVoIPプッシュ通知を利用すると良いでしょう。
前提条件
・Windows10
・Visual Studio 2015 Community Update3
・Xamarin 4.3.0.784 (NuGet Xamarin.Forms 2.3.4.224)
・macOS Sierra 10.12.4 / Xcode8.3.1 / Xamarin.iOS 10.4.0.123
1.バックグラウンドフェッチを有効にする
(1)iOSプロジェクトのプロパティで「iOSアプリケーション」のバックグラウンドモードを有効にするのチェックをONにする。(2)バックグラウンドフェッチのチェックをONにする。

2.AppDelegateの記述
(1)アプリ起動時のFinishedLaunchingにてバックグラウンドフェッチの間隔を設定します。最低の実行間隔と設定したとしても、実際はその間隔をOSが決定するので、おまじないと思ってください。(2)PerformFetchをオーバーライドし、必要なバックグラウンド処理を記述します。OSによりPerformFetchが呼び出されます。
AppDelegate.cs
private NotificationService _nService;
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
global::Xamarin.Forms.Forms.Init();
LoadApplication(new App());
//バックグラウンドフェッチの間隔を設定
UIApplication.SharedApplication.SetMinimumBackgroundFetchInterval(UIApplication.BackgroundFetchIntervalMinimum);
return base.FinishedLaunching(app, options);
}
public override void PerformFetch(UIApplication app, Action<UIBackgroundFetchResult> completionHandler)
{
try
{
System.Diagnostics.Debug.WriteLine("●PerformFetch start");
this.BackgroundService();
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message + System.Environment.NewLine + ex.StackTrace);
}
finally
{
completionHandler(UIBackgroundFetchResult.NewData);
}
}
private async void BackgroundService()
{
await Task.Run(() =>
{
try
{
System.Diagnostics.Debug.WriteLine("●BackgroundService.Thread.Start");
while (true)
{
InvokeOnMainThread(delegate
{
if (_nService == null)
{
//通知機能の認証
_nService = new NotificationService();
_nService.Regist();
}
_nService.On("PerformFetchTitle", "PerformFetchBody time:" + UIApplication.SharedApplication.BackgroundTimeRemaining.ToString());
});
System.Threading.Thread.Sleep(60000);
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message + System.Environment.NewLine + ex.StackTrace);
}
}).ConfigureAwait(false);
}
※通知機能のクラス NotificationService については以前の記事でご紹介しておりますので、ご参考くださいませ。
3.Xamarin Studio でのデバッグ方法
Xamarin Studio では標準でデバッグ方法が別途用意されています。(1)実行→プログラムから実行→Custom Configration

(2)Background Fetch を選択して実行します。

※Visual Studio においても Xamarin 4.7.10.22 から同じ機能が搭載されていますが、Xamarin 4.7.10.22 は不具合がありますので、要確認の上アップデートしてください。詳しくは次の記事「Xamarin 4.7.10.22 をインストールして動作検証してみました」をご参考ください。
4.Visual Studio でのデバッグ方法
Xamarin 4.7.10.22 以降をインストールしていないかたは次のようにシミュレート可能です。
嘘の様な話なのですが、iPhone実機にて「アプリのアイコンをタップしてアプリを起動→Home」を10回以上繰り返すると、PerformeFetchが実行されました。


当ブログの内容をまとめた Xamarin逆引きメニュー は以下のURLからご覧になれます。
http://itblogdsi.blog.fc2.com/blog-entry-81.html
- 関連記事
-
- カスタムフォントを使用してアプリのラベルやボタンに表示させる方法 | Xamarin.Forms
- SQLite データベースを使用してデータ保存する | Xamarin.Forms
- iOSでBackground Fetchを実行する | Xamarin.Forms
- iOSでバックグラウンドタスクを実行する | Xamarin.Forms
- Androidでアプリやサービスが起動しているかどうか確認する方法 | Xamarin.Forms