拾光掠影 發表於 2022-8-16 11:36:01

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

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>前言</li><li>I 第三方SDK分享文件</li><ul class="second_class_ul"><li>1.1 微信SDK</li><li>1.2 友盟SDK</li></ul><li>II 原生API的文件预览及其他应用打开</li><ul class="second_class_ul"><li>2.1 预览文件</li><li>2.2 文件分享</li><li>2.3 控制是否显示copy、 print、saveToCameraRoll</li></ul><li>III 案例</li><ul class="second_class_ul"><li>3.1 文件下载和预览</li><li>3.2 使用数据模型保存下载文件路径</li><li>3.3 使用数据模型分享文件</li><li>3.4 清理缓存</li></ul></ul></div><p class="maodian"></p><h2>前言</h2>
<p>应用场景:文件下载、打印</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202208/20220816084646024.jpg" /></p>
<p class="maodian"></p><h2>I 第三方SDK分享文件</h2>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202208/20220816084646025.jpg" /></p>
<p class="maodian"></p><h3>1.1 微信SDK</h3>
<div class="jb51code"><pre class="brush:cpp;">/**
enum WXScene {
    WXSceneSession= 0,
    WXSceneTimeline = 1,
    WXSceneFavorite = 2,
};
文件真实数据内容
* @note 大小不能超过10M
*/
@property (nonatomic, retain) NSData    *fileData;
*/
- (void)sendFileContent
{
    WXMediaMessage *message = ;
    message.title = @"ML.pdf";
    message.description = @"Pro CoreData";
    ];
    WXFileObject *ext = ;
    ext.fileExtension = @"pdf";
    NSString* filePath = [ pathForResource:@"ML" ofType:@"pdf"];
    ext.fileData = ;
    //+ (nullable instancetype)dataWithContentsOfURL:(NSURL *)url;
    message.mediaObject = ext;
    SendMessageToWXReq* req = [[ init]autorelease];
    req.bText = NO;
    req.message = message;
    req.scene = WXSceneSession;
    ;
}
</pre></div>
<p class="maodian"></p><h3>1.2 友盟SDK</h3>
<div class="jb51code"><pre class="brush:cpp;">
#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
</pre></div>
<p class="maodian"></p><h2>II 原生API的文件预览及其他应用打开</h2>
<div class="jb51code"><pre class="brush:cpp;">- (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;//不包括包括快速预览菜单
</pre></div>
<ul><li>获取NSURL</li></ul>
<div class="jb51code"><pre class="brush:cpp;">//方式1:
    NSString* filePath = [ pathForResource:@"ML" ofType:@"pdf"];
NSURL *url = ;
// 方式2
    //NSURL *url = [ URLForResource:@"ML" withExtension:@"pdf"];
</pre></div>
<ul><li>实例化UIDocumentInteractionController</li></ul>
<div class="jb51code"><pre class="brush:cpp;">UIDocumentInteractionController *documentController = ;
documentController.delegate = self;//UIDocumentInteractionControllerDelegate
</pre></div>
<p class="maodian"></p><h3>2.1 预览文件</h3>
<div class="jb51code"><pre class="brush:cpp;">; // 预览文件
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202208/20220816084646026.jpg" /></p>
<p class="maodian"></p><h3>2.2 文件分享</h3>
<div class="jb51code"><pre class="brush:cpp;">      CGRect rect = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
       ;//包括快速预览菜单、打印、复制
//      ;//不包括包括快速预览菜单
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202208/20220816084646027.jpg" /></p>
<p class="maodian"></p><h3>2.3 控制是否显示copy、 print、saveToCameraRoll</h3>
<div class="jb51code"><pre class="brush:cpp;">#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;
}
</pre></div>
<p class="maodian"></p><h2>III 案例</h2>
<p class="maodian"></p><h3>3.1 文件下载和预览</h3>
<div class="jb51code"><pre class="brush:cpp;">- (void)openfile:(CRMfilePreviewCellM*)m{
    //      NSURL *relativeToURL = ;//必须先下载,否则无法查看文件内容
    ;
    NSData *data = ];
      ;
    if(data== nil){
      ;
      return ;
    }
    //            //用单例类 NSFileManager的对象,将文件写入本地
    NSFileManager *fileManage = ;
    NSString *tmp = ;
//    NSString *tmp = NSTemporaryDirectory();
    NSString *fileName = m.fileName;
    tmp =;
    BOOL isSuccess = ;
    if(isSuccess){
            NSURL *url = ;
      UIDocumentInteractionController *documentController = ;
      //UIDocumentInteractionController delegate must implement documentInteractionControllerViewControllerForPreview: to allow preview
      documentController.delegate = self;//UIDocumentInteractionControllerDelegate
      ; // 预览文件
    }
}
#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;
}
</pre></div>
<p class="maodian"></p><h3>3.2 使用数据模型保存下载文件路径</h3>
<p>懒加载</p>
<div class="jb51code"><pre class="brush:cpp;">    //      NSURL *relativeToURL = ;//必须先下载,否则无法查看文件内容
- (NSString *)filePathFromUrl{
    if(_filePathFromUrl !=nil){
      return _filePathFromUrl;
    }
    NSData *data = ];
    if(data== nil){
      ;
      return nil;
    }
    //            //用单例类 NSFileManager的对象,将文件写入本地
    NSFileManager *fileManage = ;
    NSString *tmp = ;
