4

Mac アプリケーション間で引数を渡すことができるかどうか、可能であればどのように渡すかを考えていました。

Java では、コマンド ラインから次の構文を使用して可能であることを知っています。

Java JavaApp arg1 arg2 arg3 arg4

そして、メインの args[] 配列を介してそれらにアクセスすることが可能です。

public static void main(String[] args) {
        System.out.println("d");
        for (int i = 0; i < args.length; i++)
            System.out.println(args[i]);
}

編集:コマンドラインMac アプリケーションからCocoa Macアプリケーションに引数を渡したい

4

4 に答える 4

3

なぜあなたの Restarter アプリが Cocoa アプリケーションである必要があるのか​​、私にはよくわかりません。ただし、そうであると仮定すると、コマンド ライン引数は NSUserDefaults の引数ドメインで使用できます。 このリンクは、コマンド ラインからプログラムを呼び出す方法と、既定の名前を指定する方法を示しています。

別のプロセスを開始する Cocoa の方法は、NSTaskを使用することです。

于 2012-05-15T15:29:42.677 に答える
1

以下は、引数の型配列を結果のアプリに渡すことがNSWorkspaceできるようにするために私が書いたカテゴリです。argv

@interface NSWorkspace (MDAdditions)
- (BOOL)launchApplicationAtPath:(NSString *)path
                      arguments:(NSArray *)argv
                          error:(NSError **)outError;
@end

@implementation NSWorkspace (MDAdditions)

- (BOOL)launchApplicationAtPath:(NSString *)path
                      arguments:(NSArray *)argv
                          error:(NSError **)outError {
    NSParameterAssert(path != nil);
    BOOL success = YES;
    if (outError) *outError = nil;
    FSRef itemRef;
    OSStatus status = FSPathMakeRef((const UInt8 *)[path UTF8String], &itemRef, NULL);
    if (status != noErr) {
        if (anError) *anError = [NSError errorWithDomain:NSOSStatusErrorDomain
                        code:status userInfo:nil];
        return NO;
    }
    LSApplicationParameters appParameters = {0, kLSLaunchDefaults, &itemRef,
         NULL, NULL, (argv ? (CFArrayRef)argv : NULL), NULL };
    status = LSOpenApplication(&appParameters, NULL);
    if (status != noErr) {
         NSLog(@"LSOpenApplication() returned %d for %@", (int)status, path);
         if (outError) *outError = [NSError errorWithDomain:NSOSStatusErrorDomain
                        code:status userInfo:nil];
         return NO;
    }
    return YES;
}
@end

更新しました:

Objective-Cのコマンドライン引数へのアクセスへの回答で述べたように、 and関数の " _"プレフィックスは通常、それらがプライベートであることを示しており、代替手段が利用可能な場合は避ける必要があります(あります)。_NSGetArgv()_NSGetArgc()

実行可能ファイルに渡される引数を取得するには、次のコードのようにNSProcessInfoのメソッドを使用できます。-arguments

NSArray *argv = [[NSProcessInfo processInfo] arguments];
NSArray *args = [argv subarrayWithRange:NSMakeRange(1, argv.count - 1)];
NSLog(@"args == %@", args);
于 2012-05-15T15:52:47.450 に答える
1

コマンド ラインと GUI アプリケーションの両方が Objective-C で記述されている場合NSDistributedNotificationCenter、プロセス間で通知を送信するために使用できる可能性があります。NSDistributedNotificationCenter のドキュメントは、Notification Programming Guideにあります。

別の方法として、Cocoa GUI アプリケーションは、他のCプログラムと同じようにコマンド ライン パラメータ、つまりサブルーチンのパラメータargvとパラメータを受け入れます。argcmain

于 2012-05-15T15:22:49.837 に答える
0

あなたの答えはすべて私にとって適切に機能しましたが、私のニーズにより適した別の解決策を見つけました。コマンドラインツールからCocoaアプリを起動する必要がありました。これは、次の行で実現しました。

system("nohup /PATH/Arguments.app/Contents/MacOS/Arguments argument1 argument2 &");

nohupは、プロセスをそれ自体にアタッチできるUNIXサービスであるため、ターミナルウィンドウを閉じても、プロセスは存続します。

発生した次の問題は、Cocoaアプリ内から引数をキャプチャすることでした。AppDelegate.m「 ifmain.mが引数を受け取り、intを返す場合、どのように引数を取得しますか? 」

Appleのフレームワークとライブラリの中で、問題を正確に解決するものを見つけました。このライブラリはcrt_externs.hと呼ばれ、2つの有用な変数が含まれています。1つは引数の数を学習するためのもので、もう1つは引数自体を取得するためのものです。

extern char ***_NSGetArgv(void);
extern int *_NSGetArgc(void);

したがって、CocoaアプリのAppDelegate内で、引数をNSStringに解析するための次のコードを記述します。

char **argv = *_NSGetArgv();
NSString *argument1 = [NSString stringWithCString:argv[1] encoding:NSUTF8StringEncoding];
NSString *argument2 = [NSString stringWithCString:argv[2] encoding:NSUTF8StringEncoding];

ご覧のとおり、位置0にはパス自体が含まれているため、引数配列の位置1に直接スキップします。

argv[0] = '/PATH/Arguments.app/Contents/MacOS/Arguments'
argv[1] = 'argument1'
argv[2] = 'argument2'

お手数をおかけしますが、よろしくお願いいたします。皆さんからたくさんのことを学びました。また、この回答が他の誰かに役立つことを願っています:)

乾杯と幸せなコーディング!

于 2012-05-18T08:56:45.090 に答える