UIDocumentInteractionControllerDelegate在打开系统应用程序(如邮件,消息,Twitter或Facebook)时未调用的方法

时间:2014-06-20 11:33:21

标签: ios iphone objective-c facebook uidocumentinteraction

我正在使用UIDocumentInteractionController在Instagram和Whatsapp,Google Drive,Dropbox等其他应用程序中共享图片...(很多人都知道Instagram图片有“.ig”或“.igo”文件扩展名)。如果我在其他应用程序而不是Instagram上共享picture.ig,那么图片就像文件一样,而不是图片。所以我实现了委托方法:

- (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版本存储在磁盘中)。

但问题是,当我尝试与邮件,消息,Twitter或Facebook等系统应用程序共享图片时,DocumentInteractionController不会调用此委托方法,因此我无法使用jpg URL并且人们收到了他们的iPhone或笔记本电脑中的.ig文件,他们不知道如何打开。如果我尝试打开像Whatsapp这样的其他应用程序,则没有任何问题,并且会调用该委托。

你知道在系统打开邮件编辑器,邮件编辑器或社交作曲家之前我怎么能控制它?

非常感谢你。

2 个答案:

答案 0 :(得分:4)

我找到了解决方案。首先,我配置一个UIDocumentInteractionController

- (void)setupDocumentControllerWithURL:(NSURL *)url {

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

然后用docInteractionController打开Instagram .ig文件,如果你打开.jpg而不是.ig文件,那么Instagram应用程序就不会出现在" Open In App"菜单

//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;
}

在该邮件应用程序之后,消息,Twitter和Facebook(以及非系统应用程序)将以jpg打开该文件。但是如果我们想在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:。

答案 1 :(得分:0)

您错过了设置UIDocumentInteractionController实例的委托。

创建UIDocumentInteractionController之后

执行此操作

   YourUIDocumentInteractionControllerObject.delegate = ObjectWhichHaswillBeginSendingToApplicationMethodImplementation;