Mac appへのSparkle導入ノート
Sparkleとは、macOS appに自動アップデート機能を実装するための3rdパーティ製フレームワークです。App Store外で配信されているmacOS appでは多く使われている事例があり、実質的にディファクトスタンダードな製品となっています。

導入
Swift Package Managerで導入可能。
署名
SparkleとしてはEdDSA (ed25519) で署名することを強く推奨している。
GitHubからSparkleのソースコードパッケージを取得してきて、解凍した中にあるbinフォルダに必要なコマンドラインツールが収納されている。
generate_keys
generate_keys
generate_keys はSparkleのための秘密鍵と公開鍵を発行するコマンドラインツールで、実行するだけで両鍵のペアが自動生成される。秘密鍵はMacのKeychain Accessに保存される。
macOSのセキュリティ対応
このまま実行してもおそらくmacOSのセキュリティ機構でブロックされるはずので、その対応を行う必要がある。
Sparkleプロジェクトを信頼する前提で、以降の操作を行う。
まずエラーが起きる前提で一旦まずgenerate_keysを実行して、意図的にエラーを起こす。この状態でシステム設定の「プライバシーとセキュリティ」を開くと、ビューの中ほどにgenerate_keysをこのまま起動しても良いかを確認するボタンが出現するので、これを手動でクリックする。
その後ダイアログ的なものが出ると思われるので、確認して継続する。
その後再度generate_keysを実行すると、問題なく実行できる。
これら一連の操作は初回一度きりのはずなので、少々面倒だがMacを守るための仕組みが働いてくれていると思いながら、最初だけやるようにする。
複数の鍵のペアを扱う
デフォルトだと鍵のペアはアカウント名 ed25519 で作成され、重複して作ることはできない。
同一アカウント名で鍵の再発行を行うには、Keychain Accessで当該フィールドを削除してから再度generate_keysを実行する。
複数の鍵のペアを扱うには、generate_keysのオプション--accountで任意のアカウント名を指定する必要がある。これはデフォルトではed25519になるので、違う名前を指定する。
generate_keys --account com.hoge.fuga.projectname
generate_keysには秘密鍵の書き出しと読み込みのオプションも用意されているので、これらを使う際にも --account を都度指定する。
-
-x FILEPATHで鍵の書き出し -
-f FILEPATHで鍵ファイルの読み込み -
--account NAMEで任意のアカウント名を指定(省略でed25519) -
-pで現在の公開鍵を表示 -
-hでヘルプを表示
# 鍵の書き出し
generate_keys --account com.hoge.fuga.projectname -x /path/to/exported_private_key
# 鍵の読み込み
generate_keys --account com.hoge.fuga.projectname -f /path/to/exported_private_key
(アカウント名はなんとなくUTIにしてみたが、なんでも良いと思う。)
組み込み
Info.plistに公開鍵を書き込む
SUPublicEDKey をフィールド名し、string形式で公開鍵を記入する。
generate_keysで鍵を発行するとplistの断片が出力されるので、テキストエディタでコピペしても良い。
Info.plistにappcast.xmlへのURLを書き込む
SUFeedURL をフィールド名にし、string形式でURLを書き込む。
appcast.xmlファイルをホスティングする予定の固定URLにする。
appcast.xmlを作成・更新
Sparkle付属のコマンドラインツールgenerate_appcastを使う。
Xcodeで.appのアーカイブを出力し、Disk Imageなどでパッケージングする。dmgファイルを置いたディレクトリを指定してgenerate_appcastを実行する。
generate_appcast archiveDir
Disk Imageを作成
Disk Imageの作成はhdiutilなどいくつか方法があるが、シンプルなインストーラとして装飾したいならレイアウト機能がついた create-dmg などがおすすめ。
create-dmgを使うと、よく見かけるこういうウインドウの見た目をしたものを簡単に作れる。背景の矢印は画像として用意する必要がある。

これをもう少し使いやすくした自作のスクリプトを紹介しておく。