2

Finder サービスを追加しようとしていますが、サービスが機能するまでは問題ないようです。

これは私の AppDelegate.m のメソッドです:

-(void)uploadFromPasteboard:(NSPasteboard *)pboard userData:(NSString *)udata error:(NSString **)err
{
    NSString *filename = [pboard stringForType:NSURLPboardType];
    dbg(@"file: %@", filename);
}

plist 構成:

<key>NSServices</key>
<array>
    <dict>
        <key>NSRequiredContext</key>
        <dict/>
        <key>NSMenuItem</key>
        <dict>
            <key>default</key>
            <string>Upload File</string>
        </dict>
        <key>NSMessage</key>
        <string>uploadFromPasteboard</string>
        <key>NSPortName</key>
        <string>Finder</string>
        <key>NSSendTypes</key>
        <array>
            <string>NSURLPboardType</string>
        </array>
        <key>NSReturnTypes</key>
        <array/>
    </dict>
</array>

サービスはサービスメニューに表示されますが、クリックしても何も起こらず、ログも何も呼び出されません。

誰かが私に何が間違っているのか指摘してもらえますか?私は髪をほとんど引っ張り始めています:(

4

1 に答える 1

2

サービスプロバイダーインスタンスを設定していますか?このように(から:サービスの提供):

EncryptoClass* encryptor = [[EncryptoClass alloc] init];
[NSApp setServicesProvider:encryptor];

アプリのデリゲートクラスにこのメソッドを含めるだけでは不十分です。標準のアプリケーション設定では、アプリデリゲートにこれを含めるだけで十分な場合があります。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    [NSApp setServicesProvider: self];
}

また、に「Finder」を指定していますNSPortName。これはおそらく正しくありません。サービスプロパティから(強調鉱山):

NSPortNameは、アプリケーションがサービス要求をリッスンする必要があるポートの名前です。その値は、サービスプロバイダーアプリケーションがどのように登録されているかによって異なります。ほとんどの場合、これはアプリケーション名です。このプロパティは、サービスとして使用されているAutomatorワークフローでは無視されます。

私がドキュメントを読んだところ、NSPortNameに名前が含まれているアプリケーションは、サービス要求を処理するために使用されるアプリケーションであるということです。アプリの名前が「Finder」でない場合(明らかな理由でそうすべきではありません)、アプリがサービスによって呼び出されることはありません。

于 2013-02-06T13:08:03.470 に答える