iOS App实现PDF文件下载和存储到"文件"中
在iOS中可以通过UIActivityViewController来实现文件内容的分享,包括但不限于:AirDrop(隔空送投)分享,微信/QQ/钉钉等其他途径的分享,文件打印,存储到“文件“中等,本文就主要介绍这种方式将PDF文件存储到”文件“中
如果需要把沙盒的Documents目录暴露在“文件”中,可以通过在info.plist中添加配置项
<key>UIFileSharingEnabled</key>
<true/>
<key>LSSupportsOpeningDocumentsInPlace</key>
<true/>
1.UIFileSharingEnabled
:
设置为
2.LSSupportsOpeningDocumentsInPlace
:
设置为
下面是文件分享部分,我们就可以通过UIActivityViewController来实现应用之间文件共享了,大致思路就是发起分享动作时先判断PDF文件是否已经下载到了本地,如果已下载直接发起分享,如果未下载,先下载文件,再分享文件。在分享页面选择分享的途径,如果要分享到“文件”中,选择下面的存储到“文件”按钮,然后选择存储的路径,下次打开“文件”App时,即可看到下载的PDF文件了,以下是代码部分,仅供参考:
/// 分享pdf
-(void)sharePdf{
/// 先查询是否已经下载如果已经下载 直接分享 如果未下载,现在pdf再分享到直接位置
[self downloadAndShare];
}
- (void)downloadAndShare {
/// 获取pdf名字
NSString *pdfFileName = self.wkWebView.URL.lastPathComponent;
/// 查询文件是否已经存在
if (![self pdfFileExistsWithName:pdfFileName]) {
/// 获取下载链接
NSURL *pdfURL = [NSURL URLWithString:self.wkWebView.URL.absoluteString];
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];
__weak typeof(self) weakself =self;
NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithURL:pdfURL completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
if (error) {
NSLog(@"PDF文件下载失败: %@", error);
} else {
NSString *destinationPath = [self pathForPDFFileWithName:pdfFileName];
NSURL *destinationURL = [NSURL fileURLWithPath:destinationPath];
NSError *moveError;
[[NSFileManager defaultManager] moveItemAtURL:location toURL:destinationURL error:&moveError];
if (moveError) {
NSLog(@"下载PDF完成移动在指定路径失败: %@", moveError);
} else {
NSLog(@"PDF文件下载成功并保存到指定路径: %@", destinationURL);
/// 发起分享
[weakself startToSharePdf:pdfFileName];
}
}
}];
[downloadTask resume];
}else{
// 发起分享
[self startToSharePdf:pdfFileName];
}
}
-(void)startToSharePdf:(NSString *)pdfFileName{
NSArray *activityItems = @[[NSURL fileURLWithPath:[self pathForPDFFileWithName:pdfFileName]]];
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil];
[self presentViewController:activityViewController animated:YES completion:nil];
}
- (NSString *)pathForPDFFileWithName:(NSString *)fileName {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths firstObject];
return [documentsDirectory stringByAppendingPathComponent:fileName];
}
- (BOOL)pdfFileExistsWithName:(NSString *)fileName {
NSString *filePath = [self pathForPDFFileWithName:fileName];
return [[NSFileManager defaultManager] fileExistsAtPath:filePath];
}