Расширение общего доступа iOS не получает изображение

Я уверен, что это тривиально, если кто-то любезно укажет мне правильное направление, поэтому прошу прощения за глупый вопрос. Однако я искал дни, я не могу понять, что я делаю неправильно.

Сценарий: создайте простое расширение общего доступа, которое получает файл изображения.

Проблема: когда я получаю доступ к вложениям, обработчик никогда не вызывается, хотя я вижу «public.jpg» в itemProvider, но я не вижу, где будут данные?

Что я наделал:

1) defined NSExtensionActivationSupportsImageWithMaxCount = 1 as my only activation rule
2) added CoreMedia framework to the extension
3) added the same group to both app and app extension
4) made sure both have the group (1) in the entitlement
5) made sure both are using a certificate/app id with that group enabled
6) clean and rebuild several times to no avail.

Код:

- (void)didSelectPost {
/
for (NSExtensionItem *item in self.extensionContext.inputItems) {
    for (NSItemProvider *itemProvider in item.attachments) {
        if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypeImage]) {
I can hit this breakpoint --> [itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypeImage options:nil completionHandler:^(UIImage *image, NSError *error) {
but not this one --> photo = image;
            }];
            break;
        }
    }
}
.... and so on and so forth

person Andrea Mariotti    schedule 11.09.2015    source источник
comment
Поскольку вы указали, что ответ ниже правильный, вы должны отметить его как правильный. Я считаю, что вы можете даже получить несколько баллов SO.   -  person eric    schedule 18.01.2016


Ответы (1)


Вы не опубликовали свой полный код, но я подозреваю, что вы звоните completeRequestReturningItems:completionHandler: не в том месте:

НЕПРАВИЛЬНО:

- (void)didSelectPost {
        NSExtensionItem *item = self.extensionContext.inputItems.firstObject;
        NSItemProvider *itemProvider = item.attachments.firstObject;
        if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypeImage]) {
            [itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypeImage
                                            options:nil
                                  completionHandler:^(NSURL *url, NSError *error) {
                                      // send the image
                                  }];
        }
        // ↓ this is the wrong location ↓
        [self.extensionContext completeRequestReturningItems:@[] completionHandler:nil];
    }

Проблема в том, что вызов completeRequestReturningItems:completionHandler: немедленно закрывает ShareViewController и освобождает его. Таким образом, NSItemProvider, содержащий изображение, также уничтожается, прежде чем он сможет получить доступ к изображению (поскольку он загружает свои элементы асинхронно). Другими словами: обработчик завершения, в котором вы отправляете изображение на свой сервер, никогда не вызывается, потому что весь shareViewController уже освобожден.

Чтобы решить эту проблему, вы должны переместить вызов completeRequestReturningItems:completionHandler: в конец обработчика завершения ПОСЛЕ отправки изображения.

ПРАВИЛЬНО:

- (void)didSelectPost {
    NSExtensionItem *item = self.extensionContext.inputItems.firstObject;
    NSItemProvider *itemProvider = item.attachments.firstObject;
    if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypeImage]) {
        [itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypeImage
                                        options:nil
                              completionHandler:^(NSURL *url, NSError *error) {
                                  // send the image
                                  [self.extensionContext completeRequestReturningItems:@[]         
                                                                     completionHandler:nil];
                              }];
    }
}
person joern    schedule 04.10.2015
comment
Вы абсолютно правы. Я получил аналогичную подсказку на форуме разработчиков Apple. Благодарю вас! Для всех, кто читает это, просто следуйте указаниям Рене и убедитесь, что вы не отправляете полное сообщение запроса, пока не получите данные. - person Andrea Mariotti; 09.10.2015
comment
Рад, что это помогло вам. Пожалуйста, отметьте ответ как принятый, чтобы другие могли видеть, что он решил вашу проблему. - person joern; 09.10.2015
comment
Спасибо, Джорн. Хотя это не помогает моей проблеме, я ценю детали, которые вы предоставили спрашивающему. - person eric; 18.01.2016
comment
Спасибо! Это очень помогло! Я не должен был вызывать completeRequestReturningItems в конце didSelectPost, только внутри обработчика завершения. - person EternalLight; 06.11.2017
comment
проблема в том, что [itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypeImage не может вернуть изображение, несмотря на то, что completeRequestReturningItems указал правильное местоположение. - person evan; 17.06.2020
comment
еще одна вещь: я проверил свой код. если вы правильно установили местоположение completeRequestReturningItems. изображение вернется. так что completeRequestReturningItems должны быть правильными, как сказал @joern. - person evan; 18.06.2020