iOS文件预览分享小技能示例

目录
  • 前言
  • I 第三方SDK分享文件
    • 1.1 微信SDK
    • 1.2 友盟SDK
  • II 原生API的文件预览及其他应用打开
    • 2.1 预览文件
    • 2.2 文件分享
    • 2.3 控制是否显示copy、 print、saveToCameraRoll
  • III 案例
    • 3.1 文件下载和预览
    • 3.2 使用数据模型保存下载文件路径
    • 3.3 使用数据模型分享文件
    • 3.4 清理缓存

前言

应用场景:文件下载、打印

I 第三方SDK分享文件

1.1 微信SDK

/**
enum WXScene {
    WXSceneSession  = 0,
    WXSceneTimeline = 1,
    WXSceneFavorite = 2,
};
文件真实数据内容
 * @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 多媒体消息中包含的文件数据对象
 *
 * @see UMShareObject
 */
@interface UMShareFileObject : UMShareObject
/** 文件后缀名
 * @note 长度不超过64字节
 */
@property (nonatomic, retain) NSString  *fileExtension;
/** 文件真实数据内容
 * @note 大小不能超过10M
 */
@property (nonatomic, retain) NSData    *fileData;
/** 文件的名字(不包含后缀)
 * @note 长度不超过64字节
 */
@property (nonatomic, retain) NSString  *fileName;
@end

II 原生API的文件预览及其他应用打开

- (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;//预览文件
// 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;//包括快速预览菜单、打印、复制
- (BOOL)presentOpenInMenuFromBarButtonItem:(UIBarButtonItem *)item animated:(BOOL)animated;//不包括包括快速预览菜单
  • 获取NSURL
//方式1:
    NSString* filePath = [[NSBundle mainBundle] pathForResource:@"ML" ofType:@"pdf"];
NSURL *url = [NSURL fileURLWithPath:filePath];
// 方式2
    //NSURL *url = [[NSBundle mainBundle] URLForResource:@"ML" withExtension:@"pdf"];
  • 实例化UIDocumentInteractionController
UIDocumentInteractionController *documentController = [UIDocumentInteractionController interactionControllerWithURL:url];
documentController.delegate = self;//UIDocumentInteractionControllerDelegate

2.1 预览文件

[documentController presentPreviewAnimated:YES]; // 预览文件

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];//包括快速预览菜单、打印、复制
//        [documentController presentOpenInMenuFromRect:rect inView:self.view animated:YES];//不包括包括快速预览菜单

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)  //当前选择器的名字
//    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 文件下载和预览

- (void)openfile:(CRMfilePreviewCellM*)m{
    //        NSURL *relativeToURL = [NSURL URLWithString:m.url ];//必须先下载,否则无法查看文件内容
    [SVProgressHUD showWithStatus:@"加载中..."];
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:m.url]];
        [SVProgressHUD dismiss];
    if(data== nil){
        [SVProgressHUD showInfoWithStatus:@"文件下载失败"];
        return ;
    }
    //            //用单例类 NSFileManager的对象,将文件写入本地
    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]; // 预览文件
    }
}
#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)  //当前选择器的名字
//    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 使用数据模型保存下载文件路径

懒加载

    //        NSURL *relativeToURL = [NSURL URLWithString:m.url ];//必须先下载,否则无法查看文件内容
- (NSString *)filePathFromUrl{
    if(_filePathFromUrl !=nil){
        return _filePathFromUrl;
    }
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:self.url]];
    if(data== nil){
        [SVProgressHUD showInfoWithStatus:@"文件下载失败"];
        return nil;
    }
    //            //用单例类 NSFileManager的对象,将文件写入本地
    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;
}

预览文件

- (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]; // 预览文件
}

3.3 使用数据模型分享文件

