在cocoa程序中获得系统授权
偶然间,需要用到Mac的相关授权,所以就有了现在这篇文章了。。
有3种方法可以得到系统权限的授权。
1. 官方推荐实例,BetterAuthorizationSample
这个实例得中心思想,是将需要授权的应用代码片段和主程序分离,这样,从最大程度上减小了由于主程序出现bug,从而导致权限漏洞得问题,也避免了开发中的bug,导致整个应用程序在高权限下运行的危险。你可以下载此官方代码。
2. 利用authopen命令
你可能觉得使用这个BetterAuthorizationSample过于复杂和庞大。的确,对于哪些很小的程序,使用BAS架构是在过于麻烦,那么我们可以利用Mac OS X内置的openauth命令,来执行一些需授权的代码。
比如我要修改/etc/hosts文件,最简单的使用authopen的方法。。。
代码如下:
NSString *convertedPath = [NSString stringWithUTF8String:[@"/etc/hosts" UTF8String]]; NSTask *task = [[NSTask alloc] init]; NSPipe *pipe = [[NSPipe alloc] init]; NSFileHandle *writeHandle = [pipe fileHandleForWriting]; [task setLaunchPath:@"/usr/libexec/authopen"]; [task setArguments:[NSArray arrayWithObjects:@"-c", @"-w", convertedPath, nil]]; [task setStandardInput:pipe]; [task launch]; NSString *testString = @"127.0.0.1 localhost\n255.255.255.255 broadcasthost \n::1 localhost \nfe80::1%lo0 localhost"; NSData *data = [testString dataUsingEncoding: NSUTF8StringEncoding]; [writeHandle writeData:data]; close([writeHandle fileDescriptor]); // Close it manually [task waitUntilExit];
首先我们可以读取hosts文件内容,,,修改后,放到NSData对象中,利用NSTask执行authopen,通过流写入,即可,,,注意上面代码中的
[NSArray arrayWithObjects:@"-c", @"-w", convertedPath, nil]
对于authopen,的-c -w参数,则会接受输入流,,,这时系统会弹出一个授权对话框,这个跟上一个方法的区别在于,这个对话框始终是显示authopen进程需要授权,这会给用户带来一定的困惑。
3. 利用AuthorizationCreate API
最后说说利用最广的AuthorizationCreate API。直接看代码:
NSString *toolPath = [[NSBundle mainBundle] pathForAuxiliaryExecutable:@”InstallBootImage”]; AuthorizationFlags authFlags = kAuthorizationFlagDefaults | kAuthorizationFlagInteractionAllowed | kAuthorizationFlagPreAuthorize | kAuthorizationFlagExtendRights; AuthorizationItem authItems[] = {kAuthorizationRightExecute, strlen([toolPath fileSystemRepresentation]), (void*)[toolPath fileSystemRepresentation], 0}; AuthorizationRights authRights = {sizeof(authItems)/sizeof(AuthorizationItem), authItems}; return (AuthorizationCreate(&authRights, kAuthorizationEmptyEnvironment, authFlags, &auth) == errAuthorizationSuccess); AuthorizationExecuteWithPrivileges(auth, [toolPath fileSystemRepresentation], kAuthorizationFlagDefaults, toolArgs, NULL);
上面的一段代码用来获得auth授权对象,当授权对象获得成功,则使用AuthorizationExecuteWithPrivileges执行授权代码,,这个使用最为直观简便。
我现在选择的是第二种方法,暂时没有出现啥毛病,其他的看着眼晕。。。
效果如下
host 内容如下:
127.0.0.1 localhost 255.255.255.255 broadcasthost ::1 localhost fe80::1%lo0 localhost
【声明】本文 在cocoa程序中获得系统授权 为柠之漠然原创文章,转载请注明出自
枫之落叶
并保留本文有效链接:https://blog.shiniv.com/2013/07/%e5%9c%a8cocoa%e7%a8%8b%e5%ba%8f%e4%b8%ad%e8%8e%b7%e5%be%97%e7%b3%bb%e7%bb%9f%e6%8e%88%e6%9d%83/ , 转载请保留本声明!