如何从system()获取日志;?

时间:2014-02-18 19:00:24

标签: ios system jailbreak

有没有办法从system()获取日志;就像我system("open com.apple.nike");时一样,我应该Couldn't open application: com.apple.nike. Reason: 8, application disabled or restricted。这将在我的iOs 7设备上运行

由于

修改:// 的 这是新代码,但它不会工作,我会得到

    *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'launch path not accessible'
    *** First throw call stack:

NSString *bundleID = @"com.apple.nike";
    NSTask *task = [[NSTask alloc] init];
                    [task setLaunchPath: @"sudo"];
                    [task setArguments: [[NSArray alloc] initWithObjects:[NSString stringWithFormat:@"open %@", bundleID], nil]];

                    NSPipe *pipe= [NSPipe pipe];
                    [task setStandardOutput: pipe];

                    NSFileHandle *file = [pipe fileHandleForReading];

                    [task launch];

                    NSData *data = [file readDataToEndOfFile];

                    NSString *output = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
                    NSLog(@"result: %@", output);

1 个答案:

答案 0 :(得分:1)

我知道这并不是完全你提出的问题,但也许还有更好的方法。

如果要运行命令(如open com.apple.nike),我认为使用NSTask实际上是以编程方式执行此操作的最佳方法。 NSTask将允许您运行与system()类似的命令,但可以很好地支持处理这些命令的标准输出,而无需在系统日志文件上执行文件I / O.

例如,以下是使用NSTask列出目录内容(ls -altr)并在NSString中捕获输出的示例:

- (void) listDir {
   NSTask *task = [[NSTask alloc] init];
   [task setLaunchPath: @"/bin/ls"];
   [task setArguments: [[NSArray alloc] initWithObjects: @"-altr", nil]];

   NSPipe *pipe= [NSPipe pipe];
   [task setStandardOutput: pipe];

   NSFileHandle *file = [pipe fileHandleForReading];

   [task launch];

   NSData *data = [file readDataToEndOfFile];

   NSString *output = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
   NSLog(@"result: %@", output);
}

这将使open命令的输出与系统日志文件中的任何其他内容分开。

NSTask是iOS上的私有API,但与OS X上存在的许多API一样,它们实际上可以在iOS上使用(只是不要假设Apple允许它们在App Store中使用!)。

要使用它,您需要下载NSTask.h标头,并将其包含在您的项目中。

Here's an old version,但我敢打赌它仍然可行。