2017-08-17 11 views
2

私は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を使用していて、すべて正常に動作しています。

答えて

2

RESTサービスの呼び出しは、常に非同期で行う必要があります。しかし、そのコールが30秒の制限より長くかかる機会がある場合は、バックグラウンド転送サービスを使用してください。アップロード/ダウンロードを設定して、NSUrlSessionを設定することができます。あなたに始めてみるとwalk throughと同様にpostを見てください。基本的には、PerformFetchのバックグラウンドタスクを登録すると、iOSが実行をスケジュールします。

+0

バックグラウンド転送サービスの調査に数日を費やし、使用しないことに決めました。すべてのRESTコードは、AndroidとiOSの両方から呼び出す共有サービスにあります。私は、Refitを使ってRESTサービスをラップし、そこにコールとエラー処理コードを持っています。私がBTSを使用する場合は、すべてを書き直して、iOS固有のNSURLSessionを使用する必要があります。私は、データを投稿するのに最長で600秒かかるので、代わりにバックグラウンドセーフタスクを使用するのが最善の方法を見つけようとしています。 –

関連する問題