概要
- SparkleはオープンソースのmacOSアプリケーション用アップデート・フレームワークです。
- 今回更新用のファイルをGitHubに置くという想定で導入してみようと思います。
参考
- 公式のチュートリアル通りに進めます。
-
今更ながら、アップデートの処理に Sparkleを導入
- 参考になります。ただし当時とクラス名などが変わっているので注意。
- MacApp用アップデート管理システムSparkleの使い方
- バージョン表記諸々の話。
- 最近Swift Package Managerで管理できるようになりました。
オープンソースのmacOSアプリケーション用アップデート・フレームワーク「Sparkle 2.0.0」がリリース。
v1.25.0-rc1から進められていたSwift Package Managerでの管理も可能になっている
GitHub
- 今回記事で作成したものをGitHubに配置しています。
実装
SandBoxの解除
- 今回Sandboxは解除する前提で進めます。
Swift Packager Managerでの導入
- 下記の通り、Swift Package ManagerでSparkleをインポート
StoryBoardで設定画面の作成
更新確認ボタンの作成
-
Object
を追加。
- Objectのクラスを
SPUStandardUpdaterController
に設定。
- ボタンのアクションに
checkForUpdates:
を設定。
- ボタンを押してアクションの紐付けを確認します。
- まだ更新の設定をしていないので当然エラーが表示されますがOKです。
自動更新の有無のチェックボックスの作成
- CotEditorのような
自動的にアップデートを確認
のチェックボックスを実装します。
![image](https://qiita-user-contents.imgix.net/https%3A%2F%2Fi.imgur.com%2FopIL9Gm.jpg?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=c12d7ca4aed62437d488c4cdf437de3f)
- 下記の
Enable automatic checking
を参照し、下図の通り設定。- https://sparkle-project.org/documentation/preferences-ui/
- 他にも例えば更新確認の間隔も設定できたりするので、その際は上記URLを参照。
- チェック状態はライブラリ側で管理してくれているらしく、アプリケーション側で気にする必要はないようです。
Spackle用の秘密鍵・公開鍵の作成
- sparkle-project/Sparkle: Releasesから下記をダウンロード。
- 秘密鍵・公開鍵作成をするためのスクリプトなどが含まれています。
- 解答したフォルダ内の
./bin/generate_keys
を実行。 - 公開鍵がコンソール上に表示されるので控えておきます。
- また同時に秘密鍵がKeyChainに登録されています。
- PCを移行する際は
./bin/generate_keys -x private-key-file
と./bin/generate_keys -f private-key-file
でそれぞれエクスポート・インポートする。
- 公開鍵を
Info.plist
のSUPublicEDKey
のキーとして記載します。
appcast.xmlのURLの紐付け
- 今回、更新情報を記載するファイル
appcast.xml
は下記に配置します。
![image](https://qiita-user-contents.imgix.net/https%3A%2F%2Fi.imgur.com%2FIixUrXM.jpg?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=55557decabcc30f2e67c77e4158c4298)
- URLとしては以下の通り。
https://raw.githubusercontent.com/pommdau/SparkleDemoWithSPM/main/appcast.xml
- このURLを
Info.plist
にSUFeedURL
をキーとして記載します。
更新用アプリケーションのビルドとdmgの作成
- 更新用のアプリケーションとして、適当にバージョンを上げてビルド。
- dmgの作成。
hdiutil create -srcfolder "${source_folder_name}" -format UDZO -fs HFS+ \
-volname "${dmg_folder_name}" "${dmg_folder_name}.dmg"
(e.g.)
ikeh@HIROKInoMacBook-Pro SparkleDemoWithSPM_GitHub % cd /Users/ikeh/Programming/Swift/SparkleDemoWithSPM_GitHub/TempForUpdateProgram
ikeh@HIROKInoMacBook-Pro TempForUpdateProgram % hdiutil create -srcfolder "SparkleDemoWithSPM.app" -format UDZO -fs HFS+ \
-volname "SparkleDemoWithSPM" "SparkleDemoWithSPM_2.0.0.0.dmg"
...............................
created: /Users/ikeh/Programming/Swift/SparkleDemoWithSPM_GitHub/TempForUpdateProgram/SparkleDemoWithSPM_2.0.0.0.dmg
appcast.xmlのコンテンツ作成
- dmgの配置したフォルダを対象に
./bin/generate_appcast
を実行すると、そのフォルダにappcast.xml
が作成される。
./bin/generate_appcast /path/to/your/updates_folder/
(e.g.)
/Users/ikeh/Programming/Swift/SparkleDemoWithSPM/From_GitHub/Sparkle-2.0.0/bin/generate_appcast /Users/ikeh/Programming/Swift/SparkleDemoWithSPM_GitHub/TempForUpdateProgram
Wrote 1 new update and updated 0 existing updates
-
appcast.xml
の中身は例えば以下の通り。
<?xml version="1.0" standalone="yes"?>
<rss xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" version="2.0">
<channel>
<title>SparkleDemoWithSPM</title>
<item>
<title>2.0.0</title>
<pubDate>Fri, 31 Dec 2021 17:02:05 +0900</pubDate>
<sparkle:version>2.0.0.0</sparkle:version>
<sparkle:shortVersionString>2.0.0</sparkle:shortVersionString>
<sparkle:minimumSystemVersion>12.1</sparkle:minimumSystemVersion>
<enclosure url="https://raw.githubusercontent.com/pommdau/SparkleDemoWithSPM/main/SparkleDemoWithSPM_2.0.0.0.dmg" length="1280118" type="application/octet-stream" sparkle:edSignature="WTsROa2mMSWXpnTXaFredBaYgPXPVaYYDXBx98jNnvpVBN9WyAD0feCPH+AXrsUfpnM9Keevy18LPyTQ6Xe6Bg=="/>
</item>
</channel>
</rss>
- 下記に更新対象のdmgが置かれているURLが記載されており、デフォルトでは
appcast.xml
と同じ階層が指定されるみたいです。
<enclosure url="https://raw.githubusercontent.com/pommdau/SparkleDemoWithSPM/main/SparkleDemoWithSPM_2.0.0.0.dmg" length="1280118" type="application/octet-stream" sparkle:edSignature="WTsROa2mMSWXpnTXaFredBaYgPXPVaYYDXBx98jNnvpVBN9WyAD0feCPH+AXrsUfpnM9Keevy18LPyTQ6Xe6Bg=="/>
- 今回はcoteditor.github.io/appcast.xmlを参考に、Releaseにdmgを置いてこれを更新対象としたい。
-
appcast.xml
のURLを上記のものに置き換えます。
-<enclosure url="https://raw.githubusercontent.com/pommdau/SparkleDemoWithSPM/main/SparkleDemoWithSPM_2.0.0.0.dmg" length="1280118" type="application/octet-stream" sparkle:edSignature="WTsROa2mMSWXpnTXaFredBaYgPXPVaYYDXBx98jNnvpVBN9WyAD0feCPH+AXrsUfpnM9Keevy18LPyTQ6Xe6Bg=="/>
+<enclosure url="https://github.com/pommdau/SparkleDemoWithSPM/releases/download/2.0.0/SparkleDemoWithSPM_2.0.0.dmg" length="1280118" type="application/octet-stream" sparkle:edSignature="WTsROa2mMSWXpnTXaFredBaYgPXPVaYYDXBx98jNnvpVBN9WyAD0feCPH+AXrsUfpnM9Keevy18LPyTQ6Xe6Bg=="/>
- 更新した
appcast.xml
をGitHubにPushして準備完了。
動作確認
-
Check for UPdates...
を選択。
![image](https://qiita-user-contents.imgix.net/https%3A%2F%2Fi.imgur.com%2FdUQR5Z6.jpg?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=ded975afec18cd2b4d417eeaea905794)
- アップデートがある旨の通知。
![image](https://qiita-user-contents.imgix.net/https%3A%2F%2Fi.imgur.com%2FYa2oG2N.jpg?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=0f5135781cdd2be9e94ba5021fe8799e)
![image](https://qiita-user-contents.imgix.net/https%3A%2F%2Fi.imgur.com%2Fl1F5MOX.jpg?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=d4ebe65cc2e4d0efb782799d1d044993)
![image](https://qiita-user-contents.imgix.net/https%3A%2F%2Fi.imgur.com%2F9oqPX5h.jpg?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=d680a068c4c473edf265ac40649b91e6)
- ちゃんと更新されていることがわかります!
![image](https://qiita-user-contents.imgix.net/https%3A%2F%2Fi.imgur.com%2FTardtfp.jpg?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=882c76cf47eaa5fb12a8e080deca168b)
改善点
- 公開用リポジトリ名はCotEditorに倣って
sparkle-demo-with-spm.github.io
のようにしたらいいのかなと思います。- github.ioを使ってMySiteを作ろう
- 後々こんな感じで管理もできるのがいいと思います。
- また
appcast.xml
のURLをいちいちGitHubのReleasesに書き換えるのが面倒なので、いい方法を考えたい所です。