2

iPhone はアプリケーションをサンドボックス化するため、/bin/フォルダーにアクセスできません。そこで、SSH 接続を使用/bin/dateして iPhone からバイナリ ファイルを取得し、プロジェクトに含めました。NSLog私のファイルへのパスは、私がそれを印刷するときに正しいです: /var/mobile/Applications/95078888-DDA8-4C1E-93DC-1F9E0A26E70A/Documents/date. 私が遭遇した問題を以下に示します。このエラーを修正する方法を知っている人はいますか?

*注: シミュレーターで実行し、このコードを使用して mac OSX と互換性のあるバイナリ ファイルを実行すると動作しますが、iPhone バイナリ ファイルを使用してデバイスで実行しようとすると問題が発生します。

エラー:

2012-08-09 14:23:13.757 TestBinary[7891:707] キャッチされていない例外'NSInternalInconsistencyException'によるアプリの終了、理由: 'フォークできませんでした: 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)

例外をスローして呼び出された終了

プログラム受信信号:「SIGABRT」。データ フォーマッターは一時的に利用できません。「続行」後に再試行します。(dlopen 関数が見つからないため、共有ライブラリをロードできません。)

mi_cmd_stack_list_frames: スタックに十分なフレームがありません。

mi_cmd_stack_list_frames: スタックに十分なフレームがありません。

日付ファイルを呼び出すコード:

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]; 
4

1 に答える 1

1

なぜこれが起こっているのか正確にはわかりませんが、Xcode のビルド時にdateバイナリ ファイルが何らかの形で破損しています。元のdateファイル (プロジェクト フォルダーの下) を見て、Xcodeビルドディレクトリの下に同じファイルを見つけた場合 (例):

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

2 つのファイルに対してコマンドを実行するdiffと、これらのバイナリ ファイルが異なることがわかります。この問題を引き起こすには、これで十分です。

なんらかの理由で、Xcode はそのタイプのリソースを見て、それに何かをしています。pngcrushたとえば、アプリの png リソースで何らかのユーティリティを使用しようとすることを知っています。多分これは似ています。

とにかく、これを修正する方法の 1 つはdate、Mac でファイルを圧縮することです。次に、date.zipバンドル リソースとしてプロジェクトに含めます。クリーンアップしてビルドします。Xcode は zip ファイルを破損しません。

ここで、アプリが起動したらdate.zip、バンドル リソースからファイルを解凍し、解凍したバージョンをDocuments、またはCaches、または必要な場所に保存する必要があります。実行権限も忘れずに設定する必要があるかもしれません。

プログラムによるファイルの解凍については、こちらを参照してください

アップデート:

その後、実行権限を持つようにファイルを設定する必要がある場合があります。このようなもの:

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];
于 2012-08-11T09:31:15.770 に答える