iOS文件預(yù)覽分享小技能示例
前言
應(yīng)用場景:文件下載、打印

I 第三方SDK分享文件

1.1 微信SDK
/**
enum WXScene {
WXSceneSession = 0,
WXSceneTimeline = 1,
WXSceneFavorite = 2,
};
文件真實(shí)數(shù)據(jù)內(nèi)容
* @note 大小不能超過10M
*/
@property (nonatomic, retain) NSData *fileData;
*/
- (void)sendFileContent
{
WXMediaMessage *message = [WXMediaMessage message];
message.title = @"ML.pdf";
message.description = @"Pro CoreData";
[message setThumbImage:[UIImage imageNamed:@"res2.jpg"]];
WXFileObject *ext = [WXFileObject object];
ext.fileExtension = @"pdf";
NSString* filePath = [[NSBundle mainBundle] pathForResource:@"ML" ofType:@"pdf"];
ext.fileData = [NSData dataWithContentsOfFile:filePath];
//+ (nullable instancetype)dataWithContentsOfURL:(NSURL *)url;
message.mediaObject = ext;
SendMessageToWXReq* req = [[[SendMessageToWXReq alloc] init]autorelease];
req.bText = NO;
req.message = message;
req.scene = WXSceneSession;
[WXApi sendReq:req completion:nil];
}
1.2 友盟SDK
#pragma mark - UMFileObject /*! @brief 多媒體消息中包含的文件數(shù)據(jù)對(duì)象 * * @see UMShareObject */ @interface UMShareFileObject : UMShareObject /** 文件后綴名 * @note 長度不超過64字節(jié) */ @property (nonatomic, retain) NSString *fileExtension; /** 文件真實(shí)數(shù)據(jù)內(nèi)容 * @note 大小不能超過10M */ @property (nonatomic, retain) NSData *fileData; /** 文件的名字(不包含后綴) * @note 長度不超過64字節(jié) */ @property (nonatomic, retain) NSString *fileName; @end
II 原生API的文件預(yù)覽及其他應(yīng)用打開
- (BOOL)presentOptionsMenuFromRect:(CGRect)rect inView:(UIView *)view animated:(BOOL)animated; - (BOOL)presentOptionsMenuFromBarButtonItem:(UIBarButtonItem *)item animated:(BOOL)animated; // Bypasses the menu and opens the full screen preview window for the item at URL. Returns NO if the item could not be previewed. // Note that you must implement the delegate method documentInteractionControllerViewControllerForPreview: to preview the document. - (BOOL)presentPreviewAnimated:(BOOL)animated;//預(yù)覽文件 // Presents a menu allowing the user to open the document in another application. The menu // will contain all applications that can open the item at URL. // Returns NO if there are no applications that can open the item at URL. - (BOOL)presentOpenInMenuFromRect:(CGRect)rect inView:(UIView *)view animated:(BOOL)animated;//包括快速預(yù)覽菜單、打印、復(fù)制 - (BOOL)presentOpenInMenuFromBarButtonItem:(UIBarButtonItem *)item animated:(BOOL)animated;//不包括包括快速預(yù)覽菜單
- 獲取NSURL
//方式1:
NSString* filePath = [[NSBundle mainBundle] pathForResource:@"ML" ofType:@"pdf"];
NSURL *url = [NSURL fileURLWithPath:filePath];
// 方式2
//NSURL *url = [[NSBundle mainBundle] URLForResource:@"ML" withExtension:@"pdf"];
- 實(shí)例化UIDocumentInteractionController
UIDocumentInteractionController *documentController = [UIDocumentInteractionController interactionControllerWithURL:url]; documentController.delegate = self;//UIDocumentInteractionControllerDelegate
2.1 預(yù)覽文件
[documentController presentPreviewAnimated:YES]; // 預(yù)覽文件

2.2 文件分享
CGRect rect = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
[documentController presentOptionsMenuFromRect:rect inView:self.view animated:YES];//包括快速預(yù)覽菜單、打印、復(fù)制
// [documentController presentOpenInMenuFromRect:rect inView:self.view animated:YES];//不包括包括快速預(yù)覽菜單

