2012-08-09 5 views
2

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]; 
+0

그건 내 질문에 대답하지 못했습니다. 먼저 내 기기에서 jailbroken이 응답의 절반이며, 헤더 파일을 이식하면 Apple에서 지원하지 않더라도 iOS에서 작동해야한다고 명시되어 있습니다. 그리고 난이 장치에 다른 파일에 대한 NSTask을 사용할 수 있고 그들은 잘 작동합니다. 바이너리 만 가지고 문제가 있습니다. – MrHappyAsthma

답변

1

하지만, 엑스 코드 빌드 할 때, 그것은 어떻게 든 date 이진 파일을 손상된다

이은 압축을 풀고 실행하는 내 코드입니다. 당신이 (당신의 프로젝트 폴더 아래) 원래 date 파일을 보면, 다음 (예)를 Xcode의 빌드 디렉토리에 같은 파일을 찾을 수 :

/Users/myusername/Library/Developer/Xcode/DerivedData/HelloJB-gsokzlpnejddadbccgrfkxnumkyl/Build/Products/Release-iphoneos/HelloJB.app 

당신이 두 개의 파일에 diff 명령을 실행할 수 있습니다, 바이너리 파일이 다르다는 것을 알려줄 것입니다. 이것이이 문제를 일으키기에 충분할 것입니다.

Xcode는 어떤 이유로이 리소스 유형을보고 뭔가를하고 있습니다. 예를 들어, 앱의 png 리소스에 어떤 종류의 pngcrush 유틸리티를 사용하려고합니다. 아마도 이것은 비슷할 것입니다.

어쨌든,이 문제를 해결할 수있는 한 가지 방법은 Mac에서 date 파일을 압축하는 것입니다. 그런 다음 date.zip을 프로젝트에 번들 리소스로 포함하십시오. 깨끗하고 빌드하십시오. Xcode는 zip 파일을 손상시키지 않습니다. 앱이 시작될 때

지금, 그것은 문서, 또는 캐시 년 번들 자원에서 date.zip 파일을 압축 해제하고 압축을 푼 버전을 저장해야합니다, 또는 당신이 그것을 원하는 목적지까지. 실행 권한도 설정해야합니다.

See this for programmatically unzipping files

업데이트 : 그 후

, 당신은 실행 권한이 있어야 할 파일을 설정해야 할 수도 있습니다.이 같은 것 :

NSFileManager* fileManager = [NSFileManager defaultManager]; 
NSMutableDictionary* attributes = [[NSMutableDictionary alloc] init]; 
NSNumber* permission = [NSNumber numberWithLong: 0755]; 
[attributes setObject:permission forKey: NSFilePosixPermissions]; 
NSError* err; 
[fileManager setAttributes: attributes ofItemAtPath: filePath error: &err]; 
+0

나는 그 링크에서 우편 기능을 사용하고 잘 unzips하지만 그 파일은 압축을 풉니 다 때 실행되지 않습니다 생각합니다. 앱 내에서 파일 권한을 변경하려면 어떻게해야합니까? (난 그냥 문서 디렉토리에 압축을 풉니 다). – MrHappyAsthma

+0

@MrHappyAsthma, 위의 업데이트를 참조하십시오. – Nate

+0

그 권한을 잘 변경하지 않습니다. 이로 인해 터미널 "ls -al"에 따라 파일이 실행될 수 있지만 다음과 같은 오류가 발생합니다. "캐치되지 않은 예외로 인해 응용 프로그램 종료 'NSInternalInconsistencyException', 이유 : 'could not fork : errno 1'". * 참고 : 기기에 있습니다. – MrHappyAsthma