iPhone이 해당 응용 프로그램을 샌드 박싱하므로 /bin/
폴더에 액세스 할 수 없습니다. 그래서 SSH 연결을 사용하여 iPhone에서 /bin/date
바이너리 파일을 가져 와서 프로젝트에 포함 시켰습니다. NSLog
을 사용하면 내 파일의 경로가 올바른 것입니다 : /var/mobile/Applications/95078888-DDA8-4C1E-93DC-1F9E0A26E70A/Documents/date
. 내가 만난 문제점은 아래에 나열되어 있습니다. 누구든지이 오류를 해결할 수있는 방법을 알고 있습니까?jailbroken iPhone에서 이진 파일 실행
* 참고 : 시뮬레이터에서 실행하고이 코드를 사용하여 Mac OSX와 호환되는 모든 이진 파일을 실행하면 작동하지만 iPhone 이진 파일로 장치에서 실행하려고하면 문제가 발생합니다.
오류 :
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 파일 :
난에 다음 디렉토리를 사용 : 1
#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
편집
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 *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];
그건 내 질문에 대답하지 못했습니다. 먼저 내 기기에서 jailbroken이 응답의 절반이며, 헤더 파일을 이식하면 Apple에서 지원하지 않더라도 iOS에서 작동해야한다고 명시되어 있습니다. 그리고 난이 장치에 다른 파일에 대한 NSTask을 사용할 수 있고 그들은 잘 작동합니다. 바이너리 만 가지고 문제가 있습니다. – MrHappyAsthma