问题描述
旧项目没有兼容iOS14的sdk之前的问题描述,拍照完成,取照片的时候,闪退
- 解决
- 因为iOS14访问照片库权限进行了细分,iOS14之后有以下分类
- 如果你拍照的时候,虽然获取了拍照权限,但是如果没有判断照片的存储权限,且应用的权限设置为仅添加照片或者无,那么你拍完照,然后就会闪退,因为你要拍完照,就要使用,但是使用的权限不够
- 这里我们需要开的权限是选中的照片或者所有照片
相机拍照和相册权限代码判断
- 这里是oc的
- swift的通过这个网址转换一下
//
// MXPermissionCarmera.m
// xbb
//
// Created by coderiding on 2020/9/25.
// Copyright © 2020 xiaobangban. All rights reserved.
//
#import "MXPermissionCarmera.h"
#import <AVFoundation/AVCaptureDevice.h>
#import <AVFoundation/AVMediaFormat.h>
#import <Photos/PHPhotoLibrary.h>
@implementation MXPermissionCarmera
+ (BOOL)isCarmeraPermissionOpen
{
if (![MXPermissionCarmera isPhotoPermissionOpen]) {
return false;
}
AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if (status == AVAuthorizationStatusRestricted || status == AVAuthorizationStatusDenied) {
return false;
}
return true;
}
+ (BOOL)isPhotoPermissionOpen
{
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
if (status == PHAuthorizationStatusRestricted || status == PHAuthorizationStatusDenied)
{
return false;
}
return true;
}
- (void)showCarmeraAlert {
if (![MXPermissionCarmera isPhotoPermissionOpen]) {
[self showPhotoAlert];
return;
}
UIAlertController *alert = [UIAlertController alertControllerTitle:@"需要访问您的相机" message:nil preferredStyle:UIAlertControllerStyleAlert clickBtn:@"去设置" cancelBtn:@"取消" clickBlock:^{
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
} cancelBlock:^{
}];
[[self topViewController] presentViewController:alert animated:YES completion:nil];
}
- (void)showPhotoAlert {
UIAlertController *alert = [UIAlertController alertControllerTitle:@"需要访问您的相册" message:nil preferredStyle:UIAlertControllerStyleAlert clickBtn:@"去设置" cancelBtn:@"取消" clickBlock:^{
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
} cancelBlock:^{
}];
[[self topViewController] presentViewController:alert animated:YES completion:nil];
}
- (UIViewController *)topViewController
{
UIViewController *topViewController = [[UIApplication sharedApplication].keyWindow rootViewController];
while (true) {
if (topViewController.presentedViewController)
{
topViewController = topViewController.presentedViewController;
} else if ([topViewController isKindOfClass:[UINavigationController class]] && [(UINavigationController*)topViewController topViewController])
{
topViewController = [(UINavigationController *)topViewController topViewController];
} else if ([topViewController isKindOfClass:[UITabBarController class]])
{
UITabBarController *tab = (UITabBarController *)topViewController;
topViewController = tab.selectedViewController;
} else {
break;
}
}
return topViewController;
}
@end