Методы UIDocumentInteractionControllerDelegate, не вызываемые при открытии системных приложений, таких как Mail, Messages, Twitter или Facebook

Я использую UIDocumentInteractionController для совместного использования изображения в Instagram и других приложениях, таких как Whatsapp, Google Drive, Dropbox … (поскольку многие из вас уже знают, что изображения Instagram имеют расширения «.ig» или «.igo»). Если я разделяю picture.ig в других приложениях вместо Instagram, то картинки отображаются как файл, а не как изображение. Поэтому я реализую метод делегата:

- (void)documentInteractionController:(UIDocumentInteractionController *)controller willBeginSendingToApplication:(NSString *)application { if (![application isEqualToString:@"com.burbn.instagram"]) { NSURL *newPath; NSString *oldPathStr = [controller.URL absoluteString]; NSString *newPathStr = [oldPathStr stringByReplacingOccurrencesOfString:@"ig" withString:@"jpg"]; newPath = [NSURL URLWithString:newPathStr]; controller.URL = newPath; controller.UTI = @"public.jpeg"; }} 

Таким образом, если приложение не является Instagram, я мог бы поделиться другой версией файла в jpg (у меня есть и версии .ig и .jpg, хранящиеся на диске).

Но проблема в том, что DocumentInteractionController не вызывает этот метод делегата, когда я пытаюсь поделиться изображением с такими системными приложениями, как Mail, Messages, Twitter или Facebook, поэтому я не могу использовать URL-адрес jpg, а люди получают файл .ig в своих iPhones или ноутбуках, которые они не знают, как их открыть. Если я попытаюсь открыть другие приложения, такие как Whatsapp, проблем нет и вызывается делегат.

Вы знаете, как я могу взять под свой контроль это до того, как система откроет почтовый композитор, композитор сообщений или социальный композитор?

Огромное спасибо.

Я нахожу решение. Прежде всего, я настраиваю UIDocumentInteractionController

 - (void)setupDocumentControllerWithURL:(NSURL *)url { if (self.docInteractionController == nil) { self.docInteractionController = [UIDocumentInteractionController interactionControllerWithURL:url]; self.docInteractionController.delegate = self; } else { self.docInteractionController.URL = url; } } 

Затем откройте файл Instagram .ig с помощью docInteractionController, если вы откроете .jpg вместо файла .ig, тогда приложение Instagram не появится в меню «Открыть в приложении»

 //share the Instagram .ig picture fileURL [self setupDocumentControllerWithURL:fileURL]; [self.docInteractionController presentOptionsMenuFromRect:self.view.frame inView:self.view animated:YES]; 

Затем вам нужно изменить URL-адрес внутри метода делегата, чтобы позволить системным приложениям совместно использовать .jpg вместо файла с расширением .ig (только Instagram и несколько других приложений распознают файл .ig как изображение

 - (void)documentInteractionControllerWillPresentOptionsMenu:(UIDocumentInteractionController *)controller { NSURL *theUrl = controller.URL; NSString *theInstagramPath = theUrl.path; NSString *jpgPath = [theInstagramPath stringByReplacingOccurrencesOfString:@"ig" withString:@"jpg"]; NSURL *jpgURL = [NSURL fileURLWithPath:jpgPath]; controller.URL = jpgURL; } 

После этого приложение Mail, Messages, Twitter и Facebook (и не системные приложения) откроет файл как jpg. Но мы снова должны изменить URL-адрес, если хотим открыть файл внутри Instagram:

 - (void)documentInteractionController:(UIDocumentInteractionController *)controller willBeginSendingToApplication:(NSString *)application { //Check if the app that is calling is Instagram if ([application isEqualToString:@"com.burbn.instagram"]) { NSURL *newPath; NSString *oldPathStr = [controller.URL absoluteString]; NSString *newPathStr = [oldPathStr stringByReplacingOccurrencesOfString:@"jpg" withString:@"ig"]; newPath = [NSURL URLWithString:newPathStr]; controller.URL = newPath; }} 

И это все. Кажется, что willBeginSendingToApplication: не вызывается, если вы выбираете системное приложение в меню.

вы пропустили задание делегата вашего экземпляра UIDocumentInteractionController.

после создания UIDocumentInteractionController, выполните следующие действия:

  YourUIDocumentInteractionControllerObject.delegate = ObjectWhichHaswillBeginSendingToApplicationMethodImplementation;