参数接收
命令行工具也是 Mach-O 可执行文件,只是没有 GUI 界面。在终端执行命令行工具的时候,我们可以输入多个参数,而参数就是通过程序入口 main 方法接收的。
int main(int argc, char * argv[]) {
return 0;
}
argc:argument count
的缩写,表示传入 main 函数的参数个数。
argv:argument vector
的缩写,表示传入 main 函数的参数序列或指针,并且第一个参数 argv[0] 一定是程序的名称,并且包含了程序所在的完整路径。所以确切的说需要我们输入的 main 函数的参数个数应该是 argc-1 个。
给可执行文件签名权限
iOS权限
操作系统有许多标准判断你的代码是否可以运行,比如代码签名和沙盒:
-
代码签名:代码签名保证了这个应用里所包含的内容正如它所说的那样不多不少。
-
沙盒:限制了应用访问系统的资源。
Entitlements:code signing entitlements
的缩写,描述了 Binary 需要用到哪些权限。
常规的权限包括 iCloud
、Game Center
等,可以在 Xcode 的 Signing & Capabilities
中添加,添加后会自动写入项目根目录的 xxx.entitlements
文件中,并且在 Build Setting - Code Signing Entitlements
中指定了文件路径。
还有一些系统权限是私有的,如果我们在 entitlements 文件中配置了私有权限,是无法通过 App Store 审核的,但是我们在越狱开发中可以使用这些私有权限。我们可以通过从系统或第三方的一些可执行文件,导出我们需要使用的权限,比如系统的 SpringBoard 桌面程序的可执行文件,路径:/System/Library/CoreServices/SpringBoard.app/SpringBoard
,或者通过 Google 自己搜索查找。
ldid签名工具
我们可以通过 ldid 签名工具,给 Mach-O 可执行文件签上一定的权限。
使用前需要先安装 ldid 签名工具:
➜ brew install ldid
➜ ldid
usage: ldid -S[entitlements.xml] <binary>
ldid -e MobileSafari
ldid -S cat
ldid -Stfp.xml gdb
将可执行文件 SpringBoard 的权限导出到文件 SpringBoard.entitlements:
➜ ls -l
-rwxr-xr-x 1 feng staff 61888 4 1 14:51 MyExec
-rwxr-xr-x 1 feng staff 83736 4 1 14:51 SpringBoard
➜ ldid -e SpringBoard > SpringBoard.entitlements
➜ ls -l
-rwxr-xr-x 1 feng staff 61888 4 1 14:51 MyExec
-rwxr-xr-x 1 feng staff 83736 4 1 14:51 SpringBoard
-rw-r--r-- 1 feng staff 10507 4 1 14:50 SpringBoard.entitlements
将 SpringBoard.entitlements 文件中的权限,写入我们自己的可执行文件 MyExec:
➜ ldid -SSpringBoard.entitlements MyExec
写入权限的时候,-S
和权限文件中间不能有空格。
.entitlements
文件其实就是 plist 文件,plist 文件是 xml 文件,所以在使用 ldid 签名工具的时候,我们导出的权限文件也可以用 xml 后缀。
在iOS执行命令行工具
编写代码:根据 main
函数接收到的参数去实现不同的功能。
编译:编译代码,生成 arm64
可执行文件。
签名:使用 ldid
给可执行文件签名。
运行:将签名后的可执行文件放到手机的 /usr/bin
目录下,在终端输入可执行文件的名字即可执行。