macOS 开发 -文件和文件夹 & 完全磁盘访问权限

本文详细介绍了MacOS中关于完全磁盘访问权限和文件及文件夹权限的管理,包括权限说明、授权目录、授权动作以及如何判断授权状态。特别指出在SIP系统完整性保护下,某些命令无法用于权限管理,必须通过系统偏好设置手动操作。同时提供了一个Objective-C类用于检测完全磁盘访问权限。

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


一、权限说明

关于这两个权限,没有看到 Apple 给开发者的具体建议。
根据:https://support.apple.com/zh-cn/guide/mac-help/mh32356/mac,对于用户而言,这两个权限是

完全磁盘访问权限 : 显示可以访问电脑上所有文件的 App,包括其他 App(例如“邮件”、“信息”、Safari 浏览器和“家庭”)中的数据、时间机器备份中的数据以及此 Mac 上所有用户的部分管理设置。

文件和文件夹 :显示可以访问此 Mac 上不同位置的文件和文件夹的 App。如果您想要阻止其访问文件和文件夹,请取消选择该 App。


相关 url 跳转:

/*
    Privacy_AllFiles 完全磁盘访问权限
    Privacy_Assistive 文件和文件夹
*/
NSString *urlString = @"x-apple.systempreferences:com.apple.preference.security?Privacy_Assistive";
    [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:urlString]];

二、文件和文件夹 权限

1、需要授权的目录

参考自:https://nektony.com/duplicate-finder-free/folders-permission

在这里插入图片描述


文件和文件夹 权限,主要针对下面几个文件夹(有其他文件夹希望告知):

  • Desttop Folder 桌面文件夹, ~/Desktop
  • Documents Folder "文稿"文件夹, ~/Documents
  • Downloads Foder 下载文件夹, ~/Downloads
  • Removable Volumes 可移除的宗卷(如 U 盘), 如 /Volumes/SSWD
  • Network Volumes 服务器卷宗

2、授权动作

在SIP 开启状态下,应用访问上述文件夹时,将会弹出窗口提示用户授权:

在这里插入图片描述

授权结果将会显示在 系统偏好设置 --> 安全性与隐私 --> 隐私 --> 文件和文件夹 中。


3、不需要授权的目录

由于不明确具体哪些目录需要授权,所以测试了以下目录,他们均不需要 文件和文件夹 或 完全磁盘访问权限

  • /Applications
  • ~
  • ~/Library
  • ~/Library/Containers
  • ~/Library/WebKit
  • ~/Library/QuickTime 可以读到数据
  • ~/Pictures
  • ~/Music
  • ~/Library/Mobile Documents
  • ~/Library/Mobile\ Documents/com\~apple\~ScriptEditor2/Documents

三、完全磁盘访问权限

1、手动增删

可以在偏好设置面板中,手动添加和删除应用。

点击添加,会打开文件夹,来选择。

在这里插入图片描述


2、和 文件和文件夹 权限相关

拥有完全磁盘访问权限,在文件和文件夹 中,也会显示出来。

已经授权,完全磁盘访问权限,则访问 桌面等,不会再继续要求授权。

在这里插入图片描述


3、SIP 下 无法用命令 完全磁盘访问 权限

1) tccutil reset all com.ms.VideoEditDemo


2)

$ tccutil reset AllFiles
tccutil: Failed to reset database

$ tccutil reset Assistive
tccutil: Failed to reset database

以上命令均无法像 移除麦克风权限一样移除 完全磁盘访问权限 和 文件夹权限。手动移除是最好的方式。

非 SIP 待测试。


4、完全磁盘访问权限 的授权判断

provided by @HsiangHo

typedef NS_ENUM(NSUInteger, FDAAuthorizationStatus) {
    FDAAuthorizationStatusNotDetermined = 0,
    FDAAuthorizationStatusDenied,  
    FDAAuthorizationStatusAuthorized
} NS_SWIFT_NAME(AuthorizationStatus);

NS_ASSUME_NONNULL_BEGIN

@interface FullDiskAccessAuthorizer : NSObject

+ (instancetype)sharedInstance;
- (FDAAuthorizationStatus)authorizationStatus;
- (void)requestAuthorization;

@end


#import "FullDiskAccessAuthorizer.h"
#import <pwd.h>
#import <Cocoa/Cocoa.h>

static FullDiskAccessAuthorizer *instance;
@implementation FullDiskAccessAuthorizer

+ (instancetype)sharedInstance {
    @synchronized (self) {
        if(nil == instance) {
            instance = [[FullDiskAccessAuthorizer alloc] init];
        }
        return instance;
    }
}

- (FDAAuthorizationStatus)authorizationStatus {
    
    NSString *userHomePath = NSHomeDirectory();
    
    BOOL isSandboxed = (nil != NSProcessInfo.processInfo.environment[@"APP_SANDBOX_CONTAINER_ID"]);
    
    NSLog(@"isSandboxed : %d",isSandboxed);
    
    if (isSandboxed)
    {
        struct passwd *pw = getpwuid(getuid());
        assert(pw);
        userHomePath = [NSString stringWithUTF8String:pw->pw_dir];
    }

    NSString *path = [userHomePath stringByAppendingPathComponent:@"Library/Safari"];
    
    NSLog(@"userHomePath : %@, path : %@",userHomePath,path);
    
    BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:path];
    NSArray<NSString *> *paths = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:nil];
    
    NSLog(@"paths : %@",paths);
    
    if (paths == nil && fileExists){
        return FDAAuthorizationStatusDenied;
    } else if (fileExists) {
        return FDAAuthorizationStatusAuthorized;
    } else {
        return FDAAuthorizationStatusNotDetermined;
    }
}

- (void)requestAuthorization {
    if (@available(macOS 10.14, *)){
        [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"x-apple.systempreferences:com.apple.preference.security?Privacy_AllFiles"]];
    }
}

@end

伊织 2020-02-10(一)愿患者早日康复

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程乐园

请我喝杯伯爵奶茶~!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值