如何调用动作扩展?

时间:2015-09-07 12:58:53

标签: ios cocoa-touch ios-app-extension

iOS SDK docs操作扩展程序可以帮助用户编辑他们在文本编辑器中查看的文档中的图像。但是我一直试图谷歌如何做到这一点的例子,只能找到有关如何创建应用扩展程序的文章,而不是如何在应用程序中使用。< / p>

假设我正在为iOS编写文字处理应用程序。想象用户在应用程序中具有嵌入图像并且想要编辑图像(例如,应用照片效果)。应用程序如何将提供图像到用户在系统中安装的任何图像编辑应用程序,让它做到这一点,然后接收结果?

我认为交互风格与Mac上的LinkBack非常相似。除了图像编辑器是应用程序扩展并显示为模式对话框(根据SDK指南)。

但是我找不到任何显示的代码示例:

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

1 个答案:

答案 0 :(得分:0)

与此同时,我发现了如何做到这一点。它主要围绕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];

不幸的是,动作扩展提供程序有点罕见,因此我无法测试它实际上如何与可以生成图像的其他动作扩展进行交互。