2

私は本当にここで簡単なタスクで立ち往生していますが、それでもそれを機能させることはできません。

この記事で説明されているように、HelperAppを使用して「LaunchAtLogin」機能を実装することができました。しかし、私のアプリケーションは、 launch-by-helper-appアクションとlaunch-by-userアクションで異なる反応をするはずです。したがって、私のタスクは、MainAppがHelperAppによって起動されたことを示す何らかのフラグを設定することです。

同様の質問がたくさんあることは知っていますが、それでも解決策はどれも私にはうまくいきません。Sandboxは、MainAppに送信しようとしているすべてのパラメーターをカットしているようです。

ここで私が試したこと:

- [NSWorkspace - launchApplicationAtURL: options: configuration: error:]
 - [NSWorkspace - openURLs: withAppBundleIdentifier: options: additionalEventParamDescriptor: launchIdentifiers:]
 - LSOpenApplication()

最近まで、ユーザーが手動でアプリケーションを起動したときにFinderから送信される-psn引数を信頼できると思っていました。ただし、この引数は、MainAppがHelperAppによって起動された場合でも10.8に送信されます。

上記の記事[NSWorkspace - launchApplicationAtURL: options: configuration: error:]では、著者はを使用することを提案しています。パラメータは送信されますが、MainAppには何も到着しません。

誰かがこの(または同様の)タスクを達成することに成功しましたか?

助けが必要!前もって感謝します!

4

2 に答える 2

4

地獄の検索と実験の後、私は自分の質問に答える準備ができているので、他の人は時間と労力を節約できます。

私の結論は、今のところ、HelperAppがサンドボックスの下でいくつかの引数を使用してMainAppを起動する方法はないということです。少なくとも私はそれをする方法を見つけていません。

次のようにMainAppを起動します。

[[NSWorkspace sharedWorkspace] launchApplication:newPath];

MainAppで、以下を追加します。

Application_IsLaunchedByHelperApp = YES;

ProcessSerialNumber currPSN;
OSStatus err = GetCurrentProcess(&currPSN);
if (!err)
{
    // Get information about our process
    NSDictionary * currDict = [(NSDictionary *)ProcessInformationCopyDictionary(&currPSN,
                                                                                kProcessDictionaryIncludeAllInformationMask) autorelease];

    // Get the PSN of the app that launched us. Its not really the parent app, in the unix sense.
    long long temp = [[currDict objectForKey:@"ParentPSN"] longLongValue];

    long long hi = (temp >> 32) & 0x00000000FFFFFFFFLL;
    long long lo = (temp >> 0) & 0x00000000FFFFFFFFLL;
    ProcessSerialNumber parentPSN = {(UInt32)hi, (UInt32)lo};

    // Get info on the launching process
    NSDictionary * parentDict = [(NSDictionary*)ProcessInformationCopyDictionary(&parentPSN,
                                                                                 kProcessDictionaryIncludeAllInformationMask) autorelease];

    // analyze
    // parent app info is not null ?
    if (parentDict && parentDict.count > 0)
    {
        NSString * launchedByAppBundleId = [parentDict objectForKey:@"CFBundleIdentifier"];
        if (![launchedByAppBundleId isEqualToString:HELPER_APP_BUNDLE_ID])
        {
            Application_IsLaunchedByHelperApp = NO;
        }
    }
}

それでおしまい。Application_IsLaunchedByHelperApp正しい値になりました。

解決策は私のものではありません。私はそれをウェブ上で見つけました(cocoabuilder、私は推測します)。みんな頑張ってね!そして、私の質問にご注目いただきありがとうございます。

UPDATE ログインアプリのショーで起動した場合があるようですlaunchedByAppBundleId = @"com.apple.loginwindow"。したがって、コードの最後の部分は次のようになります。

    //
    // analyze
    //

    // parent app info is not null ?
    if (parentDict && parentDict.count > 0)
    {
        NSString * launchedByAppBundleId = [parentDict objectForKey:@"CFBundleIdentifier"];
        if (![launchedByAppBundleId isEqualToString:HELPER_APP_BUNDLE_ID] &&
            ![launchedByAppBundleId isEqualToString:@"com.apple.loginwindow"])
        {
            Application_IsLaunchedByHelperApp = NO;
        }
    }
于 2013-03-25T10:43:19.810 に答える
1

答えを探す場所はAppleDeveloperForumsです。そこにいる人々はヘルパーアプリとサンドボックスに関するあらゆる種類の問題に取り組んできました。たとえば、1〜2年前にさかのぼってアプリケーショングループとカスタムURLスキームを検索すると、ニーズを満たすソリューションが見つかる可能性があります。それでも問題が解決しない場合は、それらのフォーラムに質問を投稿してください。おそらく誰かがあなたが何を必要としているかを知っているでしょう。

Apple Developerでない場合、これらのフォーラムにアクセスできない場合、またはMac App Store経由で配布する予定がない場合は、サンドボックスをオフにしてください。現在の状態では、これは使用するテクノロジーではありません... HTH。

于 2013-03-24T21:56:06.597 に答える