Commit 14e5c624f67c21e7ce1c3a8de563460419252951

Authored by 梁星国
1 parent bd508a87

提交更爱

CNLiveICloudPicker.podspec
... ... @@ -96,7 +96,7 @@ Pod::Spec.new do |s|
96 96 # Not including the public_header_files will make all headers public.
97 97 #
98 98  
99   - s.source_files = "CNLiveICloudPicker/*.{h,m}" # 文件位置
  99 + s.source_files = "CNLiveICloudPicker/*" # 文件位置
100 100 #s.exclude_files = "Classes/Exclude"
101 101  
102 102 # s.public_header_files = "Classes/**/*.h"
... ...
CNLiveICloudPicker/CNICloudDocumentModel.h 0 → 100644
  1 +//
  2 +// ICloudDocumentModel.h
  3 +// iCloud_测试
  4 +//
  5 +// Created by 梁星国 on 2018/10/12.
  6 +// Copyright © 2018年 梁星国. All rights reserved.
  7 +//
  8 +
  9 +#import <Foundation/Foundation.h>
  10 +
  11 +//NS_ASSUME_NONNULL_BEGIN
  12 +
  13 +@interface CNICloudDocumentModel : NSObject
  14 +
  15 +/** 路径 */
  16 +@property (strong, nonatomic) NSURL *fileURL;
  17 +/** 文件的名称
  18 +eg. “/tmp/scratch.tiff” -> “/tmp/scratch”
  19 +eg. “/tmp/” -> “/tmp”
  20 +eg. “scratch..tiff” -> “scratch.”
  21 + */
  22 +@property (copy, nonatomic) NSString *fileName;
  23 +/** 是否有路径 */
  24 +@property (assign, nonatomic) Boolean fileIsExist;
  25 +/** 文件的相关属性. Use: fileAttributes.fileSize() */
  26 +@property (copy, nonatomic) NSDictionary *fileAttributes;
  27 +
  28 ++ (CNICloudDocumentModel *)modelWithPath:(NSString *)path;
  29 +
  30 +@end
  31 +
  32 +//NS_ASSUME_NONNULL_END
... ...
CNLiveICloudPicker/CNICloudDocumentModel.m 0 → 100644
  1 +//
  2 +// ICloudDocumentModel.m
  3 +// iCloud_测试
  4 +//
  5 +// Created by 梁星国 on 2018/10/12.
  6 +// Copyright © 2018年 梁星国. All rights reserved.
  7 +//
  8 +
  9 +#import "CNICloudDocumentModel.h"
  10 +#import "CNICloudFileHelper.h"
  11 +
  12 +@implementation NSString (iCloud)
  13 +
  14 ++ (BOOL)isEmpty:(NSString *)string
  15 +{
  16 + return string == nil || string.length == 0;
  17 +}
  18 +
  19 +@end
  20 +
  21 +@implementation CNICloudDocumentModel
  22 +
  23 ++ (CNICloudDocumentModel *)modelWithPath:(NSString *)path {
  24 +
  25 + CNICloudDocumentModel *iCloudDocumentModel = [[CNICloudDocumentModel alloc]init];
  26 +
  27 + if ([NSString isEmpty:path]) {
  28 + return iCloudDocumentModel;
  29 + }
  30 +
  31 + iCloudDocumentModel.fileURL = [[NSURL alloc]initFileURLWithPath:path];
  32 +
  33 + // 读取文件名
  34 + if (iCloudDocumentModel.fileURL) {
  35 + NSString *pathString = [[NSString alloc]initWithString:iCloudDocumentModel.fileURL.lastPathComponent];
  36 + iCloudDocumentModel.fileName = [pathString stringByDeletingPathExtension];
  37 + }
  38 +
  39 + NSFileManager *fileManager = [NSFileManager defaultManager];
  40 + iCloudDocumentModel.fileIsExist = [fileManager fileExistsAtPath:path];
  41 + // 获取文件相关属性
  42 + NSDictionary *fileAttributes = [CNICloudFileHelper fileAttrAtPath:path];
  43 + if (fileAttributes.count < 0) {
  44 + return iCloudDocumentModel;
  45 + }
  46 + iCloudDocumentModel.fileAttributes = fileAttributes;
  47 +
  48 + return iCloudDocumentModel;
  49 +
  50 +}
  51 +
  52 +
  53 +@end
... ...
CNLiveICloudPicker/CNICloudDocumentPickerController.h 0 → 100644
  1 +//
  2 +// CNICloudDocumentPickerViewController.h
  3 +// iCloud_测试
  4 +//
  5 +// Created by 梁星国 on 2018/10/12.
  6 +// Copyright © 2018年 梁星国. All rights reserved.
  7 +//
  8 +
  9 +#import <UIKit/UIKit.h>
  10 +
  11 +NS_ASSUME_NONNULL_BEGIN
  12 +
  13 +@interface CNICloudDocumentPickerController : UIDocumentPickerViewController
  14 +
  15 +/** 主题颜色 */
  16 +@property (strong, nonatomic) UIColor *themeColor;
  17 +
  18 +
  19 +
  20 +
  21 +@end
  22 +
  23 +NS_ASSUME_NONNULL_END
