NSURLSessionTask 创建在带有 backgroundSessionConfiguration 的扩展中失败

Posted

技术标签:

【中文标题】NSURLSessionTask 创建在带有 backgroundSessionConfiguration 的扩展中失败【英文标题】:NSURLSessionTask creation fail in extension with backgroundSessionConfiguration 【发布时间】:2015-10-22 16:14:48 【问题描述】:

上下文: 我尝试使用 backgroundSessionConfiguration 从操作扩展调用创建任务(下载或上传)。

为此,我在苹果documention 中放了一个例子

-(void)downloadTest

    NSURLSession *mySession = [self configureMySession];
    NSURL *url = [NSURL URLWithString:@"http://www.sellcell.com/blog/wp-content/uploads/2014/03/dog-apps.jpg"];
    NSURLSessionTask *myTask = [mySession downloadTaskWithURL:url];
    [myTask resume];


- (NSURLSession *) configureMySession 
    if (!_mySession) 
        NSURLSessionConfiguration* config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.mycompany.myapp.backgroundsession"];
        // To access the shared container you set up, use the sharedContainerIdentifier property on your configuration object.
        config.sharedContainerIdentifier = @"group.com.mycompany.appname"; 
        _mySession = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
    
    return _mySession;

我的问题是当我调用 [mySession downloadTaskWithURL:url]; 时它返回 nil。

如果我将配置更改为NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];,则会创建一个任务。

我看不出我做错了什么,我创建了一个应用组,并在应用和扩展程序中使用它。

我使用在config.sharedContainerIdentifier 中创建的组名,但我不确定是否有必要。

注意:我对 uploadTask 也有同样的问题。

【问题讨论】:

【参考方案1】:

    您使用的是 ARC 吗?如果没有,请确保您的会话被正确保留。 (看起来你是在直接使用 ivar。)

    该共享容器标识符是否正确?如果容器不在您的权利中或尚不存在,您的会话将立即失效。添加一个失效委托方法,看看它是否被调用。如果是这样,那可能就是问题所在。

【讨论】:

以上是关于NSURLSessionTask 创建在带有 backgroundSessionConfiguration 的扩展中失败的主要内容,如果未能解决你的问题,请参考以下文章

iOS —— NSURLSessionTask

如何处理完成处理程序块中取消的 NSURLSessionTask ?

如果应用程序被杀死,NSURLSessionTask 会发生啥

如何防止恢复重复的 NSURLSessionTask

iOS 使用 NSURLSessionTask 将多个文件上传到服务器

重新运行失败的 NSURLSessionTask