アプリ更新フレームワーク:Sparkle
アプリ更新をRSSに埋め込むというAppcastingに対応したCocoaのフレームワークにSparkleというものがあります。これを使っている有名なアプリ群というと、、、CyberduckとかAdiumとかiTermとか日ごろお世話になっているものばかり。MITライセンスですし早速試してみましょう。(大ざっぱにまとめているので詳細はすべて付属のドキュメントを参照してください)
簡単な導入手順
- Xcode プロジェクトに Sparkle.framework を追加
- Interface Builder で Sparkle.framework/Headers/SUUpdater.h を読み込む
- SUUpdater をインスタンス化
- 「更新を確認」のようなメニュ(でもボタンでもなんでもいい)を作って、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にも対応しているそうですが、細かいことは付属のドキュメントを参照してください。