... ...
CNLiveICloudPicker/CNICloudDocumentPickerController.m 0 → 100644
  1 +//
  2 +// CNICloudDocumentPickerViewController.m
  3 +// iCloud_测试
  4 +//
  5 +// Created by 梁星国 on 2018/10/12.
  6 +// Copyright © 2018年 梁星国. All rights reserved.
  7 +//
  8 +
  9 +#import "CNICloudDocumentPickerController.h"
  10 +
  11 +@interface CNICloudDocumentPickerController ()
  12 +
  13 +@end
  14 +
  15 +@implementation CNICloudDocumentPickerController
  16 +
  17 +- (void)viewDidLoad {
  18 + [super viewDidLoad];
  19 +
  20 + self.modalPresentationStyle = UIModalPresentationFullScreen;
  21 + self.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
  22 +
  23 +}
  24 +
  25 +- (void)viewWillAppear:(BOOL)animated {
  26 + [super viewWillAppear:animated];
  27 +}
  28 +
  29 +- (void)viewWillDisappear:(BOOL)animated {
  30 + [super viewWillDisappear:animated];
  31 +}
  32 +
  33 +/** 设置主题颜色 */
  34 +- (void)configuraThemeColor:(UIColor *)themeColor {
  35 + [UIImageView appearance].tintColor = themeColor;
  36 + [UITabBar appearance].tintColor = themeColor;
  37 + [UIView appearanceWhenContainedInInstancesOfClasses:UIAlertController.self];
  38 + [[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: themeColor} forState:UIControlStateNormal];
  39 + [UILabel appearance].tintColor = themeColor;
  40 + [UIButton appearance].tintColor = themeColor;
  41 + self.view.tintColor = themeColor;
  42 +}
  43 +
  44 +
  45 +@end
... ...
CNLiveICloudPicker/CNICloudDocumentPickerManager.h 0 → 100644
  1 +//
  2 +// CNICloudDocumentPickerManager.h
  3 +// iCloud_测试
  4 +//
  5 +// Created by 梁星国 on 2018/10/12.
  6 +// Copyright © 2018年 梁星国. All rights reserved.
  7 +//
  8 +
  9 +#import <Foundation/Foundation.h>
  10 +
  11 +NS_ASSUME_NONNULL_BEGIN
  12 +
  13 +@interface CNICloudDocumentPickerManager : NSObject
  14 +
  15 +@end
  16 +
  17 +NS_ASSUME_NONNULL_END
... ...
CNLiveICloudPicker/CNICloudDocumentPickerManager.m 0 → 100644
  1 +//
  2 +// CNICloudDocumentPickerManager.m
  3 +// iCloud_测试
  4 +//
  5 +// Created by 梁星国 on 2018/10/12.
  6 +// Copyright © 2018年 梁星国. All rights reserved.
  7 +//
  8 +
  9 +#import "CNICloudDocumentPickerManager.h"
  10 +
  11 +@implementation CNICloudDocumentPickerManager
  12 +
  13 +
  14 +
  15 +@end
... ...
CNLiveICloudPicker/CNICloudFileHelper.h 0 → 100644
  1 +//
  2 +// CNICloudFileHelper.h
  3 +// iCloud_测试
  4 +//
  5 +// Created by 梁星国 on 2018/10/12.
  6 +// Copyright © 2018年 梁星国. All rights reserved.
  7 +//
  8 +
  9 +#import <Foundation/Foundation.h>
  10 +
  11 +NS_ASSUME_NONNULL_BEGIN
  12 +
  13 +@interface CNICloudFileHelper : NSObject
  14 +
  15 +/**
  16 + 创建文件目录,如果不存在目录会创建目录
  17 +
  18 + @param path 文件目录
  19 + @return 是否创建成功
  20 + */
  21 ++ (Boolean)createDirectoryAtPath:(NSString *)path;
  22 +
  23 +/**
  24 + 获取单个文件大小
  25 +
  26 + @param path 文件路径
  27 + @return 文件大小
  28 + */
  29 ++ (float)fileSizeAtPath:(NSString *)path;
  30 +
  31 +/**
  32 + 获取文件属性
  33 +
  34 + @param path 文件路径
  35 + @return 文件属性
  36 + */
  37 ++ (NSDictionary *)fileAttrAtPath:(NSString *)path;
  38 +
  39 +
  40 +/**
  41 + 获取子文件夹的总大小
  42 +
  43 + @param path 文件夹路径
  44 + @return 文件夹大小
  45 + */
  46 ++ (float)forderSizeAtPath:(NSString *)path;
  47 +
  48 +/**
  49 + 是否是文件夹
  50 +
  51 + @param path 目录路径
  52 + @return 是否
  53 + */
  54 ++ (BOOL)isDirectoryAtPath:(NSString *)path;
  55 +
  56 +
  57 +
  58 +@end
  59 +
  60 +NS_ASSUME_NONNULL_END
