一次iOS Extension(扩展)的实践

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

集成过程:

  • 1.File -->New -->Target
一次iOS Extension(扩展)的实践_第1张图片
new target.png
  • 2.填好名字等候点击next,下图为action extension目录结构
一次iOS Extension(扩展)的实践_第2张图片
dirStructure.png
  • 3.这里有几个主要涉及的类,这个方法处理寄主程序(这里为safari)传过来的数据
一次iOS Extension(扩展)的实践_第3张图片
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界面设计。
一次iOS Extension(扩展)的实践_第4张图片
StoryBoard.png
  • 5.设置App Group Capability,这个是在app和app之间共享数据的区域,是沙盒机制的补充。
一次iOS Extension(扩展)的实践_第5张图片
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的本地化名字
一次iOS Extension(扩展)的实践_第6张图片
  • 8.设置extension 的version必须和host app一致。
一次iOS Extension(扩展)的实践_第7张图片
version.png

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

你可能感兴趣的:(一次iOS Extension(扩展)的实践)