如何调用动作扩展?
How to invoke action extensions?
来自 iOS SDK docs,Action 扩展可以帮助用户编辑他们正在文本编辑器中查看的文档中的图像。然而,我一直在尝试 google 举例说明如何做到这一点,但只能找到关于如何 创建 应用程序扩展的文章,而不是如何 使用 他们在应用程序中。
假设我正在为 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];
不幸的是,动作扩展提供者很少见,因此我无法测试它实际上是如何与其他可以生成图像的动作扩展交互的。
来自 iOS SDK docs,Action 扩展可以帮助用户编辑他们正在文本编辑器中查看的文档中的图像。然而,我一直在尝试 google 举例说明如何做到这一点,但只能找到关于如何 创建 应用程序扩展的文章,而不是如何 使用 他们在应用程序中。
假设我正在为 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];
不幸的是,动作扩展提供者很少见,因此我无法测试它实际上是如何与其他可以生成图像的动作扩展交互的。