... ...
CNLiveICloudPicker/CNICloudFileHelper.m 0 → 100644
  1 +//
  2 +// CNICloudFileHelper.m
  3 +// iCloud_测试
  4 +//
  5 +// Created by 梁星国 on 2018/10/12.
  6 +// Copyright © 2018年 梁星国. All rights reserved.
  7 +//
  8 +
  9 +#import "CNICloudFileHelper.h"
  10 +
  11 +@implementation CNICloudFileHelper
  12 +
  13 +
  14 +
  15 +/**
  16 + 创建文件目录,如果不存在目录会创建目录
  17 +
  18 + @param path 文件目录
  19 + @return 是否创建成功
  20 + */
  21 ++ (Boolean)createDirectoryAtPath:(NSString *)path{
  22 +
  23 + NSFileManager *fileManager = [NSFileManager defaultManager];
  24 + Boolean result = [fileManager fileExistsAtPath:path];
  25 + if (result == NO) {
  26 + BOOL isCreate = [fileManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];
  27 + return isCreate;
  28 +
  29 + }else {
  30 + return YES;
  31 + }
  32 +
  33 +}
  34 +
  35 +/**
  36 + 获取单个文件大小
  37 +
  38 + @param path 文件路径
  39 + @return 文件大小
  40 + */
  41 ++ (float)fileSizeAtPath:(NSString *)path {
  42 + NSFileManager *fileManager = [NSFileManager defaultManager];
  43 + BOOL isExists = [fileManager fileExistsAtPath:path];
  44 + if (!isExists) {
  45 + return 0.0;
  46 + }
  47 +
  48 + NSDictionary *attributesDic = [fileManager attributesOfItemAtPath:path error:nil];
  49 + if (attributesDic) {
  50 + return [attributesDic[NSFileSize] floatValue];
  51 + }else {
  52 + return 0.0;
  53 + }
  54 +
  55 +}
  56 +
  57 +/**
  58 + 获取文件属性
  59 +
  60 + @param path 文件路径
  61 + @return 文件属性
  62 + */
  63 ++ (NSDictionary *)fileAttrAtPath:(NSString *)path {
  64 + NSFileManager *fileManager = [NSFileManager defaultManager];
  65 + BOOL isExists = [fileManager fileExistsAtPath:path];
  66 + if (!isExists) {
  67 + return nil;
  68 + }
  69 +
  70 + NSDictionary *attributesDic = [fileManager attributesOfItemAtPath:path error:nil];
  71 + if (attributesDic > 0) {
  72 + return attributesDic;
  73 + }else {
  74 + return nil;
  75 + }
  76 +
  77 +}
  78 +
  79 +
  80 +/**
  81 + 获取子文件夹的总大小
  82 +
  83 + @param path 文件夹路径
  84 + @return 文件夹大小
  85 + */
  86 ++ (float)forderSizeAtPath:(NSString *)path {
  87 + NSFileManager *fileManager = [NSFileManager defaultManager];
  88 + BOOL isExists = [fileManager fileExistsAtPath:path];
  89 + if (!isExists) {
  90 + return 0.0;
  91 + }
  92 +
  93 + NSArray *subpaths = [fileManager subpathsAtPath:path];
  94 + if (subpaths.count <= 0) {
  95 + return 0.0;
  96 + }else {
  97 + float fileSize = 0;
  98 +
  99 + for (NSString *subPath in subpaths) {
  100 + NSString *fileAbsoluePath = [NSString stringWithFormat:@"%@/%@",path,subPath];
  101 + if ([CNICloudFileHelper isDirectoryAtPath:fileAbsoluePath]) {
  102 + fileSize += [self fileSizeAtPath:fileAbsoluePath];
  103 + } else {
  104 + fileSize += 0.0;
  105 + }
  106 + }
  107 + return fileSize;
  108 + }
  109 +}
  110 +
  111 +
  112 +/**
  113 + 是否是文件夹
  114 +
  115 + @param path 目录路径
  116 + @return 是否
  117 + */
  118 ++ (BOOL)isDirectoryAtPath:(NSString *)path {
  119 + BOOL isDirectory = NO;
  120 + NSFileManager *fileManager = [NSFileManager defaultManager];
  121 + BOOL isExists = [fileManager fileExistsAtPath:path isDirectory:&isDirectory];
  122 + return isExists && isDirectory;
  123 +}
  124 +
  125 +
  126 +
  127 +@end
