2017-12-09 7 views
0

私は一意の識別子を使用してバックグラウンドアップロード用のNSUrlSessionを作成しています。 アプリケーションを終了して再オープンした後、そのNSUrlSessionを取得してまだアップロードタスクをキャンセルしていない場合に備えてキャンセルする方法はありますか?既存のNSUrlSessionを取得/キャンセルする方法はありますか?

NSUrlSessionを同じ識別子で再作成して、まだアップロードタスクが含まれているかどうかを確認しましたが、このセッションを作成することはできませんが、「識別子付きバックグラウンドURLセッション...既にセッション識別子が一意でなければならないことを明示的に文書化しているので、驚くことではありません。

私はこれを、iOSプラットフォームプロジェクトのXamarin.Forms 2.3.4.270で実行しようとしています。

答えて

0

私は正しい軌道に乗っていました。エラーメッセージ "識別子付きバックグラウンドURLセッション...既に存在する"は実際には警告のようですが、実際には例外はスローされません(例外は実際には重複したセッション作成から来たものではありません)。

実際には、既存のNSUrlSessionに再接続することができます。アプリを再起動しても、含まれているタスクがまだ存在することがわかります。同じ識別子を持つ新しい設定を作成し、それを使って新しいセッションを作成し、表示された警告を無視してそこから進んでください。

これは実稼働環境での使用が推奨されているかどうかはわかりませんが、私のニーズには問題ありません。

private async Task EnqueueUploadInternal(string uploadId) 
{ 
    NSUrlSessionConfiguration configuration = NSUrlSessionConfiguration.CreateBackgroundSessionConfiguration(uploadId); 
    INSUrlSessionDelegate urlSessionDelegate = (...); 
    NSUrlSession session = NSUrlSession.FromConfiguration(configuration, urlSessionDelegate, new NSOperationQueue()); 

    NSUrlSessionUploadTask uploadTask = await (...); 
    uploadTask.Resume(); 
} 

private async Task CancelUploadInternal(string uploadId) 
{ 
    NSUrlSessionConfiguration configuration = NSUrlSessionConfiguration.CreateBackgroundSessionConfiguration(uploadId); 
    NSUrlSession session = NSUrlSession.FromConfiguration(configuration); // this will print a warning 

    NSUrlSessionTask[] tasks = await session.GetAllTasksAsync(); 
    foreach (NSUrlSessionTask task in tasks) 
     task.Cancel(); 
} 
関連する問題