Конфигурация фонового сеанса AFNetworking для расширения iOS 8
В настоящее время я разрабатываю расширение для 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-клиент, просто разместив некоторую текстовую форму, расширение общего доступа работало нормально, и иногда оно даже работает для изображений (обычно это не удается), но я знаю, что мне нужно использовать конфигурацию фоновой сессии. Поэтому я сделал очень похожий 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;
}
Проблема в том, что когда я делаю свой пост с помощью этого клиента, я получаю эти ошибки каждый раз.
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 ответа:
Из документов:
Если расширение вашего приложения инициирует фон
NSURLSession
задача, вы также должны настроить общий контейнер, к которому могут получить доступ как расширение, так и содержащее его приложение. ИспользуйтеsharedContainerIdentifier
свойство классаNSURLSessionConfiguration
для указания идентификатора общего контейнера, чтобы вы могли получить к нему доступ позже.И:
Если вы попытаетесь использовать create a URL session from your app extension, но не сможете установить этому свойству значение a допустимое значение, url-сессия недействительна при создании.
См.разделсовместное использование данных с содержащим их приложением для получения инструкций по настройке общего контейнера.
В вашем примере вы бы добавили что-то вроде:
sessionConfiguration.sharedContainerIdentifier = @“com.me.myapp.containerIdentifier”;
Вам понадобится один фоновый сеанс для содержащего приложения и один для его расширения.
Убедитесь, что ваш sharedContainerIdentifier является тем же идентификатором, что и идентификатор группы, зарегистрированный для вашего хост-приложения и приложения расширения.
config.sharedContainerIdentifier = @“com.mycompany.myappgroupidentifier”;
Идентификатор группы можно зарегистрировать на вкладке Xcode capabilities project.