2015-09-11 3 views
2

Я уверен, что это тривиально, как только кто-то любезно укажет мне в правильном направлении, чтобы извиниться за глупый вопрос. Однако я искал дни, я не могу понять, что я делаю неправильно.Расширение расширения 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 
+0

Как вы указали ответ ниже правильно, вы должны пометить его как правильный. Я считаю, что вы даже можете получить ТОЛЬКО ТОЧКИ. – eric

ответ

4

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

WRONG:

- (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]; 
           }]; 
    } 
} 
+0

Вы абсолютно правы. Я получил подобный намек на форум разработчиков Apple. Спасибо! Чтобы кто-либо еще читал это, просто следуйте инструкциям Рене и убедитесь, что вы не отправляете полное сообщение запроса, пока не получите данные. –

+0

Рад, что это вам помогло. Пожалуйста, отметьте ответ как принятый, чтобы другие могли видеть, что он решил вашу проблему. – joern

+0

Спасибо, joern. Хотя это не помогает моей проблеме, я ценю детали, которые вы предоставили задающему. – eric

Смежные вопросы