@property (nonatomic,copy) NSString *fileName;
@property (nonatomic,copy) NSString *url;
//
@property (nonatomic,copy) NSString *filePathFromUrl;
/**
/** 文件真实数据内容
 * @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文件预览分享小技能示例的详细内容,更多关于iOS文件预览分享的资料请关注我们其它相关文章!

(0)

相关推荐

  • iOS实现PDF文件浏览功能

    写了一个小Demo,显示本地PDF格式文件,支持翻页.跳页.缩放. 先看一下效果图: iOS开发,显示PDF格式文件方法有很多: 最简单的应该是UIWebView,可以加载本地或网络PDF文件,支持上下滑动浏览.缩放. 优化一点的是用系统的QLPreviewController加载,实现起来也比较方便,支持上下滑动浏览,左后滑动可多PDF文件切换,同时支持原生的分享打印,QLPreviewController支持的文档格式也比较多,如pdf.doc.docx.xls.xlsx.txt.ppt.m

  • iOS的音频文件的格式转换示例

    背景 因为我的公司需要设计到app与硬件的通信,所以去年深入的研究了一下音频各种格式的转换,曾写过一篇简书,现在搬过来丰富下自己的blog. 首先介绍一下常用的音频文件格式 .amr:体积很小,1秒到约为1kb,所以音质缩水也很厉害,一般用于手机铃声或彩信 .mp3:比较流行的,有损音频,某些部分失真,,音质随码率的提高,越高越好 .wav:为无损音频 .pcm:无损的wav文件中音频数据的一种编码方式 由于App是通过AVAudioRecorder录制音频,默认格式为pcm,文件比较大,所以不

  • iOS 超级签名之描述文件的实现过程

    简介 因为最近企业签掉得太严重了,上头要求实现超级签进行游戏下载.故有了此文章,记录一下过程. 签名原理其实很简单,超级签名的技术就是使用个人开发者账号,将用户的设备当作开发设备进行应用分发.这也导致成本非常高,一个开发者账号最多只能注册一百台设备,然而一个账号的价格为99美元.不过目前超级签分发的应用稳定性很高,不用再像企业签那样经常掉签. 新建 .mobileconfig 描述文件 该描述文件用于获取用户设备的UDID,用户通过某个点击操作下载此文件,安装后服务器会收到该用户设备的 UDID

  • iOS读写json文件的方法示例

    前言 本文主要给大家介绍了关于iOS读写json文件的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 一.获取沙盒路径 每个iOS应用都有自己专属的应用沙盒,应用沙盒就是文件系统中的目录.但是iOS系统会将每个应用的沙盒目录与文件系统的其他部分隔离,应用必须待在自己的沙盒里,并只能访问自己的沙盒. 沙盒目录 包含内容 Documents 存放应用运行时生成的并且需要保留的数据,iCloud同步时会同步该目录 Library/Caches 存放应用运行时生成的数据,iCl

  • iOS mobileconfig配置文件进行签名的配置方法

    配置描述文件(.mobileconfig) 是XML文件,包含设备安全策略.VPN配置信息.Wi-Fi设置.APN设置.Exchange帐户设置.邮件设置以及允许iPhone和iPod touch与企业系统配合使用的证书.本文描述了苹果开发者如何使用SSL证书对. mobileconfig进行签名,从而确保iOS系统上的app安全性. 前提条件 确保已经获取SSL数字证书.有关获取数字证书方法,可参阅如何获取数字证书. 本文使用的SSL证书文件名为mbaike.crt. 与SSL证书对应的私钥.

  • iOS实现文件下载功能

    本文实例为大家分享了iOS实现文件下载的具体代码,供大家参考,具体内容如下 说明: 1).获取网络文件大小: 2).开启循环,计算每段position开始与结束位置,通过Range头字段按块获取文件数据流: 3).使用NSFileHandle追加方式将NSData文件数据写入本地文件. 1.用HEAD请求方式获取网络文件大小: /*  获取网络文件大小  */ - (long long)getNetFileLen:(NSURL *)url{     //1.创建request     NSMut

  • iOS文件预览分享小技能示例

    目录 前言 I 第三方SDK分享文件 1.1 微信SDK 1.2 友盟SDK II 原生API的文件预览及其他应用打开 2.1 预览文件 2.2 文件分享 2.3 控制是否显示copy. print.saveToCameraRoll III 案例 3.1 文件下载和预览 3.2 使用数据模型保存下载文件路径 3.3 使用数据模型分享文件 3.4 清理缓存 前言 应用场景:文件下载.打印 I 第三方SDK分享文件 1.1 微信SDK /** enum WXScene { WXSceneSessio

  • 微信小程序实现文件预览

    微信小程序的文件预览,供大家参考,具体内容如下 微信小程序的文件预览需要先使用wx.downloadFile下载文件,然后使用下载文件的临时路径通过wx.openDocument进行文件的 预览 wxml代码: <button bindtap='preview'>简历预览</button> js代码: //简历预览 preview: function () { var that = this; console.log("简历预览") //这里的value是先在d

  • nodejs 图片预览和上传的示例代码

    本文介绍了nodejs 图片预览和上传的示例代码,分享给大家,具体如下: 效果如下: 前言 一般在上传图片之前需要暂存在本地预览一下. 前端图片预览用的是 FileReader的readAsDataURL方法 nodejs 图片上传用的是中间件 Multer 本地图片预览 FileReader对象允许web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用文件或Blob对象来指定要读取的文件或数据. readAsDataURL方法用于读取指定的Blob或文件的内容.当读取操

  • js 上传文件预览的简单实例

    1. FILE API html5提供了FIle和FileReader两个方法,可以读取文件信息并读取文件. 2. example <html> <body> <div id="test-image-preview" style="border: 1px solid rgb(204, 204, 204); width: 100%; height: 200px; background-size: contain; background-repeat

  • vue中使用vue-pdf组件实现文件预览及相应报错解决

    目录 前言 一.安装npm 依赖 二.引入组件 1.html中使用组件 单页 2.数据处理 单页 三.项目使用--代码部分 四.报错解决 总结 前言 使用vue-pdf组件实现文件预览功能 并在文件上增加操作按钮vue3不支持vue-pdf,vue3项目用pdfjs-dist 一.安装npm 依赖 1.在根目录下输入一下命令 npm i pdfjs-dist@2.5.207 --save npm i vue-pdf@4.2.0 --save 2.修改pacakge.json文件 "depende

  • Android 通过腾讯TBS实现文件预览功能

    1.集成腾讯TBS 使用腾讯TBS来预览pdf,word,excel,ppt等多种类型的文件,去 腾讯浏览服务官网下载SDK,按照官方文档文档集成SDK. 2.使用TbsReaderView来加载文件 动态创建TbsReaderView,然后添加到布局中. // 回调 TbsReaderView.ReaderCallback readerCallback = new TbsReaderView.ReaderCallback() { @Override public void onCallBack

  • NGINX 权限控制文件预览和下载的实现原理

    目录 一.实现原理 二.实现步骤 1. NGINX配置 2. JAVA SPRINGBOOT 后台权限验证 2.1 权限校验文件下载 2.2 权限校验文件预览 三.扩展功能 1. 下载统计.访问日志 2. 下载限速 3. 防盗链 4. X-SENDFILE @date: 2020-07-31 06:00 基于 Nginx + Java(SpringBoot) 实现带权限验证的静态文件服务器,支持文件下载.PDF预览和图片预览. 需要注意的是,无需权限判断的图片不建议使用此方法,大量的图片访问会增

  • js前端实现word excel pdf ppt mp4图片文本等文件预览

    目录 前言 实现方案 docx文件实现前端预览 代码实现 实现效果 pdf实现前端预览 代码实现 实现效果 excel实现前端预览 代码实现 实现效果 pptx的前端预览 实现效果 总结 前言 因为业务需要,很多文件需要在前端实现预览,今天就来了解一下吧. 可以点击下面地址体验喔 git仓库地址以及在线demo地址 实现方案 找了网上的实现方案,效果看起来不错,放在下面的表格里,里面有一些是可以直接通过npm在vue中引入使用. 文档格式 老的开源组件 替代开源组件 word(docx) mam

  • vue实现鼠标滑动预览视频封面组件示例详解

    目录 组件效果 组件设计 1.视频截取关键帧 2.鼠标移入封面时显示对应关键帧 3.视频和封面的状态切换 功能实现 1.视频截取关键帧图片列表 1.1 截取指定帧 1.2 截取stepNums张关键帧图片 2.鼠标移入封面时显示对应关键帧 2.1 鼠标移动事件监听 2.2 鼠标移出事件监听 3.视频和封面的状态切换 3.1 播放视频 3.2 视频暂停 组件使用 组件库引用 组件效果 https://www.jb51.net/Special/926.htm 组件设计 我们首先应该要对组件进行一个简

  • vue使用Office Web实现线上文件预览

    目录 正文 什么是 Office Web 查看器? vue预览word,excel,pptx,pdf文件 正文 我们在浏览器阅读word,excel,pptx的offic文件,可以使用微软的开发接口,一个阅读器Office Web 什么是 Office Web 查看器? 它是一种创建 Office Web Viewer 链接的服务.Office Web Viewer 链接可在浏览器中打开 Word.PowerPoint 或 Excel 文件,否则这些文件将被下载.您可以轻松地将下载链接转换为 O

随机推荐