我正在使用唯一标识符为后台上传创建NSUrlSession。 在关闭并重新打开应用程序之后,有没有办法检索NSUrlSession并取消上传任务,以防它尚未处理?
我尝试使用相同的标识符重新创建NSUrlSession,以检查它是否仍然包含上传任务,但它甚至不允许我创建此会话,抛出类似"带标识符的后台URLSession等异常。已经存在",这不足为奇,因为文档明确指出会话标识符必须是唯一的。
我试图在iOS平台项目中使用Xamarin.Forms 2.3.4.270进行此操作。
答案 0 :(得分:0)
原来我走在正确的轨道上。错误消息"带有标识符的后台URLSession已存在"实际上似乎更像是一个警告,但实际上没有抛出异常(我实际上并没有来自重复会话创建的异常)。
因此,您实际上可以重新连接到现有的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();
}