iOS相机、相册的访问权限

本文介绍了一种iOS应用中实现相机和相册访问权限管理的方法。包括带弹框的权限请求流程和无弹框的权限状态检查。通过Objective-C代码示例展示了如何优雅地处理权限请求及其回调。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、带弹框的权限判断

.h

typedef void (^FinishPicking)(UIImage *image);

@interface ImagePicker : NSObject <UIImagePickerControllerDelegate, UINavigationControllerDelegate>
// 访问相机
+ (void)showCameraFromVC:(UIViewController *)fromVC finishPicking:(FinishPicking)finishPicking;
// 访问相册
+ (void)showAlbumFromVC:(UIViewController *)fromVC finishPicking:(FinishPicking)finishPicking;
@end

.m

#import <Photos/PHPhotoLibrary.h>
#import <AVFoundation/AVCaptureDevice.h>

static FinishPicking _finishPicking;

@implementation ImagePicker

// 访问相机功能
+ (void)showCameraFromVC:(UIViewController *)fromVC finishPicking:(FinishPicking)finishPicking {
    _finishPicking = [finishPicking copy];
    
    // 判断相机授权,弹出访问权限提示框
    [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
        dispatch_async(dispatch_get_main_queue(),^{
            if (granted) { // 授权成功
                [self openCamera:fromVC];
            } else { // 拒绝授权
                [self showCameraPermissionsTipPopView:fromVC];
            }
        });
    }];
}

// 打开相机
+ (void)openCamera:(UIViewController *)fromVC {
    if (@available(iOS 11.0, *)) {
        [UIScrollView appearance].contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentAlways;
    }
    
    UIImagePickerController *ipv = [[UIImagePickerController alloc] init];
    ipv.delegate = [self self];
    ipv.sourceType = UIImagePickerControllerSourceTypeCamera;
    ipv.modalPresentationStyle = UIModalPresentationFullScreen;
    [fromVC presentViewController:ipv animated:YES completion:nil];
}

// 不能打开相机时提示
+ (void)showCameraPermissionsTipPopView:(UIViewController *)fromVC {
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"请在手机系统设置中开启此权限" preferredStyle:UIAlertControllerStyleAlert];
    [alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {}]];
    [alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        [self openSettings];
    }]];
    [fromVC presentViewController:alert animated:YES completion:nil];
}


// 访问相册功能
+ (void)showAlbumFromVC:(UIViewController *)fromVC finishPicking:(FinishPicking)finishPicking {
    _finishPicking = [finishPicking copy];
    
    // 判断相册授权,弹出访问权限提示框
    [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
        dispatch_async(dispatch_get_main_queue(),^{
            if (status == PHAuthorizationStatusAuthorized) {
                [self openPhotoAlbum:fromVC];
            } else {
                [self showPhotoAlbumPermissionsTipPopView:fromVC];
            }
        });
    }];
}

// 打开相册
+ (void)openPhotoAlbum:(UIViewController *)fromVC {
    if (@available(iOS 11.0, *)) {
        [UIScrollView appearance].contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentAlways;
    }
    
    UIImagePickerController *ipv = [[UIImagePickerController alloc] init];
    ipv.delegate = [self self];
    ipv.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    ipv.modalPresentationStyle = UIModalPresentationFullScreen;
    [fromVC presentViewController:ipv animated:YES completion:nil];
}

// 不能打开相册时提示
+ (void)showPhotoAlbumPermissionsTipPopView:(UIViewController *)fromVC {
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"请在手机系统设置中开启此权限" preferredStyle:UIAlertControllerStyleAlert];
    [alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {}]];
    [alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        [self openSettings];
    }]];
    [fromVC presentViewController:alert animated:YES completion:nil];
}

// 打开设置
+ (void)openSettings {
    NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
    if ([[UIApplication sharedApplication] canOpenURL:url]) {
        if (@available(iOS 10.0, *)) {
            [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:^(BOOL success) {}];
        } else {
            [[UIApplication sharedApplication] openURL:url];
        }
    }
}

