iOS命令行工具开发注意点

/ 0

参数接收

命令行工具也是 Mach-O 可执行文件,只是没有 GUI 界面。在终端执行命令行工具的时候,我们可以输入多个参数,而参数就是通过程序入口 main 方法接收的。

int main(int argc, char * argv[]) {
    return 0;
}

argcargument count 的缩写,表示传入 main 函数的参数个数。

argvargument vector 的缩写,表示传入 main 函数的参数序列或指针,并且第一个参数 argv[0] 一定是程序的名称,并且包含了程序所在的完整路径。所以确切的说需要我们输入的 main 函数的参数个数应该是 argc-1 个。

给可执行文件签名权限

iOS权限

操作系统有许多标准判断你的代码是否可以运行,比如代码签名和沙盒:

Entitlementscode signing entitlements 的缩写,描述了 Binary 需要用到哪些权限。

常规的权限包括 iCloudGame 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 目录下,在终端输入可执行文件的名字即可执行。