自己做了一个daemon,然后想做个自动升级模块,大致就是监测到新版本,就自动下载deb,安装。
基于新手,现在只能做到就是下载deb,然后放到 “/var/root/Media/Cydia/AutoInstall/”里面,重启手机让它自动安装。
试过下面的这种写法,但是好像没更新到,详细也不太清楚。
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@“usr/bin/dpkg”];
[task setArguments:[NSArray arrayWithObjects:@"-i", @"/var/mobile/Downloads/update.deb", nil]];
NSPipe *pipe = [NSPipe pipe];
[task setStandardOutput:pipe];
[task launch];
NSData *logData = [[pipe fileHandleForReading] readDataToEndOfFile];
[task waitUntilExit];
NSString * string;
string = [[NSString alloc] initWithData: logData encoding: NSUTF8StringEncoding];//root
log(@“Result: %@”, string);
求大神有没有其他更好的方法,不用重启的,直接能安装,然后自动跑新版的方法。
2 个赞
直接调dpkg -i 安装不行吗? 然后在preinst, postinst做点微小的工作
是直接跑 dpkg -i 啊,但是不知道是不是自己更新自己的问题,总是有问题
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@"usr/bin/dpkg"];
[task setArguments:[NSArray arrayWithObjects:@"-i", @"/var/mobile/Downloads/update.deb", nil]];
NSPipe *pipe = [NSPipe pipe];
[task setStandardOutput:pipe];
[task launch];
NSData *logData = [[pipe fileHandleForReading] readDataToEndOfFile];
[task waitUntilExit];
NSString * string;
string = [[NSString alloc] initWithData: logData encoding: NSUTF8StringEncoding];//root
log(@"Result: %@", string);
如果运行上面这段代码,就会报下面的错误
com.apple.xpc.launchd[1] (com.Y3.WeChatTool[1369]) <Warning>: Trampoline was terminated before jumping to service: Killed: 9
dpkg[1359] <Error>: dpkg(1359,0x3d1589dc) malloc: *** error for object 0x3aac7483: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
如果用这种方法
posix_spawnattr_t attr;
posix_spawn_file_actions_t fact;
pid_t pid;
NSLog(@"dpkg");
char *args[] =
{
"/usr/bin/dpkg",
"-i",
"/var/mobile/Downloads/update.deb",
NULL
};
posix_spawnattr_init(&attr);
posix_spawn_file_actions_init(&fact);
int result = posix_spawn(&pid, "/usr/bin/dpkg", &fact, &attr, args, NULL);
NSLog(@"pid=%d,child pid = %d ,result = %d\n", getpid(), pid, result);
if (result == 0) {
int state = 0;
waitpid(pid, &state, 0);
NSLog(@"stat is %d\n", state);
}
最后state是256,而不是0,不知道是我代码写错了,还是哪里有问题,望大神指点
然后preinst:
#!/bin/sh
#安装前执行脚本
myFile="/Library/LaunchDaemons/com.Y3.WeChatTool.plist"
echo "pre exist plist?"
if [ -f "$myFile" ];
then
#暂停进程
echo "run stop"
launchctl stop com.Y3.WeChatTool
echo "run kill"
launchctl kill com.Y3.WeChatTool
echo "run unload"
launchctl unload -w "$myFile"
else
echo "not exist"
fi
postinst:
#!/bin/sh
#安装后执行脚本
myFile="/Library/LaunchDaemons/com.Y3.WeChatTool.plist"
echo "pos exist plist?"
if [ -f "$myFile" ];
then
#启动进程
echo "run load"
launchctl load -w "$myFile"
echo "run start"
launchctl start com.Y3.WeChatTool
else
echo "not exist"
fi
#end
如果把这个安装包用 iFile 或者 放到/var/root/Media/Cydia/AutoInstall/重启安装,都是正常的。
找到问题了,可以把这个问题关了,谢谢。
主要是因为自己更新自己的时候,不能去获取task 的output 或者 errorput,只要去掉那些就可以了。
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@“usr/bin/dpkg”];
[task setArguments:[NSArray arrayWithObjects:@"-i", @"/var/mobile/Downloads/update.deb", nil]];
[task launch];
NSTask需要引入什么头文件吗?
Xcode 9.4 提示不能是被NSTask
一时忘记了,那个时候好像在git上面找得,现在找了一下没找到。
这是头部信息,你可以去找一下:
//
// NSTask.h
// ipacracker
//
// Created by obaby on 14-2-10.
//
//
/* NSTask.h
Copyright (c) 1996-2007, Apple Inc. All rights reserved.
*/
1.检查更新
2.下载更新包到特定位置,我就放"/var/mobile/Downloads/update.deb"
3.然后跑下面这个
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@“usr/bin/dpkg”];
[task setArguments:[NSArray arrayWithObjects:@"-i", “/var/mobile/Downloads/update.deb”, nil]];
[task launch];
1 个赞