... ...
CNLiveICloudPicker/CNICloudManager.h 0 → 100644
  1 +//
  2 +// CNICloudManager.h
  3 +// iCloud_测试
  4 +//
  5 +// Created by 梁星国 on 2018/10/15.
  6 +// Copyright © 2018年 梁星国. All rights reserved.
  7 +//
  8 +
  9 +#import <Foundation/Foundation.h>
  10 +#import <UIKit/UIKit.h>
  11 +#import "CNICloudFileHelper.h"
  12 +#import "CNICloudDocumentModel.h"
  13 +
  14 +NS_ASSUME_NONNULL_BEGIN
  15 +
  16 +@interface CNICloudManager : NSObject
  17 +
  18 +/**
  19 + 判断iCloud是否可用
  20 +
  21 + @return 是否可用
  22 + */
  23 ++ (BOOL)iCloudEnable;
  24 +
  25 +/**
  26 + 通过CNICloudDocument 打开关闭文件
  27 +
  28 + @param url url
  29 + @param callBack 文件数据,文件大小
  30 + */
  31 ++ (void)downloadWithDocumentURL:(NSURL *)url callBack:(void(^)(bool success ,NSData *data, float size)) callBack;
  32 +
  33 +/**
  34 + 保存文件到本地 /Documents/iCloudBox 下
  35 +
  36 + @param url 文件路径
  37 + @param outputPath 导出路径
  38 + @param maxSize 保存的最大尺寸 为 nil 忽略
  39 + @param conversationId 群聊为群 ID, 单聊为好友ID (即 会话ID)
  40 + @param callBackContent 保存h的路径 url,是否保存成功,保存失败的描述
  41 + */
  42 ++ (void)saveWithDocumentURL:(NSURL *)url outputPath:(NSString *)outputPath maxSize:(float)maxSize conversationId:(NSString *)conversationId callBackContent:(void(^)(CNICloudDocumentModel *model, BOOL success, NSString * msg, NSInteger code))callBackContent;
  43 +
  44 +/**
  45 + 文件是否在指定filePath存在 否则是否在iCloudBox存在
  46 +
  47 + @param fileName 文件名(fileUrl.lastPathComponent) eg. doc.text
  48 + @param filePath 指定路径
  49 + @return 文件路径
  50 + */
  51 ++ (NSURL *)documentIsExistsWithFileName:(NSString *)fileName filePath:(NSString *)filePath;
  52 +
  53 +/**
  54 + 清楚本地缓存
  55 +
  56 + @param filePath filePath 为空 清除所有缓存
  57 + @return 是否成功
  58 + */
  59 ++ (BOOL)clearICloudBoxCacheWhithFilePath:(NSString *)filePath;
  60 +
  61 +/**
  62 + 异步获取iCloudBox 缓存大小
  63 +
  64 + @param filePath 路径
  65 + @param callBack 返回大小
  66 + */
  67 ++ (void)asynciCloudBoxSizeWithFilePath:(NSString *)filePath CallBack:(void(^)(float size))callBack;
  68 +
  69 +@end
  70 +
  71 +NS_ASSUME_NONNULL_END
  72 +
  73 +
  74 +NS_ASSUME_NONNULL_BEGIN
  75 +
  76 +@interface CNICloudDocument : UIDocument
  77 +
  78 +@property (nonatomic , strong) NSData *data;
  79 +
  80 +
  81 +@end
  82 +
  83 +NS_ASSUME_NONNULL_END
  84 +
  85 +