2.3 控制是否顯示copy、 print、saveToCameraRoll
#pragma mark - UIDocumentInteractionControllerDelegate
- (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)interactionController{
return self;
}
//
/**
print: saveToCameraRoll: copy:
*/
- (BOOL)documentInteractionController:(UIDocumentInteractionController *)controller canPerformAction:(SEL)action{
NSLog(@"canPerformAction %s %@ ", __func__,NSStringFromSelector(action));
//NSStringFromSelector(_cmd) //當(dāng)前選擇器的名字
// return NO;不顯示copy print
return YES;//顯示copy print
}
- (BOOL)documentInteractionController:(UIDocumentInteractionController *)controller performAction:(SEL)action{
NSLog(@"canPerformAction %s", __func__);
return YES;//顯示copy print
// return NO;
}
III 案例
3.1 文件下載和預(yù)覽
- (void)openfile:(CRMfilePreviewCellM*)m{
// NSURL *relativeToURL = [NSURL URLWithString:m.url ];//必須先下載,否則無法查看文件內(nèi)容
[SVProgressHUD showWithStatus:@"加載中..."];
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:m.url]];
[SVProgressHUD dismiss];
if(data== nil){
[SVProgressHUD showInfoWithStatus:@"文件下載失敗"];
return ;
}
// //用單例類 NSFileManager的對(duì)象,將文件寫入本地
NSFileManager *fileManage = [NSFileManager defaultManager];
NSString *tmp = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
// NSString *tmp = NSTemporaryDirectory();
NSString *fileName = m.fileName;
tmp =[tmp stringByAppendingPathComponent:fileName];
BOOL isSuccess = [fileManage createFileAtPath:tmp contents:data attributes:nil];
if(isSuccess){
NSURL *url = [NSURL fileURLWithPath:tmp];
UIDocumentInteractionController *documentController = [UIDocumentInteractionController interactionControllerWithURL:url];
//UIDocumentInteractionController delegate must implement documentInteractionControllerViewControllerForPreview: to allow preview
documentController.delegate = self;//UIDocumentInteractionControllerDelegate
[documentController presentPreviewAnimated:YES]; // 預(yù)覽文件
}
}
#pragma mark - UIDocumentInteractionControllerDelegate
- (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)interactionController{
return self;
}
//
/**
print: saveToCameraRoll: copy:
*/
- (BOOL)documentInteractionController:(UIDocumentInteractionController *)controller canPerformAction:(SEL)action{
NSLog(@"canPerformAction %s %@ ", __func__,NSStringFromSelector(action));
//NSStringFromSelector(_cmd) //當(dāng)前選擇器的名字
// return NO;不顯示copy print
return YES;//顯示copy print
}
- (BOOL)documentInteractionController:(UIDocumentInteractionController *)controller performAction:(SEL)action{
NSLog(@"canPerformAction %s", __func__);
return YES;//顯示copy print
// return NO;
}
3.2 使用數(shù)據(jù)模型保存下載文件路徑
懶加載
// NSURL *relativeToURL = [NSURL URLWithString:m.url ];//必須先下載,否則無法查看文件內(nèi)容
- (NSString *)filePathFromUrl{
if(_filePathFromUrl !=nil){
return _filePathFromUrl;
}
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:self.url]];
if(data== nil){
[SVProgressHUD showInfoWithStatus:@"文件下載失敗"];
return nil;
}
// //用單例類 NSFileManager的對(duì)象,將文件寫入本地
NSFileManager *fileManage = [NSFileManager defaultManager];
NSString *tmp = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
// NSString *tmp = NSTemporaryDirectory();
NSString *fileName = self.fileName;
tmp =[tmp stringByAppendingPathComponent:fileName];
BOOL isSuccess = [fileManage createFileAtPath:tmp contents:data attributes:nil];
_filePathFromUrl = tmp;
if(!isSuccess){
_filePathFromUrl = nil;
}
return _filePathFromUrl;
}
預(yù)覽文件
- (void)openfile:(CRMfilePreviewCellM*)m{
if(!m.filePathFromUrl){
return;
}
NSURL *url = [NSURL fileURLWithPath:m.filePathFromUrl];
UIDocumentInteractionController *documentController = [UIDocumentInteractionController interactionControllerWithURL:url];
//UIDocumentInteractionController delegate must implement documentInteractionControllerViewControllerForPreview: to allow preview
documentController.delegate = self;//UIDocumentInteractionControllerDelegate
[documentController presentPreviewAnimated:YES]; // 預(yù)覽文件
}
3.3 使用數(shù)據(jù)模型分享文件

