IOS8 APP Extension2--action

本文详细介绍如何创建iOS中的Action扩展,并实现基本的交互与数据处理。包括建立Action扩展、调用扩展的方法、接收传递的数据及如何将处理结果回调给宿主应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果不习惯看解析的可以直接下载demo

https://github.com/sunGd/AppExtensionDemo

关于appExtension的简介以及交互流程, 已经在第一篇文章中说过 http://blog.youkuaiyun.com/zhao18933/article/details/36628295

这篇文章直接介绍如何建立一个简单的action类扩展, 并完成简单的交互和数据处理


1.建立一个action扩展

在xcode菜单中依次选择

然后target类型选择app extension

建立好以后,会多了一个action类型的target, 还有相应的文件

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];

首次使用可能自定义的action会被隐藏到更多选项里面, 这时候需要自己去调整action的顺序

按住并且拖动以修改顺序

3.action扩展中如何接收数据

可以在主界面调用viewDidLoad的时候读取数据

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;

                        }];

                    }

                }];

            }

        }

    }

然后可以利用action模块去完成你要做的事情,把数据处理完以后, 在结束extension生命周期时, 可以将结果数据回调到host app

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];


然后host app需要提取由action extension返回的数据

[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];

                            

                        });

                        

                    }

                    

                }];

                

            }

            

        }

        

    }];





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值