普段、スクリーンショット拡張アプリの「Mapture」を愛用していた自分が、今回Swiftの勉強を兼ねて、オープンソースとして公開されている「Fuwari」に機能追加をして公開しました。
開発の経緯や今回追加した機能、初めてSwiftを書いた感想などを書いていきたいと思います。
2021年5月追記
本記事公開後、Fuwari本家の開発者である @kentya6 様から連絡をいただき、5月初頭に本家のアップデートが行われました🎉
今回のアップデートは、@sskmy1024rさんが機能追加の記事やコードを書いてくださったことがきっかけになりました。https://t.co/WHfK9PiODG
— けん / Kengo Yokoyama (@kentya6) May 4, 2021
改めてありがとうございました!
AppStoreでも公開されたとの事なので、皆様ぜひご利用下さい
なお以下の本記事は、執筆当時の記録としてそのまま残しておきます。
開発経緯
コードを書いている上で、ドキュメントや参考ページを見ながら作業をすることが多々あると思いますが、そんな時自分は「Mapture」というソフトを使っていました。
機能としては、画面の好きな範囲を選択してスクショを撮影し、その画像を画面上に保持しておくことができます。
このMaptureには「Gyazoに送る」という項目があって、元は撮影したスクショをGyazoに転送して共有できたのですが、ここ数年は使えなくなっていました。
2014年を最後に長らく更新されておらず、おそらくAPIが使えなくなったのでしょう。
もう少し頻繁にメンテナンスされている代替アプリはないかと探していたときに見つけたのが、「Fuwari」でした。
2018年に公開されており、Qiitaで開発記事が上がっているほか、いろんなサイト様で紹介されているイケイケっぷり。
モダンなアイコンが素敵で、早速乗り換えを検討したのですが……
- ワークスペース間で画像を共有できない(ワークスペース切り替えてもついてきてくれない)
- 透明度を変更できない
- クラッシュするバグがある
- メモリ使用率が雪だるま式に増えていく
と、所々不具合や、機能的な物足りなさ(Maptureに慣れていた所為)を感じてしまいました。
更新も途絶えてしまっているようなので、「せっかくMITで公開してくれているんだし、自分で直して公開しよう!」と思い立ったのが、今回の経緯です。
公開したアプリ
Githubリポジトリはこちらです。
元のリポジトリをforkして、再配布形式で公開させていただいています。
追加した機能
今回追加した機能や、バグフィックスの一覧です。
追加機能
- ➕右クリックメニューからGyazoに送信できる機能を追加しました
- ➕画像の拡大縮小をマウスドラッグで変更可能にしました
- ➕マウスウィールでキャプチャの透明度を変更できるようにしました
- ➕OS標準のダークテーマに対応しました
- ➕設定画面からドラッグ移動時の透明度を指定できるようにしました
変更箇所
- ✨Apple Siliconに対応したUniversal Binaryにしました
- ✨キャプチャのデフォルトショートカットをCmd+Shift+mに変更しました
- ✨キャプチャが全てのワークスペースで表示されるように変更しました
バグフィックス
- 🐛キャプチャをESCでキャンセルするとアプリがクラッシュする問題を修正
- 🐛メモリーリークが発生していた問題を修正
機能比較
下はOS標準のスクショ機能も含め、各アプリを比較した表です。
Fuwari(sskmy) | Fuwari(origin) | Mapture | OS標準(Cmd+Shift+4) | |
---|---|---|---|---|
画面上にキープ | ✅ | ✅ | ✅ | ✖️ |
ワークスペース間で共有 | ✅ | ✖️ | ✅ | - |
透明度の変更 | ✅ | ✖️ | ✅ | - |
共有リンクの生成(Gyazo) | ✅ | ✖️ | ✖️ | ▲(icloud) |
ショートカットキーの設定 | ✅ | ✅ | ✖️ | ✖️ |
ゴミファイルが残らない | ✅ | ✅ | ✖️ | ✖️ |
はじめてのSwift
普段はTypescript中心にWebフロントやReactNativeばかり触っていて、Swiftをがっつり触ったのは初めてでした。
なので今回の機能追加は、とても学びになることが多かったです。
特に学びになった(足止め食らった)もの↓
- clone直後、フレームワークが最新のCarthageでビルドできなかった(超初歩)
- storyboardと@IBOutletする方法(超初歩)
- NSImageをbase64に変換して
multipart/form-data
で送信する方法 - Xcode projectで環境変数(.env)を使う最適解
- メモリリークという概念に初めて触れた
ここら辺は時間がある時に別途記事にしたいですね。
Swiftという言語の書き方については、Typescriptに似たような雰囲気があって、比較的スムーズに書くことができました。
Xcodeの補完やFix機能が優秀というのもあるのかもしれません。
今後の開発
Maptureの代替をようやく見つけた(作った)ので、自分自身がヘビーユーザとなり今後もメンテナンスしていくつもりです。
Githubで公開してあるので、不具合や追加機能のご要望等あればお待ちしております!
コメント欄や、Twitter (@sskmy1024r) での感想も承ります。
なお、オリジナルの更新が途絶えてしまっているので今回このような形で公開しておりますが、開発が再開された場合、ソースコードの提供を含めてオリジナル版の発展に貢献する所存です。
最後に
今回の開発を得て、オープンソースプロジェクトの偉大さを改めて感じました。
触れたことのない言語で1からこのアプリを開発をすることは、今の自分には到底無理だと思いました。
素晴らしいアプリを開発していただき、かつオープンソースとして公開してくださっている@kentya6様、本当にありがとうございます🙇♂️
そして世の中のOSSを公開してくださっている皆さん、OSSを使って新しい価値を生み出している皆さん、OSSを使ってくれている皆さん、ありがとうございます!!!