ios命令行工具开发

简单说明:

命令行工具的开发对于我们ios开发者来说可能不常使用,但是作为一个程序员我个人认为首先要确保自己的专业知识要过关,其次是其他的知识也要懂些。就比如玩王者荣耀你要有自己擅长的几个英雄,其他的英雄你也要有所了解因为不了解的话别人放技能你都不知道,那样的话就无法自保,个人觉得程序员也是如此。

命令行工具开发工具:

对于我们ios开发者来说xcode就可以。

怎样产生命令行工具:

首先我们创建一个ios的项目,因为我这篇文章介绍的是将我们这个命令行工具安装到手机上,所以我们创建的是一个ios的项目而不是一个mac项目,如果你要创建一个电脑使用的命令行工具那么就创建一个mac项目。为什么这样呢?因为他们支持的架构不同,mac版本支持的是x86架构的,而我们手机支持的是armv7s、armv7、arm64,而我们xcode本身就可以配置这些。比如如下图:


image.png

我们直接运行程序,这时候会生成一个app的包,如下如所示:


image.png

这时候我们show in finder 和 显示包内容就能看见我们的命令行可执行文件,如下如:
image.png

开始创建:

我们创建一个ios的项目,其次,我们将我们的main函数修改为:

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

因为我们不需要界面的,我们只需要他生成一个可执行的文件即可。也就是一个Mach-o文件,所以我们去掉viewController.m 和viewController.h文件,还有appDelegate.h和appDelegate.m文件,我们编译发现没有错误。

怎么出现提示命令

  • 首先我们需要实现这样的一个提示语言,比如我在终端中输入一个DGTools,那么就会出现提示,比如出现一句“你好啊,目前运行时”。需要这样来实现:
    首先代码需要这样写:
int main(int argc, char * argv[]) {
    @autoreleasepool {
        printf("你好啊,目前运行时\n");
        return 0;
    }
}

为什么不用NSLog因为NSLog打印会显示当前的时间。为了不显示当前的状态和时间等等啥的就用c语言的打印信息。然后我们编译按照上面我所说的找到我们的命令行的可执行文件。链接上我们的越狱手机,打开ifunbox,找到手机的/usr/bin目录(不懂的请看我之前的越狱相关的简书,怎样链接手机说的很清楚,包括怎样越狱等等确实不是几句话能够说清楚的),比如我的如下:


image.png

将我们这个命令行工具拖拽到这个文件夹下,为了这个命令行工具获得更大的权限,我们需要赋予它可执行的权限:

chmod +x /usr/bin/DGTools

这时候我们在终端输入DG按tab键发现就有提示了,我们回车发现就打印了我们下边的这句话了,如图所示:


image.png

这时候自己的内心是不是有点小激动,但是我告诉你,还有很多东西你不知道的,下面我们来说明:
比如:现在我们要实现这个功能,就是类似于这种:


image.png

好,那我们的代码大致如下:
    printf("-l 显示用户的名字\n");
    printf("-e 显示用户的昵称\n");
    printf("-d 显示已经删除的用户\n");
    printf("-f 显示添加的好友\n");
image.png

注意:我们在安装新的命令行工具到手机的时候需要删除原来的命令行可执行文件,然后在重新安装。在添加可执行的权限在执行命令否则可能会不正确。

  • 下面实现这个类似于这个现象:


    image.png

    那我觉得代码应该这样写:

int main(int argc, char * argv[]) {
    @autoreleasepool {
        if (strcmp(argv[1], "-l") == 0) {
            printf("我的名字是目前运行时\n");
            return 0;
        }else if (strcmp(argv[1], "-e") == 0){
            printf("我的昵称是北京老布鞋\n");
            return 0;
        }else if (strcmp(argv[1], "-d") == 0){
            printf("删除的用户是:啦啦啦\n");
            return 0;
        }else if (strcmp(argv[1], "-f") == 0){
            printf("添加的好友是:龙卷风\n");
            return 0;
        }else{
            printf("-l 显示用户的名字\n");
            printf("-e 显示用户的昵称\n");
            printf("-d 显示已经删除的用户\n");
            printf("-f 显示添加的好友\n");
        }
        return 0;
    }
}

下面是我的执行的结果:


image.png

注意点:为什么我们代码中判断的是数组第1个而不是第0个,因为第0个是我们这个可执行文件的路径,所以从第一个开始才是参数。

获取更多的权限

我们命令行工具有时候需要获得其他的app的路径、app的可知执行文件等等,但是我们现在的命令行工具是没有这个权限的,比如我给大家看下我目前的命令行工具的权限,首先我们需要安装一个工具那就是ldid,至于怎么安装,我前边的简书:app简单插件的开发有说道。
我们执行这个命令:

ldid -e DGTools > DGTools.entitlements

其中DGTools.entitlements这个是一个权限的文件,当然你写成DGTools.plist也是可以的,注意点:要切换到DGTools所在的目录:比如我的是这样的:


image.png

切记这个命令的执行是不连在手机上的。他会在你所在的文件下生成一个这个文件


image.png

下面是DGTools这个可执行文件的权限:
image.png

可以看到他并没有很多的权限,我们要求的就是他拥有很多的权限,因为权限越多越好.怎么办?我们知道越狱的手机他的SpringBoard的权限是非常多的,那么我们可以把他的权限赋值给我们的DGTools那样不就是很完美了吗!
下面我们找到SpringBoard所在的位置,并且拿到他的可执行文件拷贝到我们的电脑桌面。具体步骤如下:
1.执行命令:

// 在链接上手机的终端执行这个命令:
ps -A

会看到SpringBoard的目录位置为:


image.png

找到他拷贝到电脑的桌面:


image.png

执行命令如下:
ldid -e SpringBoard > DGTools2.entitlements

可以看到这个可执行文件的权限真的很多:


image.png

下面我们将他的权限赋值到我们的可执行文件上:
执行命令:

// 名字你自己随便起
ldid -e SpringBoard > ll.entitlements

然后将这个权限赋值给我们的DGTools可执行文件,执行命令如下:

ldid -Sll.entitlements DGTools

为了安全起见我们看一下此时的我们这个可执行文件的权限:

ldid -e DGTools > DGTools3.entitlements

用xcode打开可以发现是没有问题了。然后我们将这个DGTools拖拽到我们的手机上。
最后整理一下代码,增加了一些严谨性,如下:

int main(int argc, char * argv[]) {
    @autoreleasepool {
        if (argc == 1) {
            printf("-l 显示用户的名字\n");
            printf("-e 显示用户的昵称\n");
            printf("-d 显示已经删除的用户\n");
            printf("-f 显示添加的好友\n");
            return 0;
        }
        if (strcmp(argv[1], "-l") == 0) {
            printf("我的名字是目前运行时\n");
            return 0;
        }else if (strcmp(argv[1], "-e") == 0){
            printf("我的昵称是北京老布鞋\n");
            return 0;
        }else if (strcmp(argv[1], "-d") == 0){
            printf("删除的用户是:啦啦啦\n");
            return 0;
        }else if (strcmp(argv[1], "-f") == 0){
            printf("添加的好友是:龙卷风\n");
            return 0;
        }else{
            printf("-l 显示用户的名字\n");
            printf("-e 显示用户的昵称\n");
            printf("-d 显示已经删除的用户\n");
            printf("-f 显示添加的好友\n");
        }
        return 0;
    }
}

至此:命令行工具开发你应该会了。

推荐阅读更多精彩内容