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


一、权限说明

关于这两个权限,没有看到 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(一)愿患者早日康复

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章