如何调用动作扩展?

How to invoke action extensions?

来自 iOS SDK docsAction 扩展可以帮助用户编辑他们正在文本编辑器中查看的文档中的图像。然而,我一直在尝试 google 举例说明如何做到这一点,但只能找到关于如何 创建 应用程序扩展的文章,而不是如何 使用 他们在应用程序中。

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

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

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

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

不幸的是,动作扩展提供者很少见,因此我无法测试它实际上是如何与其他可以生成图像的动作扩展交互的。