用于iOS 8扩展的AFNetworking后台会话configuration

我目前正在开发一个iOS 8的应用程序扩展,并有这个最后一块的困难。 在我的应用程序的其余部分中,我使用了一个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客户端时,只是发布一些文本forms的共享扩展工作得很好,它甚至有时对图像有效(通常会失败),但我知道我需要使用后台会话configuration。 所以我做了一个非常类似的API客户端,像这样的背景configuration设置:

 + (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' 

任何build议如何让这个工作? 非常感谢。

从文档 :

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

和:

如果您尝试使用您的应用扩展程序创buildURL会话,但无法将此属性设置为有效值,那么创build后URL会话将失效。

有关设置共享容器的指导,请参阅与您的应用程序共享数据 。

在你的例子中,你会添加如下内容:

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

您将需要一个后台会话为包含应用程序和一个为其扩展。

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

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

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