如何调用动作扩展?

问题描述:

iOS SDK docs,的Action扩展可能会帮助用户编辑他们在文本编辑器中查看的文档中的图像。不过,我一直在试图谷歌示例如何做到这一点,只能找到如何创建附加应用程序,而不是如何使用他们在应用程序中的文章。如何调用动作扩展?

假设我正在为iOS编写一个文字处理应用程序。在应用程序中对具有嵌入图像的用户进行拍照,并且想要编辑图像(例如应用照片效果)。应用程序如何为用户在系统中安装的任何图像编辑应用程序提供图像,让它执行此操作,然后获取结果?

我想象的交互风格非常类似于Mac上的LinkBack。除了图像编辑器是应用程序扩展并显示为模式对话框(按照SDK指南)。

但是我无法找到任何代码的例子,显示:

  • 如何提供输入数据(例如图像)提供给动作扩展。
  • 如何调用动作扩展。
  • 如何获取动作扩展的输出数据(包括扩展生成的任何其他元数据或编辑信息)。
  • 如何以可识别的格式显示输出数据(例如,如果我给出了一个JPEG,我期望动作扩展会给出另一个JPEG作为结果)。

同时,我已经想出了如何做到这一点。它主要围绕UIActivityViewController旋转,并向控制器提供回调模块以接收动作扩展的结果。

以下示例使用Skitch作为测试操作扩展。

// get the source image 
UIImage* image = ...; 
NSArray* activityItems = @[image]; 
UIActivityViewController* activityCtrl = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil]; 
activityCtrl.completionWithItemsHandler = ^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError) { 
    [returnedItems enumerateObjectsUsingBlock:^(NSExtensionItem* _Nonnull item, NSUInteger idx, BOOL * _Nonnull stop1) { 
     [item.attachments enumerateObjectsUsingBlock:^(NSItemProvider* _Nonnull attachment, NSUInteger idx, BOOL * _Nonnull stop2) { 
      if ([attachment hasItemConformingToTypeIdentifier:(__bridge id)kUTTypeImage]) { 
       [attachment loadItemForTypeIdentifier:(__bridge id)kUTTypeImage options:nil completionHandler:^(UIImage* returnedImage, NSError * _Null_unspecified error) { 
        // returnedImage is the result of the action extension 
       }]; 
       *stop1 = YES; 
       *stop2 = YES; 
      } 
     }]; 
    }]; 
}; 

// assume that `self` is a UIViewController 
[self presentViewController:activityCtrl animated:YES completion:nil]; 

不幸的是行动扩展供应者都有点罕见,因此我无法测试出如何实际上可以产生图像的其它行动扩展交互。