ios 应用扩展—— Action Extension

1 分钟阅读

截图1

转载请注明出处:http://mkapple.cn/2016/06/20/ActionExtension

1.干啥

任何场合下选择了一段英文,点击分享,使用 MKAction 打开可以翻译该文本。

2. 新建一个 iOS 项目,MKActionExtension

3. 新建 Action Extension

截图2

截图3

命名,完成。

修改运行时执行的主应用
截图4

在 Run 一项里选择运行时执行的主应用:
截图5
勾上 Debug executable
截图6

运行扩展看看:
截图7

默认提供了选取图片,并且显示图片的功能。

4. 获取输入数据

- (void)loadInputItems
{
    //1. 从扩展上下文获取 NSExtensionItem 数组
    NSArray<NSExtensionItem *> *itemArray = self.extensionContext.inputItems;
    
    //2. 从 NSExtensionItem 获取 NSItemProvider 数组
    NSExtensionItem *item = itemArray.firstObject;
    NSArray<NSItemProvider *> *providerArray = item.attachments;
    
    //3. 加载、获取数据
    NSItemProvider *itemProvider = providerArray.firstObject;
    if([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypePlainText]){
        [itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypePlainText options:nil completionHandler:^(NSString *text, NSError *error) {
            if(text) {
                [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                    originalTextView.text = text;
                    
                    //4. 翻译
                    [self youdaoTranslate:text complate:^(NSString *translateText) {
                        translateTextView.text = translateText;
                    }];
                }];
            }
        }];
    }
}

介绍几个属性和方法:

  • NSExtensionContext, 扩展上下文,可以获取进入扩展时的数据 ——inputItems, 元素类型为 NSExtensionItem 的数组。
  • NSExtensionItem, 扩展数据项,包含附件数组 —— attachments,元素类型为 NSItemProvider 的数组。
  • NSItemProvider,数据项的附件都封装在里面,要获取数据就要根据数据的 UTI 类型来加载获取附件。
  • NSItemProvider- (void)loadItemForTypeIdentifier:(NSString *)typeIdentifier options:(NSDictionary *)options completionHandler:(NSItemProviderCompletionHandler)completionHandler, 根据 UTI 类型来加载获取附件,

5. 翻译

利用 有道 API 提供的接口。

- (void)youdaoTranslate:(NSString *)text complate:(void (^)(NSString *))complate{
    NSURLSession *shareSession = [NSURLSession sharedSession];
    text = [text stringByReplacingOccurrencesOfString:@" " withString:@"%20"];
    NSString *urlStr = [NSString stringWithFormat:@"http://fanyi.youdao.com/openapi.do?keyfrom=%@&key=%@&type=data&doctype=json&version=1.1&q=%@", Keyfrom, YouDaoAPIkey, text];
    
    NSURLSessionDataTask *task = [shareSession dataTaskWithURL:[NSURL URLWithString: urlStr] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
        NSArray *resultArray = dic[@"translation"];
        
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            complate(resultArray[0]);
        }];
    }];
    [task resume];
}

演示: 滚回最顶看图 -.-

Demo:MKActionExtension

P.S. 喜欢就分享或者点个赞呗

更新: