序言: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地址,可以直接拖入项目简单配置就可以使用该功能。
网友评论