Non Document-basedアプリケーションで、Dockアイコンにファイルをドラッグ&ドロップできるように実装しようとしたら、意外と情報が見つからず苦労したのでまとめておく。
Info.plistでDocument Typeを指定する
Info.plistのCFBundleDocumentTypesに、Document Typeを登録すると、そのDocument Typeに合致するファイルをDockのアプリアイコン上にドラッグ&ドロップできるようになる。
<key>CFBundleDocumentTypes</key> <array> <dict> <key>CFBundleTypeName</key> <string>ImageFile</string> <key>CFBundleTypeExtensions</key> <array> <string>png</string> <string>jpg</string> <string>jpeg</string> <string>gif</string> <string>tiff</string> </array> </dict> </array>
CFBundleTypeExtensionsの中に、対応させたい拡張子のリストを登録する。CFBundleTypeNameには、複数のDocument Typeを登録した場合に識別するための名前を入力しておく。(Xcode上の設定画面以外で、どこかで表示されるのかは不明…)
Infoタブ上で設定することもできる。Extensionsはカンマ区切りで入力すると、自動的にarrayで保存してくれる。
AppDelegateで処理する
ファイルがドロップされると、AppDelegateのapplication:openFiles:が呼ばれる。これを実装しないと実行時にエラーが発生する。
func application(_ sender: NSApplication, openFiles filenames: [String]) { debugPrint(filenames) }
ドロップされたファイルの一覧を取得できるので、そこで適宜処理してあげればOK。