iOSOpenDev 关闭指定程序(而非重启SpringBoard)

前提描述

在使用越狱开发的过程中,我们使用的代码编写除了Theos就是iOSOpenDev了,之前使用Theos的时候还可以在Makefile里通过设置after-install字段指定关闭的程序,如下图所示。

但是使用了iOSOpenDev之后貌似每次“Build For Profiling”的时候都是简单粗暴的重启“SpringBoard”(时间比较慢,且会关闭其他无关程序)。但是很多情况下我们其实只是希望重启一个程序就好了,例如QQ、WeChat、MobileNotes等,轻微强迫症对此表示完全无法接受。因此,提供让iOSOpenDev支持指定关闭应用的功能显得尤其重要。以下为操作步骤,
警告:warning::warning::以下步骤仅仅亲测可用,但是并没有经过太多验证,请提前做好备份,谨慎操作,一切损失与楼主无关。

操作步骤

1、因为iOSOpenDev在xcode的Build Settings里加入了几个自定义的配置,如下图所示链接:iOSOpenDev配置说明, 而其中的iOSOpenDevRespringOnInstall字段则表示安装后是否重启SpringBoard,我们的目的是要增加一个字段叫iOSOpenDevAppKilledAfterInstalled,用来配置安装之后杀掉的进程。因此我们之后的找的关键重启代码也是根据这个字段来找线索。因为是在xcode的Build Settings,所以很自然的我们找到了iOSOpenDev/templates/Base.xctemplate/TemplateInfo.plist这个文件,文件里面有iOSOpenDev的一些字段配置声明,因此我在这个plist里增加一个字段,并且设置默认为SpringBoard。默认TemplateInfo.plist (5.0 KB),修改后TemplateInfo.plist (5.1 KB)



2、经过以上步骤,重新用iOSOpenDev建一个Logos Tweak在配置中就会出现我们刚增加的字段了。

3、修改iOSOpenDev/bin/iosod文件,默认的iosod (58.8 KB)修改后的iosod (59.0 KB)

具体就是修改tweak在安装之后的操作代码,虽然这个文件的代码不太懂,但是照葫芦画瓢改下逻辑还是可以的,关键修改点如下图


4、现在就可以愉快的指定“Build For Profiling”执行之后关闭的应用啦!

谢谢分享:wink:

干得漂亮!
我选择接着用theos

您好,请问有没有在theos application 中可以关闭指定APP的实现,我已经搜了很多,但是没有找到,

启动对应APP的方法可用用 LSApplicationWorkspace 这个已经亲身验证可行,

还有http://bbs.iosre.com/t/app/3092

这位的方式,

但是如何做到kill 一个 app呢

越狱的话直接kill或者killall就行了啊

哈哈哈 您改头像和昵称了呀,
我意思在objc代码中实现
这个有方法吗?

意义何在?

我想他要的是system("killall -9 SpringBoard")这样的吧

她一定要oc方法啊

不好意思,我表达有误,并不是一定要OC方法,在OC中可以调用就可以了,
我试了楼上的方法,不过system 在 iOS11/Xcode9 中已经废弃了

意义是我想通过我theos Application 重启另一个应用,笨办法是要先把这个应用给关闭掉,再用 LSApplicationWorkspace open

谢谢你,你说的是我想要的,不过iOS11 / Xcode9 下已经不可用了.

posix spawn。那只是个警告而已吧应该。关掉warning

int spawn(const char* executable, ...)
{
    int     ret;
    pid_t   pid;
    va_list args;

    va_start(args, executable);

    ret = posix_spawn(&pid, executable, NULL, NULL, (char* const *)args, NULL);
    if (ret == 0)
        waitpid(pid, NULL, 0);

    return ret;
}

error: ‘system’ is unavailable: not available on iOS

是报了一个这样的错误,我搜索了下说是11 不能使用这个了

啊, spawn 我发现我什么也不会了.再学习 谢谢

一个复杂的实现方式。。。用NSTask打开shell,然后参数传入kill命令 哈哈(也就是说用代码完成这个输入kill命令过程)

1 个赞

谢谢,我试试

不太建议用kill方式,无论是system 还是posix_spawn的方式够不能关掉app,用springboard里面的kill方法可以彻底关掉。

1 个赞

好的,我开始hook SpringBoard 了

请教下 posix_spawn 返回值为0 ,但是没有关闭程序 是什么问题 代码如下
int runcmdKill(){
posix_spawnattr_t attr;
posix_spawn_file_actions_t fact;
pid_t pid;
char cmd[]=“killall”;
char opt[]="-9";
char opt2[]=“WeChat”;
char *args[4];
args[0]=cmd;
args[1]=opt;
args[2]=opt2;
args[3]=NULL;
posix_spawnattr_init(&attr);
posix_spawn_file_actions_init(&fact);
int result = posix_spawn(&pid,"/bin/kill",&fact,&attr,args,environ);
NSLog(@“posix_spawn”);
NSLog(@“pid=%d,child pid = %d ,result = %d\n”,getpid(),pid,result);

int stat=0;
waitpid(pid,&stat,0);
NSLog(@"stat is %d\n",stat);
return 0;

}