如何调用动作扩展?

Posted

技术标签:

【中文标题】如何调用动作扩展?【英文标题】:How to invoke action extensions? 【发布时间】:2015-09-07 12:58:53 【问题描述】:

来自ios SDK docs,Action 扩展可以帮助用户编辑他们在文本编辑器中查看的文档中的图像。但是,我一直在尝试在谷歌上搜索如何执行此操作的示例,并且只能找到有关如何创建应用扩展而不是如何在应用中使用它们的文章。

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于如何调用动作扩展?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Vuex/Vuejs 中的动作中调用另一个动作?

Vuex:如何正确调用动作?

《Unity3D动作游戏开发实战》如何扩展?

EmberJS 动作 - 当包装在“动作”中时从另一个动作调用一个动作

从扩展中获取当前控制器动作和 slug

如何将一个动作传递到视图中,并在按钮的动作中调用它?