MacFeeling Blog

マックな感じ …

今更ながら、アップデートの処理に Sparkleを導入

公開 : | 0件のコメント

2019.9.7追記
appcastの作成で一部記述が間違っていたのを修正しました。

今までアプリの更新には独自の処理で対応してきたのですが、今更ながら、Sparkle: open source software update framework for macOSを利用してみることにしました。

環境:macOS Mojave 10.14.6、Xcode 10.3、Sparkle 1.21.3

まずは、公式ドキュメントに沿って導入開始。Documentation - Sparkle: open source software update framework for macOS

Releases · sparkle-project/Sparkle · GitHubより、Latest releaseの1.21.3をダウンロード。解凍した中にある「Sparkle.framework」を XcodeのプロジェクトのFrameworksグループ内にドラッグ&ドロップ。Destination: Copy items if neededにチェックを入れるのを忘れずに

Xcodeの「TARGETS(アプリ名)」» 「Build Phases」 にて「+」ボタンをクリックして 「New Copy Files Phase」 を選択 。DestinationポップアップボタンからFrameworksを選択。「+」ボタンをクリックして、プロジェクトにドラッグ&ドロップした Sparkle,frameworkを選択。

Xcodeの「TARGETS(アプリ名)」» 「Build Settings」 にて、検索フィールドに「Runpath」と入力して、検索結果の「Runpath Search Paths」に「@loader_path/../Frameworks」と入力

メニューの作成

メニューから更新チェックをするには。Xcodeの「MainMenu.xib」を選択して、Libraryの検索フィールドにて「Object」と入力し検索結果から、青色のObjectをドラッグ&ドロップ(画像ではすでにUpdaterと表示されていますが、この段階では名前はまだ Object のままです。)

ドロップした Objectを選択して右のIdentity InspectorのCustom ClassのClassポップアップボタンにて「SUUpdater」を選択。名前が「Object」から「Updater」に変わります。

Main Menuを開いて、メニューに「Check for Updates」や「アップデートを確認」などの文字を追加。追加したメニューから Updaterオブジェクトまでコントロールキーを押したまま接続し、「SUUpdater」の「checkForUpdates」を選択。

設定画面の作成

Adding a Preferences UI - Sparkle: open source software update framework for macOS

メニューの作成と同じように、設定画面を設置するxib(ここでは「Preferences.xib」とします。)を選択して、Libraryの検索フィールドにて「Object」と入力し検索結果から、青色のObjectをドラッグ&ドロップ(画像ではすでにUpdaterと表示されていますが、この段階では名前はまだ Object のままです。)

ドロップした Objectを選択して右のIdentity InspectorのCustom ClassのClassポップアップボタンにて「SUUpdater」を選択。名前が「Object」から「Updater」に変わります。

例えば「自動的にアップデートを確認する」というチェックボックスを設定画面に追加して、Bindings InspectorのBind to ポップアップボタンより「Updater」を選択し、 Model Key Pathに「automaticallyChecksForUpdates」と記入。

さらに更新の間隔を設定できるポップアップボタンを設置した場合は、メニューアイテムのタイトルに「“Hourly”, “Daily”, “Weekly”, “Monthly”」を追加し、それぞれのタグに「3600, 86400, 604800, 2629800」を記入。Updaterオブジェクトまでコントロールキーを押したまま接続し、「SUUpdater」の「updateCheckInterval」を選択すれば良いとのこと。

証明書の作成

ターミナル.appを起動したら、「cd 」(cdの後に半角スペースあり)と入力した後に、ダウンロードした「Sparkle-1.21.3」フォルダをドラッグ&ドロップするとパスが補完されます。問題なければリターンキーを押します。ダウンロードした「Sparkle-1.21.3」フォルダに移動しました。

./bin/generate_keys」と入力したら、リターンキーを押します。「OK! A new key has been generated and saved in the Keychain.」と表示されれば OKです。

キーチェーン.appを開くと、プライベートキーが以下のように保存されています。

