这是ios12、13以前,ios10之后的做法,获取相册授权码:
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
dispatch_async(dispatch_get_main_queue(), ^{
switch (status) {
case PHAuthorizationStatusAuthorized: //已获取权限
[self takeAlbum];
break;
case PHAuthorizationStatusDenied: //用户已经明确否认了这一照片数据的应用程序访问
[self.view makeToast:@"访问权限受限,请到设置里设置权限"];
break;
case PHAuthorizationStatusRestricted://此应用程序没有被授权访问的照片数据。可能是家长控制权限
[self.view makeToast:@"此应用程序没有被授权访问的照片数据。可能是家长控制权限"];
break;
default://其他。。。
break;
}
});
}]
最近发现,不行了。
加了个访问权限,PHAccessLevelAddOnly,PHAccessLevelReadWrite。这是位操作符,只加或读写。你可以用位与操作把两种权限加上。
[PHPhotoLibrary requestAuthorizationForAccessLevel:PHAccessLevelAddOnly handler:^(PHAuthorizationStatus status) {
dispatch_async(dispatch_get_main_queue(), ^{
switch (status) {
case PHAuthorizationStatusAuthorized: //已获取权限
[self takeAlbum];
break;
case PHAuthorizationStatusDenied: //用户已经明确否认了这一照片数据的应用程序访问
[self.view makeToast:@"访问权限受限,请到设置里设置权限"];
break;
case PHAuthorizationStatusRestricted://此应用程序没有被授权访问的照片数据。可能是家长控制权限
[self.view makeToast:@"此应用程序没有被授权访问的照片数据。可能是家长控制权限"];
break;
default://其他。。。
break;
}
});
}]
以上全是废话,今天照的原因不在上面。
根源是api的设置问题。
- (IBAction)openAbum:(id)sender {
self.pickController = [[UIImagePickerController alloc]init];
//此处判断相机是否可用
if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
NSLog(@"camera error");
return;
}
//UIImagePickerController *pick = [[UIImagePickerController alloc]init];
self.pickController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
//指定媒体类型是什么 照片还是视频
//默认为 照片
//通过下一行方法可以返回支持的类型
// [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
//查到很多资料都是"kUTTypeMovie","kUTTypeImage"这两个参数名称但是我测试后发现已经变成下面这两种名称
//"public.image" 照片
//"public.movie" 视频
//如果全部支持可以这么设置
//self.pickController.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
//单个支持
self.pickController.mediaTypes = @[@"public.image"];
//代理设置
self.pickController.delegate = self;
//是否提供编辑交互界面 比如说拍完照之后的编辑页面(缩放,剪裁等)
//使用内置编辑控件时,图像选择器控制器会强制执行某些选项。对于照片,强制执行方形裁剪以及最大像素尺寸。对于视频,选择器强制执行最大电影长度和分辨率。如果要让用户指定自定义裁剪,则必须提供自己的编辑UI。
self.pickController.allowsEditing = NO;
//是否显示相机控制按钮
//self.pickController.showsCameraControls = NO;
//自定义相机控制页面
//self.pickController.cameraOverlayView = self.cameraOverLayView;
//如果不需要自定义控制页面可以省略上面两行
//设置闪光灯模式
// self.pickController.cameraFlashMode = UIImagePickerControllerCameraFlashModeAuto;
//相册权限检测 需要导入 #import <Photos/Photos.h> 框架
//用户还没有选择
//PHAuthorizationStatusNotDetermined = 0
// 客户端未被授权访问。用户不能改变状态,可能是由于家长控制
//PHAuthorizationStatusRestricted = 1
// 用户明确拒绝
//PHAuthorizationStatusDenied = 2
// 用户同意访问
//PHAuthorizationStatusAuthorized = 3
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
//相册访问权限
if (status == PHAuthorizationStatusAuthorized) {
NSLog(@"Authorized");
dispatch_async(dispatch_get_main_queue(), ^{
[self presentViewController:self.pickController animated:YES completion:nil];
});
}else{
NSLog(@"Denied or Restricted");
}
}];
}
上面是正常的。
但是一旦放开注释部分,马上崩溃,即使,这些api在旧的ios14之前,没有问题。但到了iOS14.5后,崩溃就发生了。tnd。奇妙。
网友评论