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;
    }
}

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,009评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,808评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,891评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,283评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,285评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,409评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,809评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,487评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,680评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,499评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,548评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,268评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,815评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,872评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,102评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,683评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,253评论 2 341

推荐阅读更多精彩内容