@property (nonatomic,copy) NSString *fileName;
@property (nonatomic,copy) NSString *url;
//
@property (nonatomic,copy) NSString *filePathFromUrl;
/**
/** 文件真實(shí)數(shù)據(jù)內(nèi)容
* @note微信文件分享 大小不能超過10M
*/
@property (nonatomic, retain) NSData *fileData;
- (void)sendFileContent;
- (NSData *)fileData{
if(_fileData==nil){
NSString* filePath= [self filePathFromUrl];
_fileData =[NSData dataWithContentsOfFile:filePath];
}
return _fileData;
}
- (void)sendFileContent
{
WXMediaMessage *message = [WXMediaMessage message];
message.title = self.fileName;
message.description =self.fileName;
[message setThumbImage:[UIImage imageNamed:self.iconName]];
WXFileObject *ext = [WXFileObject object];
ext.fileExtension =self.fileExtension;
ext.fileData =self.fileData;
//+ (nullable instancetype)dataWithContentsOfURL:(NSURL *)url;
message.mediaObject = ext;
SendMessageToWXReq* req = [[SendMessageToWXReq alloc] init];
req.bText = NO;
req.message = message;
req.scene = WXSceneSession;
[WXApi sendReq:req completion:nil];
}
3.4 清理緩存
獲取沙盒緩存路徑
+ (nullable NSString *)userCacheDirectory {
NSArray<NSString *> *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
return paths.firstObject;
}
清理沙河文件緩存
- (void)removeAllData {
[self.fileManager removeItemAtPath:self.diskCachePath error:nil];
[self.fileManager createDirectoryAtPath:self.diskCachePath
withIntermediateDirectories:YES
attributes:nil
error:NULL];
}
清理WKWebView的緩存
+ (void)clearWebCacheCompletion:(dispatch_block_t)completion {
if (@available(iOS 9.0, *)) {
NSSet *websiteDataTypes = [WKWebsiteDataStore allWebsiteDataTypes];
NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];
[[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:completion];
} else {
NSString *libraryDir = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES)[0];
NSString *bundleId = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIdentifier"];
NSString *webkitFolderInLib = [NSString stringWithFormat:@"%@/WebKit",libraryDir];
NSString *webKitFolderInCaches = [NSString stringWithFormat:@"%@/Caches/%@/WebKit",libraryDir,bundleId];
NSString *webKitFolderInCachesfs = [NSString stringWithFormat:@"%@/Caches/%@/fsCachedData",libraryDir,bundleId];
NSError *error;
/* iOS8.0 WebView Cache path */
[[NSFileManager defaultManager] removeItemAtPath:webKitFolderInCaches error:&error];
[[NSFileManager defaultManager] removeItemAtPath:webkitFolderInLib error:nil];
/* iOS7.0 WebView Cache path */
[[NSFileManager defaultManager] removeItemAtPath:webKitFolderInCachesfs error:&error];
if (completion) {
completion();
}
}
}
清理圖片緩存
+(void)clearCache:(NSString *)path{
NSFileManager *fileManager=[NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:path]) {
NSArray *childerFiles=[fileManager subpathsAtPath:path];
for (NSString *fileName in childerFiles) {
//如有需要,加入條件,過濾掉不想刪除的文件
NSString *absolutePath=[path stringByAppendingPathComponent:fileName];
[fileManager removeItemAtPath:absolutePath error:nil];
}
}
// [[SDImageCache sharedImageCache] cleanDisk];
[[SDImageCache sharedImageCache] clearDiskOnCompletion:^{
}];
}
以上就是iOS文件預(yù)覽分享小技能示例的詳細(xì)內(nèi)容,更多關(guān)于iOS文件預(yù)覽分享的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
IOS開發(fā)UIPasteboard類的粘貼板全面詳解
這篇文章主要為大家介紹了IOS開發(fā)UIPasteboard類的粘貼板全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
iOS基于UITableView實(shí)現(xiàn)多層展開與收起
這篇文章主要為大家詳細(xì)介紹了iOS基于UITableView實(shí)現(xiàn)多層展開與收起的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
iOS App開發(fā)中Masonry布局框架的基本用法解析
這篇文章主要介紹了iOS App開發(fā)中Masonry布局框架的基本用法解析,Masonry支持iOS和OSX的Auto Layout,在GitHub上的人氣很高,需要的朋友可以參考下2016-03-03
深入解析設(shè)計(jì)模式中的裝飾器模式在iOS應(yīng)用開發(fā)中的實(shí)現(xiàn)
這篇文章主要介紹了設(shè)計(jì)模式中的裝飾器模式在iOS應(yīng)用開發(fā)中的實(shí)現(xiàn),包括對(duì)分類和委托的深入講解,需要的朋友可以參考下2016-03-03

