【问题标题】:How to get the log from system();?如何从 system(); 获取日志?
【发布时间】:2014-02-18 19:00:23
【问题描述】:

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

谢谢

编辑:// 这是新代码,但它不会工作,我会得到 ​​p>

    *** 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);

【问题讨论】:

标签: ios system jailbreak


【解决方案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);
}

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

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

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

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

【讨论】:

  • 嗨,我更新了我的问题,因为它没有按预期工作。执行命令时我的应用程序崩溃
  • 这可能是因为sudo 没有安装在您的设备上......它不是默认安装的。无论如何,我认为你无论如何都不需要它。运行open 应该以mobile 用户身份运行;您不需要root 权限来打开应用程序。应用程序通常以mobile 运行。因此,您的启动路径不应是sudo,而应该是open,或者可能是/usr/bin/open。然后,您还在参数中添加了一个空格。那可能也不对。参数是一个数组,因为每个参数(在命令行上用空格分隔)是一个不同的数组元素。
  • @DavidG.,不客气。出于安全原因,包括完整路径通常是个好主意。即使您确实使用了system() 调用,最好还是完全限定命令的路径。很高兴听到它现在可以工作了:)
猜你喜欢
  • 2017-12-24
  • 1970-01-01
  • 2020-06-16
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多