私はXamarin Formsアプリケーションを作成しています。アプリケーションがバックグラウンドであるときにRESTサービスを呼び出す必要があります。 async/awaitを使用する必要がありますか、これによって問題が発生しますか?Xamarin iOSでasync/awaitを使用してバックグラウンドフェッチからバックグラウンドセーフタスクを作成する
シナリオは、ユーザーが新しいアイテムを追加し、ネットワーク接続がなく、アプリケーションを終了するというシナリオです。ネットワーク接続を繰り返し確認し、使用可能な場合は新しいデータをRESTサービスに送信します。さらに悪いことに、データには写真が含まれている可能性がありますので、数分かかることがあります。
私が試みている解決策では、バックグラウンドフェッチを使用してネットワーク接続をチェックし、重い持ち上げを行うためのバックグラウンドセーフタスクを開始します。これは、バックグラウンドフェッチで実行されるコードの30秒の制限によるものです。
これはすべていいと思いますが、私の小さなテストアプリはうまくいくようです。私が助けが必要なのは、非同期/ RESTサービスを呼び出すのを待つ最善の方法です。ここで
は、私が30秒以内にPerformFetchから返す必要がテストアプリは
public override async void PerformFetch(UIApplication application, Action<UIBackgroundFetchResult> completionHandler)
{
// kick off a long running task
await StartLongRunningBackgroundTask();
// this can be NoData, NewData or Failed
completionHandler(UIBackgroundFetchResult.NoData);
}
public async Task StartLongRunningBackgroundTask()
{
_backgroundTaskID = UIApplication.SharedApplication.BeginBackgroundTask(() => {
// this is called if task times out
if (_backgroundTaskID != 0)
{
UIApplication.SharedApplication.EndBackgroundTask(_backgroundTaskID);
_backgroundTaskID = 0;
}
});
try
{
var restService = FreshTinyIoCContainer.Current.Resolve<IRestClientService>();
var result = await restService.GetDummyResult();
var messagingService = FreshTinyIoCContainer.Current.Resolve<IMessagingService>();
messagingService.Publish(new GotDataMessage { DataString = $"{result.foo} at {DateTime.Now:G}" });
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
UIApplication.SharedApplication.EndBackgroundTask(_backgroundTaskID);
}
をやっていることを示すためにいくつかのコードです。待っているかどうか、またはStartLongRunningBackgroundTaskを同期して呼び出す必要があるかどうかはわかりません。
アイデア?誰も前にこの種のことをやった?
AndroidでBTW、Firebase Job Dispatcherを使用していて、すべて正常に動作しています。
バックグラウンド転送サービスの調査に数日を費やし、使用しないことに決めました。すべてのRESTコードは、AndroidとiOSの両方から呼び出す共有サービスにあります。私は、Refitを使ってRESTサービスをラップし、そこにコールとエラー処理コードを持っています。私がBTSを使用する場合は、すべてを書き直して、iOS固有のNSURLSessionを使用する必要があります。私は、データを投稿するのに最長で600秒かかるので、代わりにバックグラウンドセーフタスクを使用するのが最善の方法を見つけようとしています。 –