... ...
CNLiveICloudPicker/CNICloudManager.m 0 → 100644
  1 +//
  2 +// CNICloudManager.m
  3 +// iCloud_测试
  4 +//
  5 +// Created by 梁星国 on 2018/10/15.
  6 +// Copyright © 2018年 梁星国. All rights reserved.
  7 +//
  8 +
  9 +#import "CNICloudManager.h"
  10 +#import "CNICloudFileHelper.h"
  11 +#import "CNICloudDocumentModel.h"
  12 +
  13 +
  14 +/** 存放的默认路径 */
  15 +#define kICloudBoxPath [NSString stringWithFormat:@"%@%@",NSHomeDirectory(),@"/Documents/iCloudBox/Doc/"]
  16 +
  17 +/** 存放下载路径 */
  18 +#define kICloudBoxDownLoadPath [NSString stringWithFormat:@"%@%@",NSHomeDirectory(),@"/Documents/iCloudBox/Doc/Download/"]
  19 +
  20 +#define code100 100 //写入文件成功
  21 +#define code101 101 //没有开启权限
  22 +#define code102 102 //文件下载失败
  23 +#define code103 103 //文件不能太大
  24 +#define code104 104 //文件夹无文件
  25 +#define code105 105 //文件写入失败
  26 +#define code106 106 //无数据
  27 +@implementation NSString (CNICloudManager)
  28 +
  29 ++ (BOOL)isEmpty:(NSString *)string
  30 +{
  31 + return string == nil || string.length == 0;
  32 +}
  33 +
  34 +@end
  35 +
  36 +@implementation CNICloudManager
  37 +
  38 +/**
  39 + 判断iCloud是否可用
  40 +
  41 + @return 是否可用
  42 + */
  43 ++ (BOOL)iCloudEnable {
  44 + NSFileManager *fileManager = [NSFileManager defaultManager];
  45 + NSURL *url = [fileManager URLForUbiquityContainerIdentifier:nil];
  46 + if (url) {
  47 + return true;
  48 + }else {
  49 + return false;
  50 + }
  51 +
  52 +}
  53 +
  54 +
  55 +/**
  56 + 通过CNICloudDocument 打开关闭文件
  57 +
  58 + @param url url
  59 + @param callBack 文件数据,文件大小
  60 + */
  61 ++ (void)downloadWithDocumentURL:(NSURL *)url callBack:(void(^)(bool success ,NSData *data, float size)) callBack{
  62 +
  63 + CNICloudDocument *iCloudDoc = [[CNICloudDocument alloc]initWithFileURL:url];
  64 + [iCloudDoc openWithCompletionHandler:^(BOOL success) {
  65 + if (success) {
  66 +
  67 + __block float size = [CNICloudFileHelper fileSizeAtPath:url.path];
  68 + [iCloudDoc closeWithCompletionHandler:^(BOOL success) {
  69 + !callBack ?: callBack( success,iCloudDoc.data,size);
  70 + }];
  71 +
  72 + }else {
  73 + !callBack ?: callBack( success,nil,0.0);
  74 + }
  75 +
  76 + }];
  77 +
  78 +}
  79 +
  80 +
  81 +/**
  82 + 保存文件到本地 /Documents/iCloudBox 下
  83 +
  84 + @param url 文件路径
  85 + @param maxSize 保存的最大尺寸 为 nil 忽略
  86 + @param conversationId 群聊为群 ID, 单聊为好友ID (即 会话ID)
  87 + @param callBackContent 保存h的路径 url,是否保存成功,保存失败的描述
  88 + */
  89 +
  90 ++ (void)saveWithDocumentURL:(NSURL *)url outputPath:(NSString *)outputPath maxSize:(float)maxSize conversationId:(NSString *)conversationId callBackContent:(void(^)(CNICloudDocumentModel *model, BOOL success, NSString * msg, NSInteger code))callBackContent {
  91 +
  92 + if (![CNICloudManager iCloudEnable]) {
  93 + callBackContent(nil, false, @"请在设置->AppleID、iCloud->iCloud中打开访问权限",code101);
  94 + return;
  95 + }
  96 +
  97 + NSArray *array = [[url absoluteString] componentsSeparatedByString:@"/"];
  98 + NSString *fileName = [array lastObject];
  99 + fileName = [fileName stringByRemovingPercentEncoding];
  100 +
  101 + [CNICloudManager downloadWithDocumentURL:url callBack:^(bool success ,NSData *data, float size) {
  102 +
  103 + if (!success) {
  104 + callBackContent(nil,false,[NSString stringWithFormat:@"文件下载失败"],code102);
  105 + return;
  106 + }
  107 +
  108 + if (size > maxSize) {
  109 + callBackContent(nil,false,[NSString stringWithFormat:@"文件不能大于%f",maxSize],code103);
  110 + return;
  111 + }
  112 +
  113 + if ([NSString isEmpty:url.lastPathComponent]) {
  114 + callBackContent(nil,false,[NSString stringWithFormat:@"文件夹无文件"],code104);
  115 + return;
  116 + }
  117 +
  118 + if (data) {
  119 +
  120 + NSString *dataPath = [NSString string];
  121 + if ([NSString isEmpty:outputPath]) {
  122 + dataPath = kICloudBoxDownLoadPath;
  123 + }else {
  124 + dataPath = outputPath;
  125 + }
  126 + NSURL *writeUrl = [[NSURL alloc]initFileURLWithPath:dataPath];
  127 + [CNICloudFileHelper createDirectoryAtPath:dataPath];
  128 +
  129 + BOOL isWrite = [data writeToURL:writeUrl options:NSDataWritingAtomic error:nil];
  130 +
  131 + if (isWrite) {
  132 + callBackContent([CNICloudDocumentModel modelWithPath:writeUrl.path],YES,@"文件写入成功",code100);
  133 + }else {
  134 + callBackContent(nil, false,@"文件写入失败",code105);
  135 + }
  136 +
  137 + }else {
  138 + callBackContent(nil, false, @"无数据",code106);
  139 + return;
  140 + }
  141 +
  142 + }];
  143 +}
  144 +
  145 +
  146 +/**
  147 + 文件是否在指定filePath存在 否则是否在iCloudBox存在
  148 +
  149 + @param fileName 文件名(fileUrl.lastPathComponent) eg. doc.text
  150 + @return 文件路径
  151 + */
  152 ++ (NSURL *)documentIsExistsWithFileName:(NSString *)fileName filePath:(NSString *)filePath{
  153 +
  154 + NSFileManager *fileManager = [NSFileManager defaultManager];
  155 + NSString *tempPath = [NSString string];
  156 + if ([NSString isEmpty:filePath]) {
  157 + tempPath = kICloudBoxDownLoadPath;
  158 + }else {
  159 + tempPath = filePath;
  160 + }
  161 + NSArray *childFilePaths = [fileManager subpathsAtPath:tempPath];
  162 + if (childFilePaths.count <= 0) {
  163 + return nil;
  164 + }
  165 +
  166 + for (NSString *path in childFilePaths) {
  167 + //读取文件名
  168 + NSString *checkPath = [NSString stringWithFormat:@"%@%@",tempPath,path];
  169 + NSURL *checkUrl = [[NSURL alloc]initFileURLWithPath:checkPath];
  170 + if ([fileName isEqualToString:checkUrl.lastPathComponent]) {
  171 + return checkUrl;
  172 + }
  173 + }
  174 +
  175 + return nil;
  176 +
  177 +}
  178 +
  179 +
  180 +/**
  181 + 清除本地缓存
  182 +
  183 + @param filePath filePath 为空 清除所有缓存
  184 + @return 是否成功
  185 + */
  186 ++ (BOOL)clearICloudBoxCacheWhithFilePath:(NSString *)filePath {
  187 + NSFileManager *fileManager = [NSFileManager defaultManager];
  188 + if (!filePath) {
  189 + NSURL *defultUrl = [NSURL fileURLWithPath:kICloudBoxPath];
  190 + return [fileManager removeItemAtURL:defultUrl error:nil];
  191 + }
  192 + BOOL isRemove = [fileManager removeItemAtURL:[NSURL fileURLWithPath:filePath] error:nil];
  193 + return isRemove;
  194 +}
  195 +
  196 +
  197 +
  198 +/**
  199 + 异步获取iCloudBox 缓存大小
  200 +
  201 + @param filePath 路径
  202 + @param callBack 返回大小
  203 + */
  204 ++ (void)asynciCloudBoxSizeWithFilePath:(NSString *)filePath CallBack:(void(^)(float size))callBack {
  205 +
  206 + dispatch_queue_t global = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
  207 + dispatch_async(global, ^{
  208 + NSString *dataPath = [NSString string];
  209 + if ([NSString isEmpty:filePath]) {
  210 + dataPath = kICloudBoxPath;
  211 + }else {
  212 + dataPath = filePath;
  213 + }
  214 + float dataSize = [CNICloudFileHelper forderSizeAtPath:dataPath];
  215 + callBack(dataSize);
  216 + });
  217 +
  218 +
  219 +}
  220 +
  221 +
  222 +@end
  223 +
  224 +
  225 +@implementation CNICloudDocument : UIDocument
  226 +
  227 +
  228 +- (BOOL)loadFromContents:(id)contents ofType:(NSString *)typeName error:(NSError * _Nullable __autoreleasing *)outError {
  229 +
  230 + if ([contents isKindOfClass:[NSData class]]) {
  231 + NSData *userContent = (NSData *)contents;
  232 + self.data = userContent;
  233 + }
  234 + return YES;
  235 +
  236 +}
  237 +
  238 +@end
  239 +
  240 +
