有没有办法检索现有的NSUrlSession /取消它的任务?

时间:2017-12-09 12:30:07

标签: c# ios xamarin.forms

我正在使用唯一标识符为后台上传创建NSUrlSession。 在关闭并重新打开应用程序之后,有没有办法检索NSUrlSession并取消上传任务,以防它尚未处理?

我尝试使用相同的标识符重新创建NSUrlSession,以检查它是否仍然包含上传任务,但它甚至不允许我创建此会话,抛出类似"带标识符的后台URLSession等异常。已经存在",这不足为奇,因为文档明确指出会话标识符必须是唯一的。

我试图在iOS平台项目中使用Xamarin.Forms 2.3.4.270进行此操作。

1 个答案:

答案 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();
}