itok's Lab

昔の開発ネタを記録として残してます

アプリ更新フレームワーク:Sparkle

アプリ更新をRSSに埋め込むというAppcastingに対応したCocoaフレームワークSparkleというものがあります。これを使っている有名なアプリ群というと、、、CyberduckとかAdiumとかiTermとか日ごろお世話になっているものばかり。MITライセンスですし早速試してみましょう。(大ざっぱにまとめているので詳細はすべて付属のドキュメントを参照してください)

簡単な導入手順

  1. Xcode プロジェクトに Sparkle.framework を追加
  2. Interface Builder で Sparkle.framework/Headers/SUUpdater.h を読み込む
  3. SUUpdater をインスタンス
  4. 「更新を確認」のようなメニュ(でもボタンでもなんでもいい)を作って、action を SUUpdater の checkForUpdates: につなぐ

Appcasting 対応 RSS の作成

Appcasting は RSS2.0 の enclosure を使用します。まさに Podcast と同じですね。とりあえず、サンプルはこんな感じ。

<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sparkle="http://
www.andymatuschak.org/xml-namespaces/sparkle"> 
    <channel> 
        <title>Some App Changelog</title> 
        <link>http://mysite.org/appcast.xml 
        <description>Most recent changes with links to updates.</description> 
        <language>en</language> 
        <item> 
            <title>Version 2.0 (2 bugs fixed; 3 new features)</title> 
            <description>http://mysite.org/noteson2.0.html 
            <pubDate>Wed, 09 Jan 2006 19:20:11 +0000</pubDate> 
            <enclosure url="http://mysite.org/files/myapp_2.0.zip" length="1600000" type="application/octet-stream"/> 
        </item> 
    </channel> 
</rss>

ファイル名の規則としては AppName_version.zip のようにバージョン表記を付けておくこと。ただこれも、後述の sparkle:version を使うことで自由にできますけれど。

リリースノートは <description> に記述。もちろんCDATAにも対応。URLを記述するとそのURLの指すHTMLページを表示してくれるみたいです。詳細は後述の sparkle:releaseNotesLink 参照。

名前空間に xmlns:sparkle=http:// www.andymatuschak.org/xml-namespaces/sparkle を追記することで Sparkle の独自拡張が行えます。(すべて、enclosure タグ内に属性として埋め込みます)

sparkle:releaseNotesLink 普通のRSSリーダ用記述→ <description>、リリースノート用HTML → sparkle:releaseNotesLink という使い分け用。
sparkle:md5Sum 公開ファイルのMD5
sparkle:version 複雑なバージョン表記の場合(とか、ファイルのURLが規則に従っていない場合)

Info.plist への設定

Sparkle ではその動作設定をメソッド呼び出しですることはなく、Info.plist に記述を追加することで行います。

SUFeedURL AppcastingのURL (必須) http://exsample.com/appcasting.rss
SUShowReleaseNotes リリースノートの表示 true(default) / false
SUScheduledCheckInterval 更新確認の間隔 秒単位
SUAllowsAutomaticUpdates 自動インストール true(default) / false

Preferences への設定保存

一部のユーザが行う設定に関しては当然そのアプリの plist ファイル(user defaults)に保存しておきます。

SUCheckAtStartup 起動時の更新確認 true / false

SUScheduledCheckInterval の指定がある場合、SUCheckAtStartup は上書きされます。

その他いろいろ

  • インストール後のアプリ再起動前になにか処理をする必要がある場合は、SUUpdaterWillRestartNotification (<Sparkle/Sparkle.h>) を受け取るようにコードを書きましょう。
  • バージョンが違うかどうかというのは <pubDate> ではなくバージョン文字列で判断しているみたいです。いちおう、1.0b3とか1.0b3r5とかでもちゃんと比較してくれるので、普通に文字列の昇降が判断できれば大丈夫なんじゃないでしょうか。
  • DSAにも対応しているそうですが、細かいことは付属のドキュメントを参照してください。