... ...
CNLiveICloudPicker/CNICoudHeader.h 0 → 100644
  1 +//
  2 +// CNICoudHeader.h
  3 +// CNLiveNetAdd
  4 +//
  5 +// Created by daojian on 2018/10/16.
  6 +// Copyright © 2018年 cnlive. All rights reserved.
  7 +//
  8 +
  9 +#ifndef CNICoudHeader_h
  10 +#define CNICoudHeader_h
  11 +
  12 +#import "CNICloudManager.h"
  13 +#import "CNICloudDocumentModel.h"
  14 +#import "CNICloudDocumentPickerManager.h"
  15 +#import "CNICloudDocumentPickerController.h"
  16 +#import "CNICloudFileHelper.h"
  17 +
  18 +#endif /* CNICoudHeader_h */
  19 +
... ...
CNLiveICloudPicker/UIAlertController+Blocks.h deleted 100755 → 0
1   -//
2   -// UIAlertController+Blocks.h
3   -// UIAlertControllerBlocks
4   -//
5   -// Created by Ryan Maxwell on 11/09/14.
6   -//
7   -// The MIT License (MIT)
8   -//
9   -// Copyright (c) 2014 Ryan Maxwell
10   -//
11   -// Permission is hereby granted, free of charge, to any person obtaining a copy of
12   -// this software and associated documentation files (the "Software"), to deal in
13   -// the Software without restriction, including without limitation the rights to
14   -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
15   -// the Software, and to permit persons to whom the Software is furnished to do so,
16   -// subject to the following conditions:
17   -//
18   -// The above copyright notice and this permission notice shall be included in all
19   -// copies or substantial portions of the Software.
20   -//
21   -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22   -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
23   -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
24   -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
25   -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
26   -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27   -//
28   -
29   -#import <UIKit/UIKit.h>
30   -
31   -#if TARGET_OS_IOS
32   -typedef void (^UIAlertControllerPopoverPresentationControllerBlock) (UIPopoverPresentationController * __nonnull popover);
33   -#endif
34   -typedef void (^UIAlertControllerCompletionBlock) (UIAlertController * __nonnull controller, UIAlertAction * __nonnull action, NSInteger buttonIndex);
35   -
36   -@interface UIAlertController (Blocks)
37   -
38   -+ (nonnull instancetype)showInViewController:(nonnull UIViewController *)viewController
39   - withTitle:(nullable NSString *)title
40   - message:(nullable NSString *)message
41   - preferredStyle:(UIAlertControllerStyle)preferredStyle
42   - cancelButtonTitle:(nullable NSString *)cancelButtonTitle
43   - destructiveButtonTitle:(nullable NSString *)destructiveButtonTitle
44   - otherButtonTitles:(nullable NSArray *)otherButtonTitles
45   -#if TARGET_OS_IOS
46   - popoverPresentationControllerBlock:(nullable UIAlertControllerPopoverPresentationControllerBlock)popoverPresentationControllerBlock
47   -#endif
48   - tapBlock:(nullable UIAlertControllerCompletionBlock)tapBlock;
49   -
50   -+ (nonnull instancetype)showAlertInViewController:(nonnull UIViewController *)viewController
51   - withTitle:(nullable NSString *)title
52   - message:(nullable NSString *)message
53   - cancelButtonTitle:(nullable NSString *)cancelButtonTitle
54   - destructiveButtonTitle:(nullable NSString *)destructiveButtonTitle
55   - otherButtonTitles:(nullable NSArray *)otherButtonTitles
56   - tapBlock:(nullable UIAlertControllerCompletionBlock)tapBlock;
57   -
58   -
59   -+ (nonnull instancetype)showActionSheetInViewController:(nonnull UIViewController *)viewController
60   - withTitle:(nullable NSString *)title
61   - message:(nullable NSString *)message
62   - cancelButtonTitle:(nullable NSString *)cancelButtonTitle
63   - destructiveButtonTitle:(nullable NSString *)destructiveButtonTitle
64   - otherButtonTitles:(nullable NSArray *)otherButtonTitles
65   -#if TARGET_OS_IOS
66   - popoverPresentationControllerBlock:(nullable UIAlertControllerPopoverPresentationControllerBlock)popoverPresentationControllerBlock
67   -#endif
68   - tapBlock:(nullable UIAlertControllerCompletionBlock)tapBlock;
69   -
70   -
71   -@property (readonly, nonatomic) BOOL visible;
72   -@property (readonly, nonatomic) NSInteger cancelButtonIndex;
73   -@property (readonly, nonatomic) NSInteger firstOtherButtonIndex;
74   -@property (readonly, nonatomic) NSInteger destructiveButtonIndex;
75   -
76   -@end
CNLiveICloudPicker/UIAlertController+Blocks.m deleted 100755 → 0
1   -//
2   -// UIAlertController+Blocks.m
3   -// UIAlertControllerBlocks
4   -//
5   -// Created by Ryan Maxwell on 11/09/14.
6   -//
7   -// The MIT License (MIT)
8   -//
9   -// Copyright (c) 2014 Ryan Maxwell
10   -//
11   -// Permission is hereby granted, free of charge, to any person obtaining a copy of
12   -// this software and associated documentation files (the "Software"), to deal in
13   -// the Software without restriction, including without limitation the rights to
14   -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
15   -// the Software, and to permit persons to whom the Software is furnished to do so,
16   -// subject to the following conditions:
17   -//
18   -// The above copyright notice and this permission notice shall be included in all
19   -// copies or substantial portions of the Software.
20   -//
21   -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22   -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
23   -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
24   -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
25   -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
26   -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27   -//
28   -
29   -#import "UIAlertController+Blocks.h"
30   -
31   -static NSInteger const UIAlertControllerBlocksCancelButtonIndex = 0;
32   -static NSInteger const UIAlertControllerBlocksDestructiveButtonIndex = 1;
33   -static NSInteger const UIAlertControllerBlocksFirstOtherButtonIndex = 2;
34   -
35   -@interface UIViewController (UACB_Topmost)
36   -
37   -- (UIViewController *)uacb_topmost;
38   -
39   -@end
40   -
41   -@implementation UIAlertController (Blocks)
42   -
43   -+ (instancetype)showInViewController:(UIViewController *)viewController
44   - withTitle:(NSString *)title
45   - message:(NSString *)message
46   - preferredStyle:(UIAlertControllerStyle)preferredStyle
47   - cancelButtonTitle:(NSString *)cancelButtonTitle
48   - destructiveButtonTitle:(NSString *)destructiveButtonTitle
49   - otherButtonTitles:(NSArray *)otherButtonTitles
50   -#if TARGET_OS_IOS
51   - popoverPresentationControllerBlock:(void(^)(UIPopoverPresentationController *popover))popoverPresentationControllerBlock
52   -#endif
53   - tapBlock:(UIAlertControllerCompletionBlock)tapBlock
54   -{
55   - UIAlertController *strongController = [self alertControllerWithTitle:title
56   - message:message
57   - preferredStyle:preferredStyle];
58   -
59   - __weak UIAlertController *controller = strongController;
60   -
61   - if (cancelButtonTitle) {
62   - UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:cancelButtonTitle
63   - style:UIAlertActionStyleCancel
64   - handler:^(UIAlertAction *action){
65   - if (tapBlock) {
66   - tapBlock(controller, action, UIAlertControllerBlocksCancelButtonIndex);
67   - }
68   - }];
69   - [controller addAction:cancelAction];
70   - }
71   -
72   - if (destructiveButtonTitle) {
73   - UIAlertAction *destructiveAction = [UIAlertAction actionWithTitle:destructiveButtonTitle
74   - style:UIAlertActionStyleDestructive
75   - handler:^(UIAlertAction *action){
76   - if (tapBlock) {
77   - tapBlock(controller, action, UIAlertControllerBlocksDestructiveButtonIndex);
78   - }
79   - }];
80   - [controller addAction:destructiveAction];
81   - }
82   -
83   - for (NSUInteger i = 0; i < otherButtonTitles.count; i++) {
84   - NSString *otherButtonTitle = otherButtonTitles[i];
85   -
86   - UIAlertAction *otherAction = [UIAlertAction actionWithTitle:otherButtonTitle
87   - style:UIAlertActionStyleDefault
88   - handler:^(UIAlertAction *action){
89   - if (tapBlock) {
90   - tapBlock(controller, action, UIAlertControllerBlocksFirstOtherButtonIndex + i);
91   - }
92   - }];
93   - [controller addAction:otherAction];
94   - }
95   -
96   -#if TARGET_OS_IOS
97   - if (popoverPresentationControllerBlock) {
98   - popoverPresentationControllerBlock(controller.popoverPresentationController);
99   - }
100   -#endif
101   -
102   - [viewController.uacb_topmost presentViewController:controller animated:YES completion:nil];
103   -
104   - return controller;
105   -}
106   -
107   -+ (instancetype)showAlertInViewController:(UIViewController *)viewController
108   - withTitle:(NSString *)title
109   - message:(NSString *)message
110   - cancelButtonTitle:(NSString *)cancelButtonTitle
111   - destructiveButtonTitle:(NSString *)destructiveButtonTitle
112   - otherButtonTitles:(NSArray *)otherButtonTitles
113   - tapBlock:(UIAlertControllerCompletionBlock)tapBlock
114   -{
115   - return [self showInViewController:viewController
116   - withTitle:title
117   - message:message
118   - preferredStyle:UIAlertControllerStyleAlert
119   - cancelButtonTitle:cancelButtonTitle
120   - destructiveButtonTitle:destructiveButtonTitle
121   - otherButtonTitles:otherButtonTitles
122   -#if TARGET_OS_IOS
123   - popoverPresentationControllerBlock:nil
124   -#endif
125   - tapBlock:tapBlock];
126   -}
127   -
128   -+ (instancetype)showActionSheetInViewController:(UIViewController *)viewController
129   - withTitle:(NSString *)title
130   - message:(NSString *)message
131   - cancelButtonTitle:(NSString *)cancelButtonTitle
132   - destructiveButtonTitle:(NSString *)destructiveButtonTitle
133   - otherButtonTitles:(NSArray *)otherButtonTitles
134   -#if TARGET_OS_IOS
135   - popoverPresentationControllerBlock:(void(^)(UIPopoverPresentationController *popover))popoverPresentationControllerBlock
136   -#endif
137   - tapBlock:(UIAlertControllerCompletionBlock)tapBlock
138   -{
139   - return [self showInViewController:viewController
140   - withTitle:title
141   - message:message
142   - preferredStyle:UIAlertControllerStyleActionSheet
143   - cancelButtonTitle:cancelButtonTitle
144   - destructiveButtonTitle:destructiveButtonTitle
145   - otherButtonTitles:otherButtonTitles
146   -#if TARGET_OS_IOS
147   - popoverPresentationControllerBlock:popoverPresentationControllerBlock
148   -#endif
149   - tapBlock:tapBlock];
150   -}
151   -
152   -#pragma mark -
153   -
154   -- (BOOL)visible
155   -{
156   - return self.view.superview != nil;
157   -}
158   -
159   -- (NSInteger)cancelButtonIndex
160   -{
161   - return UIAlertControllerBlocksCancelButtonIndex;
162   -}
163   -
164   -- (NSInteger)firstOtherButtonIndex
165   -{
166   - return UIAlertControllerBlocksFirstOtherButtonIndex;
167   -}
168   -
169   -- (NSInteger)destructiveButtonIndex
170   -{
171   - return UIAlertControllerBlocksDestructiveButtonIndex;
172   -}
173   -
174   -@end
175   -
176   -@implementation UIViewController (UACB_Topmost)
177   -
178   -- (UIViewController *)uacb_topmost
179   -{
180   - UIViewController *topmost = self;
181   -
182   - UIViewController *above;
183   - while ((above = topmost.presentedViewController)) {
184   - topmost = above;
185   - }
186   -
187   - return topmost;
188   -}
189   -
190   -@end