更新1:近づく
IRCの誰かが、私のNSPortNameはFinderではなく、私のアプリケーションであるべきだと述べました。これを変更しましたが、コンテキストメニューを選択すると、アプリにログメッセージが表示されます。
Cannot find service provider for selector shareFile:userData:error: or shareFile:: for service shareFile
私がそのようなオブジェクトを登録していることを考えると、これは奇妙に思えます。
FinderのNSServiceコンテキストメニューを設定して、特定のファイルでアプリをトリガーしようとしています。
ファイルの拡張子は*.acxxで、アクションは単に共有することです。注:バンドルのすべての参照を、この投稿の一般的なものに変更しました:com.mycompany.myproject。
infoPlistのNSServicesセクションは次のようになります:(*。acxxにもドキュメントタイプ/UTIが設定されていることに注意してください)
<key>NSServices</key>
<array>
<dict>
<key>NSRequiredContext</key>
<dict>
<key>NSTextContent</key>
<array>
<string>URL</string>
<string>FilePath</string>
</array>
</dict>
<key>NSSendFileTypes</key>
<array>
<string>com.mycompany.myproject.acxx</string>
</array>
<key>NSPortName</key>
<string>Finder</string>
<key>NSMessage</key>
<string>shareFile</string>
<key>NSMenuItem</key>
<dict>
<key>default</key>
<string>Share with myproject</string>
</dict>
</dict>
</array>
次のメソッドが定義されたオブジェクトセットアップがコードにあります。
- (void)shareFile:(NSPasteboard*)pboard userData:(NSString*) error:(NSString**)err
そして、これをコードの他の場所に登録します。
// Register services
if (self.shareSvcMgr == nil)
{
self.shareSvcMgr = [[ACAShareServiceManager alloc] init];
}
[NSApp setServicesProvider:self.shareSvcMgr];
NSUpdateDynamicServices();
さて、アプリを実行して、それがpbsに登録されていることを確認すると、問題なく表示されます。
/System/Library/CoreServices/pbs -debug en|grep -i myproj
NSBundleIdentifier = "com.mycompany.myproject";
NSBundlePath = "/Users/me/Library/Developer/Xcode/DerivedData/myproject-gihhiqhnzhwqbchflymzyafwxvws/Build/Products/Debug/myproject.app";
default = "Share with myproject";
"com.mycompany.myproject.acxx"
したがって、Finderに移動して* .acxxファイルをクリックすると、[Finder]-> [サービス]で、メニュー項目[myprojectと共有]が表示されます。
問題:
すべてが元気でダンディですよね?うーん、ダメ。[myprojectと共有]をクリックしても何も起こりません。shareFileメソッドにブレークポイントを設定しましたが、プログラムは実行されていますが、何も起こらず、ヒットすることもありません。
-NSDebugServicesを使用してFinderをデバッグできることを読みましたが、それを正しく機能させることができないようです。私は実行しました:
/System/Library/CoreServices/Finder.app/Contents/MacOS/Finder -NSDebugServices com.mycompany.myproject
これはプロセスを開始するようですが、対話しようとするFinderウィンドウが表示されません。
次にどこに行けばいいのかわからない。もちろん、Shareが送信されたときにファイル名またはファイルの内容をアプリケーションに渡すことで、そこから必要な処理を実行できます。
SendFileTypesは、このモデルに対して正しく設定されていませんか?助けていただければ幸いです。ありがとう