DocumentPickerManager.m 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. //
  2. // DocumentPickerManager.m
  3. // 隐私保护
  4. //
  5. // Created by xd h on 2025/3/21.
  6. //
  7. #import "DocumentPickerManager.h"
  8. #import <UIKit/UIKit.h>
  9. #import <MobileCoreServices/MobileCoreServices.h>
  10. @interface DocumentPickerManager () <UIDocumentPickerDelegate>
  11. {
  12. NSArray *curURLS;
  13. NSInteger PickerTotalNumber;//用户选择的数目
  14. NSInteger didPickerOkNumber;//拷贝到APP内成功的数量
  15. NSInteger didPickerFailNumber;//拷贝到APP内失败的数量
  16. }
  17. @property (nonatomic,copy) pickerSuccess didPickSuc;
  18. @end
  19. @implementation DocumentPickerManager
  20. + (instancetype)shareManager {
  21. static DocumentPickerManager *_instance;
  22. static dispatch_once_t onceToken;
  23. dispatch_once(&onceToken, ^{
  24. _instance = [[self alloc] init];
  25. });
  26. return _instance;
  27. }
  28. - (void)openDocumentPickerSuccess:(pickerSuccess)success {
  29. PickerTotalNumber = 0;
  30. didPickerOkNumber = 0;
  31. didPickerFailNumber = 0;
  32. curURLS = @[];
  33. _didPickSuc = success;
  34. // 创建 UIDocumentPickerViewController
  35. UIDocumentPickerViewController *documentPicker = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:@[(NSString *)kUTTypeItem] inMode:UIDocumentPickerModeImport];
  36. // 启用多选
  37. documentPicker.allowsMultipleSelection = YES;
  38. // 设置代理
  39. documentPicker.delegate = self;
  40. // 设置模态呈现样式
  41. documentPicker.modalPresentationStyle = UIModalPresentationFormSheet;
  42. // 弹出文档选择器
  43. UIViewController* vc = [iTools appRootViewController];
  44. [vc presentViewController:documentPicker animated:YES completion:nil];
  45. }
  46. #pragma mark - UIDocumentPickerDelegate
  47. - (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray<NSURL *> *)urls {
  48. PickerTotalNumber = urls.count;
  49. curURLS = urls;
  50. for (NSURL *fileURL in urls) {
  51. // 将文件保存到应用的沙盒目录
  52. [self saveFileToAppSandbox:fileURL];
  53. }
  54. }
  55. - (void)documentPickerWasCancelled:(UIDocumentPickerViewController *)controller {
  56. // 用户取消了文件选择
  57. HLog(@"Document picker was cancelled");
  58. [self didFinishPickerTaskFun];
  59. }
  60. - (void)saveFileToAppSandbox:(NSURL *)fileURL {
  61. // 获取文件名称
  62. NSString *fileName = [fileURL lastPathComponent];
  63. // 获取应用的 Documents 目录路径
  64. // NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  65. // NSString *documentsDirectory = [paths firstObject];
  66. NSString *documentsDirectory = kSHPath_FileAPP;
  67. // 构建目标文件路径
  68. NSString *destinationPath = [documentsDirectory stringByAppendingPathComponent:fileName];
  69. NSURL *destinationURL = [NSURL fileURLWithPath:destinationPath];
  70. // 检查文件是否已经存在
  71. if ([[NSFileManager defaultManager] fileExistsAtPath:destinationPath]) {
  72. HLog(@"文件已存在: %@", destinationPath);
  73. didPickerOkNumber ++;
  74. [self didFinishPickerTaskFun];
  75. return;
  76. }
  77. // 将文件从临时位置复制到目标路径
  78. KWeakSelf
  79. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  80. NSError *error;
  81. BOOL success = [[NSFileManager defaultManager] copyItemAtURL:fileURL toURL:destinationURL error:&error];
  82. if (success) {
  83. HLog(@"文件保存成功: %@", destinationPath);
  84. self->didPickerOkNumber ++;
  85. } else {
  86. HLog(@"文件保存失败: %@", error.localizedDescription);
  87. self->didPickerFailNumber ++;
  88. }
  89. mainBlock(^{
  90. [weakSelf didFinishPickerTaskFun];
  91. });
  92. });
  93. }
  94. #pragma mark 判断是否处理完成数据
  95. - (void)didFinishPickerTaskFun
  96. {
  97. if (didPickerOkNumber + didPickerFailNumber < PickerTotalNumber ) {
  98. return;
  99. }
  100. HLog(@"处理完成了")
  101. if(!curURLS || curURLS.count == 0){
  102. return;
  103. }
  104. if(_didPickSuc){
  105. _didPickSuc(curURLS);
  106. }
  107. }
  108. @end