私は正しい軌道に乗っていました。エラーメッセージ "識別子付きバックグラウンド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();
}