123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325 |
- //
- // HXPhotoCommon.m
- // HXPhotoPickerExample
- //
- // Created by Silence on 2019/1/8.
- // Copyright © 2019年 Silence. All rights reserved.
- //
- #import "HXPhotoCommon.h"
- #import "HXPhotoTools.h"
- static dispatch_once_t once;
- static dispatch_once_t once1;
- static id instance;
- @interface HXPhotoCommon ()<NSURLConnectionDataDelegate, PHPhotoLibraryChangeObserver>
- #if HasAFNetworking
- @property (strong, nonatomic) AFURLSessionManager *sessionManager;
- #endif
- @property (assign, nonatomic) BOOL hasAuthorization;
- @end
- @implementation HXPhotoCommon
- + (instancetype)photoCommon {
- if (instance == nil) {
- dispatch_once(&once, ^{
- instance = [[HXPhotoCommon alloc] init];
- });
- }
- return instance;
- }
- + (instancetype)allocWithZone:(struct _NSZone *)zone {
- if (instance == nil) {
- dispatch_once(&once1, ^{
- instance = [super allocWithZone:zone];
- });
- }
- return instance;
- }
- - (instancetype)init {
- self = [super init];
- if (self) {
- self.audioSessionCategory = AVAudioSessionCategoryPlayback;
- self.isVCBasedStatusBarAppearance = [[[NSBundle mainBundle]objectForInfoDictionaryKey:@"UIViewControllerBasedStatusBarAppearance"] boolValue];
-
- #if HasAFNetworking
- self.sessionManager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
- [self listenNetWorkStatus];
- #endif
- NSURL *imageURL = [[NSUserDefaults standardUserDefaults] URLForKey:HXCameraImageKey];
- if (imageURL) {
- self.cameraImageURL = imageURL;
- }
- self.cameraRollLocalIdentifier = [[NSUserDefaults standardUserDefaults] objectForKey:@"HXCameraRollLocalIdentifier"];
-
- PHAuthorizationStatus status = [HXPhotoTools authorizationStatus];
- if (status == PHAuthorizationStatusAuthorized) {
- [[PHPhotoLibrary sharedPhotoLibrary] registerChangeObserver:self];
- }
- #ifdef __IPHONE_14_0
- else if (@available(iOS 14, *)) {
- if (status == PHAuthorizationStatusLimited) {
- self.cameraRollLocalIdentifier = nil;
- self.cameraRollResult = nil;
- [[PHPhotoLibrary sharedPhotoLibrary] registerChangeObserver:self];
- }else {
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(requestAuthorizationCompletion) name:@"HXPhotoRequestAuthorizationCompletion" object:nil];
- }
- }
- #endif
- else {
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(requestAuthorizationCompletion) name:@"HXPhotoRequestAuthorizationCompletion" object:nil];
- }
- }
- return self;
- }
- - (void)setCameraRollLocalIdentifier:(NSString *)cameraRollLocalIdentifier {
- _cameraRollLocalIdentifier = cameraRollLocalIdentifier;
- if (cameraRollLocalIdentifier) {
- [[NSUserDefaults standardUserDefaults] setObject:cameraRollLocalIdentifier forKey:@"HXCameraRollLocalIdentifier"];
- }
- }
- - (void)requestAuthorizationCompletion {
- if (!self.hasAuthorization) {
- PHAuthorizationStatus status = [HXPhotoTools authorizationStatus];
- if (status == PHAuthorizationStatusAuthorized) {
- self.hasAuthorization = YES;
- [[PHPhotoLibrary sharedPhotoLibrary] registerChangeObserver:self];
- }
- #ifdef __IPHONE_14_0
- else if (@available(iOS 14, *)) {
- if (status == PHAuthorizationStatusLimited) {
- self.cameraRollLocalIdentifier = nil;
- self.cameraRollResult = nil;
- self.hasAuthorization = YES;
- [[PHPhotoLibrary sharedPhotoLibrary] registerChangeObserver:self];
- }
- }
- #endif
- }
- }
- #pragma mark - < PHPhotoLibraryChangeObserver >
- - (void)photoLibraryDidChange:(PHChange *)changeInstance {
- // if (!self.cameraRollResult) {
- // [self photoListReload];
- // return;
- // }
- PHFetchResultChangeDetails *collectionChanges = [changeInstance changeDetailsForFetchResult:self.cameraRollResult];
- if (collectionChanges) {
- if ([collectionChanges hasIncrementalChanges]) {
- if (collectionChanges.insertedObjects.count > 0 ||
- collectionChanges.removedObjects.count > 0 ||
- collectionChanges.changedObjects.count > 0 ||
- [collectionChanges hasMoves]) {
- PHFetchResult *result = collectionChanges.fetchResultAfterChanges;
- self.cameraRollResult = result;
- dispatch_async(dispatch_get_main_queue(), ^{
- [[NSNotificationCenter defaultCenter] postNotificationName:@"HXPhotoViewNeedReloadNotification" object:nil];
- });
- }
- }else {
- PHFetchResult *result = collectionChanges.fetchResultAfterChanges;
- self.cameraRollResult = result;
- [self photoListReload];
- }
- }
- }
- - (void)photoListReload {
- dispatch_async(dispatch_get_main_queue(), ^{
- #ifdef __IPHONE_14_0
- if (@available(iOS 14, *)) {
- PHAuthorizationStatus status = [HXPhotoTools authorizationStatus];
- if (status == PHAuthorizationStatusLimited) {
- if (self.photoLibraryDidChange) {
- self.photoLibraryDidChange();
- }
- }
- }
- #endif
- [[NSNotificationCenter defaultCenter] postNotificationName:@"HXPhotoViewNeedReloadNotification" object:nil];
- });
- }
- - (NSBundle *)languageBundle {
- if (!_languageBundle) {
- NSString *language = [NSLocale preferredLanguages].firstObject;
- HXPhotoLanguageType type = self.languageType;
- switch (type) {
- case HXPhotoLanguageTypeSc : {
- language = @"zh-Hans"; // 简体中文
- } break;
- case HXPhotoLanguageTypeTc : {
- language = @"zh-Hant"; // 繁體中文
- } break;
- case HXPhotoLanguageTypeJa : {
- // 日文
- language = @"ja";
- } break;
- case HXPhotoLanguageTypeKo : {
- // 韩文
- language = @"ko";
- } break;
- case HXPhotoLanguageTypeEn : {
- language = @"en";
- } break;
- default : {
- if ([language hasPrefix:@"en"]) {
- language = @"en";
- } else if ([language hasPrefix:@"zh"]) {
- if ([language rangeOfString:@"Hans"].location != NSNotFound) {
- language = @"zh-Hans"; // 简体中文
- } else { // zh-Hant\zh-HK\zh-TW
- language = @"zh-Hant"; // 繁體中文
- }
- } else if ([language hasPrefix:@"ja"]){
- // 日文
- language = @"ja";
- }else if ([language hasPrefix:@"ko"]) {
- // 韩文
- language = @"ko";
- }else {
- language = @"en";
- }
- }break;
- }
- [HXPhotoCommon photoCommon].languageBundle = [NSBundle bundleWithPath:[[NSBundle hx_photoPickerBundle] pathForResource:language ofType:@"lproj"]];
- }
- return _languageBundle;
- }
- - (NSString *)UUIDString {
- if (!_UUIDString) {
- _UUIDString = [[NSUUID UUID] UUIDString];
- }
- return _UUIDString;
- }
- - (BOOL)isDark {
- if (self.photoStyle == HXPhotoStyleDark) {
- return YES;
- }else if (self.photoStyle == HXPhotoStyleInvariant) {
- return NO;
- }
- #ifdef __IPHONE_13_0
- if (@available(iOS 13.0, *)) {
- if (UITraitCollection.currentTraitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
- return YES;
- }
- }
- #endif
- return NO;
- }
- - (void)saveCamerImage {
- if (self.cameraImage) {
- dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
- NSData *imageData;
- NSString *suffix;
- if (UIImagePNGRepresentation(self.cameraImage)) {
- //返回为png图像。
- imageData = UIImagePNGRepresentation(self.cameraImage);
- suffix = @"png";
- }else {
- //返回为JPEG图像。
- imageData = UIImageJPEGRepresentation(self.cameraImage, 0.5);
- suffix = @"jpeg";
- }
- NSString *fileName = [HXCameraImageKey stringByAppendingString:[NSString stringWithFormat:@".%@",suffix]];
- NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
- NSString *fullPathToFile = [array.firstObject stringByAppendingPathComponent:fileName];
-
- if ([imageData writeToFile:fullPathToFile atomically:YES]) {
- NSURL *imageURL = [NSURL fileURLWithPath:fullPathToFile];
- [[NSUserDefaults standardUserDefaults] setURL:imageURL forKey:HXCameraImageKey];
- self.cameraImageURL = imageURL;
- }
- self.cameraImage = nil;
- });
- }
- }
- - (void)setCameraImage:(UIImage *)cameraImage {
- if (!cameraImage) {
- _cameraImage = nil;
- }
- UIImage *image = [cameraImage hx_scaleImagetoScale:0.5];
- if (image) {
- _cameraImage = image;
- }else {
- _cameraImage = cameraImage;
- }
- }
- /** 初始化并监听网络变化 */
- - (void)listenNetWorkStatus {
- #if HasAFNetworking
- AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
- self.netStatus = manager.networkReachabilityStatus;
- [manager startMonitoring];
- [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
- self.netStatus = status;
- if (self.reachabilityStatusChangeBlock) {
- self.reachabilityStatusChangeBlock(status);
- }
- }];
- #endif
- }
- - (NSURLSessionDownloadTask * _Nullable)downloadVideoWithURL:(NSURL *)videoURL
- progress:(void (^)(float progress, long long downloadLength, long long totleLength, NSURL * _Nullable videoURL))progress
- downloadSuccess:(void (^)(NSURL * _Nullable filePath, NSURL * _Nullable videoURL))success
- downloadFailure:(void (^)(NSError * _Nullable error, NSURL * _Nullable videoURL))failure {
- NSString *videoFilePath = [HXPhotoTools getVideoURLFilePath:videoURL];
-
- NSURL *videoFileURL = [NSURL fileURLWithPath:videoFilePath];
- if ([HXPhotoTools fileExistsAtVideoURL:videoURL]) {
- if (success) {
- success(videoFileURL, videoURL);
- }
- return nil;
- }
- #if HasAFNetworking
- NSURLRequest *request = [NSURLRequest requestWithURL:videoURL];
- /* 开始请求下载 */
- NSURLSessionDownloadTask *downloadTask = [self.sessionManager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
- dispatch_async(dispatch_get_main_queue(), ^{
- if (progress) {
- progress(downloadProgress.fractionCompleted, downloadProgress.completedUnitCount, downloadProgress.totalUnitCount, videoURL);
- }
- });
- } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
- return videoFileURL;
- } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
- dispatch_async(dispatch_get_main_queue(), ^{
- if (!error) {
- if (success) {
- success(filePath, videoURL);
- }
- }else {
- [[NSFileManager defaultManager] removeItemAtURL:videoFileURL error:nil];
- if (failure) {
- failure(error, videoURL);
- }
- }
- });
- }];
- [downloadTask resume];
- return downloadTask;
- #else
- /// pod导入的请改成 "HXPhotoPicker/SDWebImage_AF" 或 "HXPhotoPicker/YYWebImage_AF"
- NSSLog(@"没有导入AFNetworking网络框架无法下载视频");
- return nil;
- #endif
- }
- + (void)deallocPhotoCommon {
- once = 0;
- once1 = 0;
- instance = nil;
- }
- - (void)dealloc {
- [[PHPhotoLibrary sharedPhotoLibrary] unregisterChangeObserver:self];
- [[NSNotificationCenter defaultCenter] removeObserver:self name:@"HXPhotoRequestAuthorizationCompletion" object:nil];
- #if HasAFNetworking
- [[AFNetworkReachabilityManager sharedManager] stopMonitoring];
- #endif
- }
- @end
|