DocumentPickerManager.m 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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. _didPickSuc = success;
  33. // 创建 UIDocumentPickerViewController
  34. UIDocumentPickerViewController *documentPicker = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:@[(NSString *)kUTTypeItem] inMode:UIDocumentPickerModeImport];
  35. // 启用多选
  36. documentPicker.allowsMultipleSelection = YES;
  37. // 设置代理
  38. documentPicker.delegate = self;
  39. // 设置模态呈现样式
  40. documentPicker.modalPresentationStyle = UIModalPresentationFormSheet;
  41. // 弹出文档选择器
  42. UIViewController* vc = [iTools appRootViewController];
  43. [vc presentViewController:documentPicker animated:YES completion:nil];
  44. }
  45. #pragma mark - UIDocumentPickerDelegate
  46. - (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray<NSURL *> *)urls {
  47. PickerTotalNumber = urls.count;
  48. curURLS = urls;
  49. for (NSURL *fileURL in urls) {
  50. // 将文件保存到应用的沙盒目录
  51. [self saveFileToAppSandbox:fileURL];
  52. }
  53. }
  54. - (void)documentPickerWasCancelled:(UIDocumentPickerViewController *)controller {
  55. // 用户取消了文件选择
  56. HLog(@"Document picker was cancelled");
  57. }
  58. - (void)saveFileToAppSandbox:(NSURL *)fileURL {
  59. // 获取文件名称
  60. NSString *fileName = [fileURL lastPathComponent];
  61. // 获取应用的 Documents 目录路径
  62. // NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  63. // NSString *documentsDirectory = [paths firstObject];
  64. NSString *documentsDirectory = kSHPath_FileAPP;
  65. // 构建目标文件路径
  66. NSString *destinationPath = [documentsDirectory stringByAppendingPathComponent:fileName];
  67. NSURL *destinationURL = [NSURL fileURLWithPath:destinationPath];
  68. // 检查文件是否已经存在
  69. if ([[NSFileManager defaultManager] fileExistsAtPath:destinationPath]) {
  70. HLog(@"文件已存在: %@", destinationPath);
  71. didPickerOkNumber ++;
  72. [self didFinishPickerTaskFun];
  73. return;
  74. }
  75. // 将文件从临时位置复制到目标路径
  76. KWeakSelf
  77. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  78. NSError *error;
  79. BOOL success = [[NSFileManager defaultManager] copyItemAtURL:fileURL toURL:destinationURL error:&error];
  80. if (success) {
  81. HLog(@"文件保存成功: %@", destinationPath);
  82. self->didPickerOkNumber ++;
  83. } else {
  84. HLog(@"文件保存失败: %@", error.localizedDescription);
  85. self->didPickerFailNumber ++;
  86. }
  87. mainBlock(^{
  88. [weakSelf didFinishPickerTaskFun];
  89. });
  90. });
  91. }
  92. #pragma mark 判断是否处理完成数据
  93. - (void)didFinishPickerTaskFun
  94. {
  95. if (didPickerOkNumber + didPickerFailNumber < PickerTotalNumber ) {
  96. return;
  97. }
  98. HLog(@"处理完成了")
  99. if(_didPickSuc){
  100. _didPickSuc(curURLS);
  101. }
  102. }
  103. @end