Конфигурация фонового сеанса 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 9

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.