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