もう一度、「./bin/generate_keys」と入力したら、リターンキーを押します。「OK! Read the existing has saved in the Keychain.」と表示され、 SUPublicEDKey to:の後にパブリックキーが表示されます。必ずどこかに保管しておいてください。 

Xcodeのプロジェクトのinfo.plistに「SUPublicEDKey」という項目を追加して、先ほど表示されたパブリックキーをコピーしてください。

appcastの作成

いつも通りにアプリをビルドします。私の場合はこんな感じ「Product」»「Archive」»「Distribute App」»「Developer ID」»「Export」

出来上がったアプリは Zipで圧縮(ドキュメントにFor Sparkle, tarballs and ZIPs are fastest and most reliable. DMG are slowest.と書かれているので DMGはやめたほうが無難なようです。)

Publishing an update - Sparkle: open source software update framework for macOS

ターミナル.appを起動したら、「cd 」(cdの後に半角スペースあり)と入力した後に、ダウンロードした「Sparkle-1.21.3」フォルダをドラッグ&ドロップするとパスが補完されます。問題なければリターンキーを押します。ダウンロードした「Sparkle-1.21.3」フォルダに移動しました。

「./bin/generate_appcast」と入力したら、半角スペースの後に Zipに圧縮したアプリが入っているフォルダをドラッグ&ドロップするとパスが補完されます。問題なければリターンキーを押します。「appcast.xml」というファイルが生成されます。これをお使いのサーバーにアップロードします。

念の為、appcast.xmlファイルをお使いのエディタで開いて、sparkle:version="0,0,0" sparkle:shortVersionString="0,0,0" がビルドしたアプリのバージョンになっているかを確認してください。

なお、macOS 10.11以降では App Transport Security policy によりHTTPS通信が必要になります。

アップロードの場所を Info.plistに記載します。 Xcodeのプロジェクトの Info.plistに「SUFeedURL」という項目を追加し、 URLを記入します。

macOS 10.11以降では App Transport Security policy により、「App Transport Security Settings」を追加、その中に 「Allow Arbitrary Loads」 を設置して YESにする必要があります。

あと、アップデートはInfo.plistのCFBundleVersionと比較するので、フォーマットには注意してください。CFBundleVersion - Information Property List | Apple Developer Documentation

appcast.xmlにリリースノートを追加する

Publishing an update - Sparkle: open source software update framework for macOS

<item>タグの中に以下を記述

<description><![CDATA[
ここに表示するリリースノートを記載
]]>
</description>

</item>

Hardened Runtimeエラーへの対処

アップルのNotary Serviceに対応させるには、XcodeのプロジェクトでTARGETSのCapabilitiesでHardened Runtimeを ONにしなければならないのですが、ビルドしてアップルに Uploadする段階でHardened Runtimeのエラーが出てしまいました。ググったところ、これを解消するには対応している1.22.0rc1を使うか、 1.21.3の場合はAutoUpdate.appをサインし直せば良いとのことで、これを実行することに。Xcode 10 notarization error about Hardened Runtime for Autoupdate.app and fileop · Issue #1297 · sparkle-project/Sparkle · GitHub

XcodeのプロジェクトのTARGETS Build Phasesにて「+」ボタンをクリックして「New Run Script Phase」を選択。以下のコードをスクリプトに設定。

codesign --verbose --force --deep -o runtime \
--sign "${EXPANDED_CODE_SIGN_IDENTITY_NAME}" \
"${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/AutoUpdate.app"

これで問題なくアップロードしてNotary Serviceに対応させることができました。

コメントを残す

必須欄は * がついています



LMB^Box Smileys 3.2 for WordPress

WordPress Smileys

:smile_wp: :biggrin_wp: :sad_wp: :surprised_wp: :eek_wp: :confused_wp: :cool_wp: :lol_wp: :mad_wp: :razz_wp: :redface_wp: :cry_wp: :evil_wp: :twisted_wp: :rolleyes_wp: :wink_wp: :exclaim_wp: :question_wp: :idea_wp: :arrow_wp: :neutral_wp: :mrgreen_wp:

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)