美文网首页
一次iOS Extension(扩展)的实践

一次iOS Extension(扩展)的实践

作者: yehkong | 来源:发表于2017-07-13 18:12 被阅读0次

    序言:Extension是iOS 8中引入的一个非常重要的新特性,这里记录一次action extension的集成过程。该action extension是把web网页转换成pdf文档并保存到我们自己的App中,功能跟苹果原生的把网页保存pdf到ibooks一样。
    下载Demo-github地址

    集成过程:

    • 1.File -->New -->Target
    new target.png
    • 2.填好名字等候点击next,下图为action extension目录结构
    dirStructure.png
    • 3.这里有几个主要涉及的类,这个方法处理寄主程序(这里为safari)传过来的数据
    viewDidLoad.png
    • NSExtensionContext 扩展上下文;对应self(viewController)的extensionContext(NSExtensionContext)属性。
    • NSExtensionItem 扩展的项目内容;对应extensionContext的inputItems属性,这是个数组。
    • NSItemProvider 项目的提供者抽象化;通过extensionItem的attachments属性或者,这也是个数组。
    • 通过NSItemProvider的实例方法获得具体的项目数据。
     -(void)loadItemForTypeIdentifier:(NSString *)typeIdentifier options:(nullable NSDictionary *)options completionHandler:(nullable NSItemProviderCompletionHandler)completionHandler;
    
    • 4.完善extension UI界面设计。
    StoryBoard.png
    • 5.设置App Group Capability,这个是在app和app之间共享数据的区域,是沙盒机制的补充。
    appgroup.png
    • 6.在App Group中进行数据的处理和存取,已到达数据的共享和传输。
    -(IBAction)saveToPdf:(UIBarButtonItem *)sender {
        self.coverView.backgroundColor = [[UIColor whiteColor]colorWithAlphaComponent:0.2];
        self.coverView.hidden = NO;
    
        NSUserDefaults * extensionDefault = [[NSUserDefaults alloc]initWithSuiteName:@"group.yehkong"];
        
        NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]init];
        [dateFormatter setDateFormat:@"HHmmss"];
        NSString * fileName = [dateFormatter stringFromDate:[NSDate date]];
        
        NSString * ktitle = [self.webView stringByEvaluatingJavaScriptFromString:@"document.title"];
        fileName = [NSString stringWithFormat:@"%@-%@",ktitle,fileName];
        
        NSDictionary * infoDict = [[NSDictionary alloc]initWithObjectsAndKeys:fileName, @"fileName", nil];
        NSMutableArray * mutableArray = [[extensionDefault objectForKey:@"infos"]mutableCopy];
        if (!mutableArray) {
            mutableArray = [NSMutableArray array];
        }
    
        [mutableArray addObject:infoDict];
        [extensionDefault setObject:[mutableArray copy] forKey:@"infos"];
        [extensionDefault synchronize];
       
        NSData * data = [self.webView pdfDataWithSize:kPaperSizeA4];
    
        NSURL * storeUrl = [[NSFileManager defaultManager]containerURLForSecurityApplicationGroupIdentifier:@"group.yehkong"];
        NSURL * fileUrl = [storeUrl URLByAppendingPathComponent:[NSString stringWithFormat:@"%@.PDF",fileName]];
        if (data) {
            [data writeToURL:fileUrl  atomically:YES];
        }
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [self.extensionContext completeRequestReturningItems:self.extensionContext.inputItems completionHandler:nil];
        });   
     }
    
    
    • 7.设置extension的本地化名字
    • 8.设置extension 的version必须和host app一致。
    version.png

    总结:action extension主要的集成步骤就是这些,但是实际运用过程中还有很多小细节,具体参见demo-github地址,可以直接拖入项目简单配置就可以使用该功能。

    相关文章

      网友评论

          本文标题:一次iOS Extension(扩展)的实践

          本文链接:https://www.haomeiwen.com/subject/zifvhxtx.html