//    NSString *tmp = NSTemporaryDirectory();
    NSString *fileName = self.fileName;
    tmp =;
    BOOL isSuccess = ;
    _filePathFromUrl = tmp;
    if(!isSuccess){
      _filePathFromUrl = nil;
    }
    return _filePathFromUrl;
}
</pre></div>
<p>预览文件</p>
<div class="jb51code"><pre class="brush:cpp;">- (void)openfile:(CRMfilePreviewCellM*)m{
    if(!m.filePathFromUrl){
      return;
    }
            NSURL *url = ;
      UIDocumentInteractionController *documentController = ;
      //UIDocumentInteractionController delegate must implement documentInteractionControllerViewControllerForPreview: to allow preview
      documentController.delegate = self;//UIDocumentInteractionControllerDelegate
      ; // 预览文件
}
</pre></div>
<p class="maodian"></p><h3>3.3 使用数据模型分享文件</h3>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202208/20220816084646028.jpg" /></p>
<div class="jb51code"><pre class="brush:cpp;">@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= ;
      _fileData =;
    }
    return _fileData;
}
- (void)sendFileContent
{
    WXMediaMessage *message = ;
    message.title = self.fileName;
    message.description =self.fileName;
    ];
    WXFileObject *ext = ;
    ext.fileExtension =self.fileExtension;
    ext.fileData =self.fileData;
    //+ (nullable instancetype)dataWithContentsOfURL:(NSURL *)url;
    message.mediaObject = ext;
    SendMessageToWXReq* req = [ init];
    req.bText = NO;
    req.message = message;
    req.scene = WXSceneSession;
    ;
}
</pre></div>
<p class="maodian"></p><h3>3.4 清理缓存</h3>
<p>获取沙盒缓存路径</p>
<div class="jb51code"><pre class="brush:cpp;">+ (nullable NSString *)userCacheDirectory {
    NSArray&lt;NSString *&gt; *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    return paths.firstObject;
}
</pre></div>
<p>清理沙河文件缓存</p>
<div class="jb51code"><pre class="brush:cpp;">- (void)removeAllData {
    ;
    [self.fileManager createDirectoryAtPath:self.diskCachePath
            withIntermediateDirectories:YES
                           attributes:nil
                                  error:NULL];
}
</pre></div>
<p>清理WKWebView的缓存</p>
<div class="jb51code"><pre class="brush:cpp;">+ (void)clearWebCacheCompletion:(dispatch_block_t)completion {
    if (@available(iOS 9.0, *)) {
      NSSet *websiteDataTypes = ;
      NSDate *dateFrom = ;
      [ removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:completion];
    } else {
      NSString *libraryDir = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
      NSString *bundleId=[[ infoDictionary] objectForKey:@"CFBundleIdentifier"];
      NSString *webkitFolderInLib = ;
      NSString *webKitFolderInCaches = ;
      NSString *webKitFolderInCachesfs = ;
      NSError *error;
      /* iOS8.0 WebView Cache path */
      [ removeItemAtPath:webKitFolderInCaches error:&amp;error];
      [ removeItemAtPath:webkitFolderInLib error:nil];
      /* iOS7.0 WebView Cache path */
      [ removeItemAtPath:webKitFolderInCachesfs error:&amp;error];
      if (completion) {
            completion();
      }
    }
}
</pre></div>
<p>清理图片缓存</p>
<div class="jb51code"><pre class="brush:cpp;">+(void)clearCache:(NSString *)path{
    NSFileManager *fileManager=;
    if () {
      NSArray *childerFiles=;
      for (NSString *fileName in childerFiles) {
            //如有需要,加入条件,过滤掉不想删除的文件
            NSString *absolutePath=;
            ;
      }
    }
    //    [ cleanDisk];
    [ clearDiskOnCompletion:^{
    }];
}
</pre></div>
<p>以上就是iOS文件预览分享小技能示例的详细内容,更多关于iOS文件预览分享的资料请关注琼殿技术社区其它相关文章!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>iOS实现文件下载功能</li><li>iOS mobileconfig配置文件进行签名的配置方法</li><li>iOS 超级签名之描述文件的实现过程</li><li>iOS实现PDF文件浏览功能</li><li>iOS读写json文件的方法示例</li><li>iOS的音频文件的格式转换示例</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: iOS文件预览分享小技能示例