最近在做MacOS App打开虚拟端口的需求时,遇到”Operation not permitted“的报错信息,查阅资料后发现mac上虽然权限比iOS告,但需要一些操作,需要提权。
网上常见的提权方式有三种:AuthorizationExecuteWithPrivileges、LaunchdDaemon、AppleScript。经过调研我们需求比较符合使用LaunchdDaemon,所以这次主要记录下这种方式的实现过程,其他方法及具体介绍可以看这位博主的文章。
网上有很多LaunchdDaemon的实现步骤,但是时间久远,很多按照步骤都无法运行,经过踩坑以后,这次记录下我的实现过程,并已经成功运行。这边文章综合参考了TunelBlick,EvenBetterAuthorizationSample,SMJobBless中的相关代码。
第一步
1、由于新版的xcode建立Mac工程后默认没显示Info.plist文件,所以新建工程后,在主工程Tartget--Info里面随便添加一个key,让Info.plist显示在工程目录中。
1637805038783.jpg2、避免后续步骤比较麻烦,在XCode--Preferences--Locations--locations--Advanced,改成Legacy。这一步会将生成.app放到工程目录内。
1637807484810.jpg
*以下步骤参考SMJobBless的Demo
3、关闭AppSanbox。
4、拷贝 Demo 中的 SMJobBlessUtil.py 到项目根目录。
5、创建一个新 Target,选择 Command Line Tool,命名为 MyAppHelper。
*以下内容参考EvenBetterAuthorizationSample的Demo
6、创建 MyAppHelper-Info.plist 文件并配置必要参数。
7、创建 MyAppHelper-Launchd.plist 文件并配置必要参数。
8、在 MyAppHelper Target 中配置 Product Module Name 和 Product Name 为MyAppHelperTarget的BundleID。
9、选择 MyApp Target 配置 Copy Files,路径 Contents/Library/LaunchServices。
10、生成签名参数(参考SMJobBless中的ReadMe文件)。
成功后会输出:
SMJobBlessApp/SMJobBlessApp-Info.plist: updated
SMJobBlessHelper/SMJobBlessHelper-Info.plist: updated
然后用./SMJobBlessUtil.py check <SMJobBlessApp.app:path>检查
没有任何输出代表成功。
11、最后可以写入授权代码及测试代码,这一步具体代码参考EvenBetterAuthorizationSample中AppDelegate中代码和common及HelperTool。
12、HelperTool中需要把kHelperToolMachServiceName改为自己的,AppDelegate中的InstallAction也需要改为自己的。
中间每一个步骤一定要按照配置和ReadMe中的步骤去弄,不然会出错。
最后,相当于是先运行install方法,启动helper,然后仿照EvenBetterAuthorizationSample中的实现方式就可以通过helper进程实现提权的操作了。
网友评论