我目前正在开发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'
有关如何使其发挥作用的任何建议?非常感谢。
答案 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功能项目选项卡中注册组标识符。