适用于iOS 8扩展的AFNetworking后台会话配置

时间:2014-08-22 02:27:08

标签: ios objective-c afnetworking ios8 nsurlsession

我目前正在开发iOS 8 App扩展程序,并且最后一篇文章很难处理。在我的应用程序的其余部分中,我使用AFHTTPSessionManager子类,我实例化如下:

+ (MYAPIClient *)sharedClient {
    static MYAPIClient *_sharedClient = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedClient = [[MYAPIClient alloc] initWithBaseURL:[NSURL URLWithString:kMYBaseURL]];
        _sharedClient.requestSerializer = [[MYAPIRequestSerializer alloc] init];
        _sharedClient.responseSerializer = [[MYAPIResponseSerializer alloc] init];
    });
    return _sharedClient;
}

当我刚刚使用这个常规API客户端时,只需在共享扩展中发布一些文本就可以了,它甚至可以用于图像(虽然通常会失败),但我知道我需要使用后台会话配置。所以我用这样的后台配置设置了一个非常相似的api客户端:

+ (MYAPIClient *)sharedBackgroundClient {
    static MYAPIClient *_sharedClient = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{

        NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.me.myapp.backgroundconfiguration"];
        _sharedClient = [[MYAPIClient alloc] initWithBaseURL:[NSURL URLWithString:kMYBaseURL] sessionConfiguration:sessionConfiguration];
        _sharedClient.requestSerializer = [[MYAPIRequestSerializer alloc] init];
        _sharedClient.responseSerializer = [[MYAPIResponseSerializer alloc] init];
    });
    return _sharedClient;
}

问题是,当我使用这个客户端进行POST时,我每次都会得到这些错误。

Aug 21 19:19:07 MY-iPhone Share[6290] <Notice>: Attempted to create a task in a session that has been invalidated
Aug 21 19:19:07 MY-iPhone Share[6290] <Warning>: *** Assertion failure in -[MYAPIClient setDelegate:forTask:], /Users/me/Documents/myproject/myproduct/Pods/AFNetworking/AFNetworking/AFURLSessionManager.m:337
Aug 21 19:19:07 MY-iPhone Share[6290] <Error>: *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid parameter not satisfying: task' 

有关如何使其发挥作用的任何建议?非常感谢。

2 个答案:

答案 0 :(得分:12)

来自the docs

  

如果您的应用扩展程序启动后台NSURLSession任务,您还必须设置扩展程序及其包含应用程序都可以访问的共享容器。使用NSURLSessionConfiguration类的sharedContainerIdentifier属性指定共享容器的标识符,以便以后可以访问它。

  

如果您尝试使用从应用扩展程序创建URL会话但未能将此属性设置为有效值,则URL会话在创建时将失效。

有关设置共享容器的指导,请参阅Sharing Data with Your Containing App

在您的示例中,您将添加以下内容:

sessionConfiguration.sharedContainerIdentifier = @“com.me.myapp.containerIdentifier”;

您需要一个包含应用的后台会话和一个用于其扩展的后台会话。

答案 1 :(得分:1)

确保您的sharedContainerIdentifier与您为主机应用和扩展应用注册的组标识符相同。

config.sharedContainerIdentifier = @“com.mycompany.myappgroupidentifier”;

您可以在Xcode功能项目选项卡中注册组标识符。