如果不习惯看解析的可以直接下载demo
https://github.com/sunGd/AppExtensionDemo
关于appExtension的简介以及交互流程, 已经在第一篇文章中说过 http://blog.youkuaiyun.com/zhao18933/article/details/36628295
这篇文章直接介绍如何建立一个简单的action类扩展, 并完成简单的交互和数据处理
1.建立一个action扩展
2.如何调用action扩展
#import <MobileCoreServices/MobileCoreServices.h>
// 这里是你要传入到action中的参数
NSArray *itemArray = @[[UIImage imageNamed:@"1.jpg"],@"demoLogo"];
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:itemArray applicationActivities:nil];
[self presentViewController:activityViewController animated:YES completion:nil];
3.action扩展中如何接收数据
for (NSExtensionItem *item in self.extensionContext.inputItems) {
for (NSItemProvider *itemProvider in item.attachments) {
if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypeImage]) {
// This is an image. We'll load it, then place it in our image view.
__weak UIImageView *imageView = self.imageView;
[itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypeImage options:nil completionHandler:^(UIImage *image, NSError *error) {
// 获取图片
if(image) {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[imageView setImage:image];
}];
}
}];
continue;
}
if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypeText]) {
__weak UILabel *label = self.label;
[itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypeText options:nil completionHandler:^(id<NSSecureCoding> item, NSError *error) {
// 获取文字
if (item) {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
label.text = (NSString *)item;
}];
}
}];
}
}
}
4.回调到host app
UIImage *image = [_containerView cutTheLayerToImage];
NSExtensionItem* extensionItem = [[NSExtensionItem alloc] init];
// 回传数据, item可以是多个附件
[extensionItem setAttachments:@[[[NSItemProvider alloc] initWithItem:@[image,@"success"] typeIdentifier:(NSString*)kUTTypeImage]]];
// 这里也可以是多个extensionItem
[self.extensionContext completeRequestReturningItems:@[extensionItem] completionHandler:nil];
[activityViewController setCompletionWithItemsHandler:^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError * error){
if([returnedItems count] > 0){
// 这里只取一个item, 可根据实际情况来决定
NSExtensionItem* extensionItem = [returnedItems firstObject];
// 这里只取第一个附件 image, 可以根据实际情况修改
NSItemProvider* imageItemProvider = [[extensionItem attachments] firstObject];
if([imageItemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypeImage]){
[imageItemProvider loadItemForTypeIdentifier:(NSString *)kUTTypeImage options:nil completionHandler:^(UIImage *item, NSError *error) {
if(item && !error){
dispatch_async(dispatch_get_main_queue(), ^{
[self.imageView setImage:item];
});
}
}];
}
}
}];