由于iPhone是沙盒应用程序,我无法访问/bin/
文件夹。所以我使用SSH连接从iPhone获取/bin/date
二进制文件,并将其包含在我的项目中。当我使用NSLog
打印时,我的文件路径是正确的:/var/mobile/Applications/95078888-DDA8-4C1E-93DC-1F9E0A26E70A/Documents/date
。我遇到的问题列在下面。有谁知道我可以如何解决这个错误?注意:如果我在模拟器中运行它,并使用此代码执行与Mac OSX兼容的任何二进制文件,但是当我尝试使用iPhone二进制文件在设备上运行它时,它会导致出现问题。在越狱iPhone上执行二进制文件
错误:
2012-08-09 14:23:13.757 TestBinary[7891:707] Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'couldn't fork: errno 1'
First throw call stack: (0x359b388f 0x335d7259 0x359b3789 0x359b37ab 0x34deb915 0xda5af 0x3590d3fd 0x330cee07 0x330cedc3 0x330ceda1 0x330ceb11 0x330cf449 0x330cd92b 0x330cd319 0x330b3695 0x330b2f3b 0x336a522b 0x35987523 0x359874c5 0x35986313 0x359094a5 0x3590936d 0x336a4439 0x330e1cd5 0xd9ecd 0xd9e98)
terminate called throwing an exception
Program received signal: “SIGABRT”. Data Formatters temporarily unavailable, will re-try after a 'continue'. (Can't find dlopen function, so it is not possible to load shared libraries.)
mi_cmd_stack_list_frames: Not enough frames in stack.
mi_cmd_stack_list_frames: Not enough frames in stack.
代码调用号文件:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [NSString stringWithFormat:@"%@/date", documentsDirectory];
NSLog(@"%@", path);
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath: path];
NSPipe *pipe;
pipe = [NSPipe pipe];
[task setStandardOutput: pipe];
NSFileHandle *file;
file = [pipe fileHandleForReading];
[task launch];
NSData *data;
data = [file readDataToEndOfFile];
NSString *string;
string = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
label.numberOfLines=0;
label.text = string;
[string release];
[task release];
我NSTask文件:
#import <Foundation/NSObject.h>
@class NSString, NSArray, NSDictionary;
@interface NSTask : NSObject
- (id)init;
- (void)setLaunchPath:(NSString *)path;
- (void)setArguments:(NSArray *)arguments;
- (void)setEnvironment:(NSDictionary *)dict;
- (void)setCurrentDirectoryPath:(NSString *)path;
- (void)setStandardInput:(id)input;
- (void)setStandardOutput:(id)output;
- (void)setStandardError:(id)error;
- (NSString *)launchPath;
- (NSArray *)arguments;
- (NSDictionary *)environment;
- (NSString *)currentDirectoryPath;
- (id)standardInput;
- (id)standardOutput;
- (id)standardError;
- (void)launch;
- (void)interrupt;
- (void)terminate;
- (BOOL)suspend;
- (BOOL)resume;
- (int)processIdentifier;
- (BOOL)isRunning;
- (int)terminationStatus;
@end
@interface NSTask (NSTaskConveniences)
+ (NSTask *)launchedTaskWithLaunchPath:(NSString *)path arguments:(NSArray *)arguments;
- (void)waitUntilExit;
@end
FOUNDATION_EXPORT NSString * const NSTaskDidTerminateNotification;
#endif
编辑1:
我用下面的目录解压缩:https://github.com/samsoffes/ssziparchive
这是我的代码来解压缩并执行:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path2 = [[NSBundle mainBundle] pathForResource:@"date" ofType:@"zip"];
[SSZipArchive unzipFileAtPath: path2 toDestination:documentsDirectory];
NSString *path = [NSString stringWithFormat:@"%@/date", documentsDirectory];
NSFileManager* fileManager = [NSFileManager defaultManager];
NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithDictionary:[fileManager attributesOfItemAtPath:path error:nil]];
[attributes setValue:[NSNumber numberWithShort: 0777]
forKey:NSFilePosixPermissions];
NSError* err;
[fileManager setAttributes: attributes ofItemAtPath: path error: &err];
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath: path];
NSPipe *pipe;
pipe = [NSPipe pipe];
[task setStandardOutput: pipe];
NSFileHandle *file;
file = [pipe fileHandleForReading];
[task launch];
NSData *data;
data = [file readDataToEndOfFile];
NSString *string;
string = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
label.numberOfLines=0;
label.text = string;
[string release];
[task release];
这没有回答我的问题。首先,我的设备已经越狱了,这是答案的一半,并且他们明确指出,如果您移植了头文件,那么它应该适用于iOS,尽管它不受Apple支持。我可以使用这个NSTask在其他文件上设备,他们工作正常。它只是我遇到的问题。 – MrHappyAsthma 2012-08-09 19:25:28