// 回调
+ (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
    if (image && _finishPicking) {
        _finishPicking(image);
        _finishPicking = nil;
    }

    [picker dismissViewControllerAnimated:YES completion:^{
        if (@available(iOS 11.0, *)) {
            [UIScrollView appearance].contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
        }
    }];
}

+ (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    [picker dismissViewControllerAnimated:YES completion:^{
        if (@available(iOS 11.0, *)) {
            [UIScrollView appearance].contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
        }
    }];
}

@end

二、无弹框的权限判断

PHAuthorizationStatus authorizationStatus = [PHPhotoLibrary authorizationStatus];
    if (authorizationStatus == PHAuthorizationStatusAuthorized) {
        return YES;
    } else {
        return NO;
    }
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
    if (authStatus == AVAuthorizationStatusAuthorized) {
        return YES;
    } else {
        return NO;
    }
### 实现苹果iOS设备H5页面保存图片到相册 在H5页面中实现苹果iOS设备保存图片到相册的功能,可以通过多种方式来完成。以下是几种常见的解决方案及其适用场景。 #### 方法一:利用`html2canvas`库处理截图并保存 对于需要动态生成图片的情况,可以使用`html2canvas`库将HTML内容转换为Canvas对象,再将其导出为Base64编码的图片数据,并通过JavaScript调用Safari浏览器内置的行为触发保存操作。 ```javascript async function saveImageToGallery() { const element = document.getElementById('screenshot-area'); // 需要截取的内容区域 const canvas = await html2canvas(element); const imgData = canvas.toDataURL('image/png'); // 创建隐藏的<a>标签用于下载图片 const link = document.createElement('a'); link.href = imgData; link.download = 'screenshot.png'; document.body.appendChild(link); try { // iOS Safari会自动识别download属性并提示用户保存图片 link.click(); } catch (error) { console.error('Failed to trigger image saving:', error); } document.body.removeChild(link); // 清理临时DOM节点 } ``` 此方法适用于大多数现代浏览器环境下的静态或动态内容捕获[^1]。 --- #### 方法二:直接链接远程图片资源供用户保存 当目标是让用户能够轻松保存已有的网络图片时,可以直接设置带有`download`属性的超链接指向该图片文件地址: ```html <a href="https://example.com/path/to/image.jpg" download> <button>点击保存图片</button> </a> ``` 不过需要注意,在某些较老版本或者特定配置下运行的iOS系统可能会忽略这个特性而仅打开原图预览界面而不是立即进入存储流程[^4]。 --- #### 方法三:借助第三方插件增强兼容性 如果遇到更复杂的情形比如跨域加载外部素材等问题,则考虑引入专门针对移动端优化过的开源项目如Cordova/PhoneGap等框架所提供的API接口来进行更加深入的操作控制。 例如基于Plus API 的例子如下所示: ```javascript $('#savePic').click(function(){ var imgUrl = "http://yourserver.com/images/sample_image.jpg"; // 替换为目标实际URL var timestamp = (new Date()).valueOf(); var downLoader = plus.downloader.createDownload( imgUrl, {method:'GET',filename:'_downloads/image/'+timestamp+'.jpg'}, function(download,status){ if(200===status){ let localPath=download.filename; plus.gallery.save(localPath,function(){ alert("图片已成功保存!"); },function(error){ alert(`发生错误:${JSON.stringify(error)}`); }); } else{ alert("未能正确获取指定图像资料."); } } ); downLoader.start(); }); ``` 这种方法主要面向混合应用开发模式下的需求满足。 --- #### 注意事项 无论采用哪种技术路线都应充分考虑到不同机型之间的差异以及可能出现的各种异常状况加以妥善应对;同时也要尊重用户的隐私权等相关法律法规规定合理合法地收集必要的权限请求信息以便顺利完成预期任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值