🧑‍💻

Finder Sync Extension で Mac 向け便利ツールを作ってみた

2021/10/05に公開

この記事は?

iOSDC Japanで発表された
「Finder Sync Extension で Mac 向け便利ツールを作ろう / iOSDC Japan 2021」
に触発されてMacアプリを作成したものです。

何をやるのか?

みなさんはダウンロードフォルダを整理していますか?
私はブラウザからダウンロードした際についついファイルの管理を怠ってしまい、ダウンロードが汚くなってしまいます。
この問題をFinder Sync Extensionによって解決したいなと思います。

ダウンロードフォルダの整理を怠っている人

実際にやったこと

繰り返しになってしまいますが、元の資料が素晴らしいので、なぞっていくだけでやりたいことはできると思います。ここでは特に躓いた点を記載します

ファイルの移動や削除ができない

コード内でFileManagerによって、ファイルの移動や削除をしているのですが最初は権限不足にできません。(資料に書いてあるのですが見落としてました)
https://twitter.com/entaku_0818/status/1444944888420712459?s=20

結局root直下の権限を渡す形にしてしまいました。
これはきっとAppleの審査は通りません()
https://twitter.com/entaku_0818/status/1445253582282842113?s=20

ファイルの削除のタイミング

Finder Sync ExtensionのbeginObservingDirectoryというユーザーがフォルダにアクセスした際に呼び出されるメソッドを活用し、ファイルの削除処理をしています。

記載の通りなのですが、ユーザーがフォルダにアクセスしなければこのメソッドは呼び出されないため、ユーザー体験を考えるともっといいタイミングがあるかもしれません。

    override func beginObservingDirectory(at url: URL) {
        // The user is now seeing the container's contents.
        // If they see it in more than one view at a time, we're only told once.
        NSLog("beginObservingDirectoryAtURL: %@", url.path as NSString)
        let files:[URL] = contentsOfDirectory(atPath: url.path as String)
        var deletedFiles:[URL] = []
        files.forEach { file in
            NSLog("file: %@", file.path)
            let status:FileStatus = fileStatus(filePass: file)
            switch status{
                case .unavailable:
                    do {
                        try FileManager.default.removeItem(atPath: file.path)
                        deletedFiles.append(file)
                        NSLog("deletefile: %@", file.absoluteString)
                    }catch{
                        NSLog(error.localizedDescription)
                    }
                case .available,.partiallyAvailable: break
            }

        }
        if deletedFiles.count > 0 {
            postUserNotification(subtitle: "ファイル削除のお知らせ", body: "使われていない不要なファイルを削除しました")
        }
    }

振り返り

作業時間は大体6-7時間くらいでした。
一部Finder Sync Extensionの理解やNSLogの見方に戸惑いましたが、iOSアプリを開発された方なら1-2時間程度で慣れると思います。
また、Macアプリなのですぐにビルドして実行できるためサクサク感がありました

積み残し

積み残しを記載しておきます。気が向いたらやります。

  • dmgファイルの作成
  • 移動先にファイルがあった場合に上書きできない

最後に

GitHubで公開したので良かったら参考にしてください!
https://github.com/entaku0818/download-cleaner
みなさんも良いMacアプリ開発ライフを!

Discussion