青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 319, comments - 22, trackbacks - 0, articles - 11
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

為你的Cocoa應用程序加入更新支持:Sparkle 簡介

發布于:2010-09-20 13:06閱讀數:3141

作為一名桌面軟件開發者,應該提早考慮程序的更新問題。如何將程序更新及時優雅的推送給用戶,是維持用戶忠誠度和提高軟件使用體驗的一個重要方面。而作為Cocoa應用程序開發者,

轉自 ibuick.com,原文  http://ibuick.com/index.php/archives/add-automatic-update-support-over-cocoa-app-via-sparkle-framework


作為一名桌面軟件開發者,應該提早考慮程序的更新問題。如何將程序更新及時優雅的推送給用戶,是維持用戶忠誠度和提高軟件使用體驗的一個重要方面。而作為Cocoa應用程序開發者,我們可以選擇自己手動來實現此功能,也可以選擇一些優秀的開源框架。Sparkle就是其中之一。

Sparkle是一個非常簡單且易用的Cocoa應用程序更新框架。本篇文章將使用一個簡單的例子,教你如何使用Sparkle為你的Cocoa應用程序加入更新支持。

1: 新建一個Cocoa Application,TestSparkle

wpid-wpid-xcodecocoaapplication-2010-09-10-16-11-2010-09-10-16-11.png

 

wpid-wpid-cocoaapplicationwithsparkle-2010-09-10-16-11-2010-09-10-16-11.png
2: 去到Sparkle下載Sparkle Framework,最新版本為 1.5b6,

wpid-wpid-sparkle-2010-09-10-16-11-2010-09-10-16-11.png
Sparkle Test App.app 是一個用來演示Sparkle更新框架的一個應用程序。

Extras文件夾下提供了Sparkle的標準圖標,Release Notes模版,軟件簽名工具,源代碼和Appcast.xml示例文件,我們后面會再講到這些工具和文件。

With Garbage Collection, 是一個加入了Garbage Collection支持的Sparkle分發版,如果你的應用程序運行在有GC的環境下,則可以使用這個版本的Sparkle

Sparkle.framework 是通用分發版,筆者建議大家使用此版本的Sparkle

3: 鏈接Sparkle框架到TestSparkle工程

拖拽Sparkle.framework(或 with Garbage Collection下的 Sparkle.framework)到TestSparkle的Linked Frameworks下,在彈出窗口中記得選中”Copy items into destination group’s folder (if needed)”前面的復選框。

wpid-wpid-addsparkletotestsparkle-2010-09-10-16-11-2010-09-10-16-11.png

4: 為你的工程新建一個Copy Files Build Phase,

wpid-wpid-addcopyfilesbuildphase-2010-09-10-16-11-2010-09-10-16-11.png
5: 右鍵點擊這個新建的Copy Files Build Phase,并在彈出窗口中,點擊Destination下拉框,選擇Frameworks

wpid-wpid-copyfilesbuildphaseforframework-2010-09-10-16-11-2010-09-10-16-11.png
6: 將Linked Framworks下的Sparkle.framework拖拽到這個新建的Copy Files Build Phase 中

wpid-wpid-addsparkle-2010-09-10-16-11-2010-09-10-16-11.png
7: 在Interface Builder中打開TestSparkle的MainMenu.xib(nib), 然后點擊Interface Builder–>Files–>Read Class Files

wpid-wpid-readclassfiles-2010-09-10-16-11-2010-09-10-16-11.png

8: 將Sparkle.framework中的所有頭文件選中并讀取

wpid-wpid-readheaderfiles-2010-09-10-16-11-2010-09-10-16-11.png
9: 從Library中拖拽一個 NSObject到MainMenu主窗口.

wpid-wpid-addobject-2010-09-10-16-11-2010-09-10-16-11.png

10: 點擊此Object對象,點擊Inspector,設定此Object的Class為 SUUpdater

wpid-wpid-SUUpdater-2010-09-10-16-11-2010-09-10-16-11.png

11: 添加一個菜單項到到TestSparkle Menu,重命名為 Check For Updates…

wpid-wpid-Checkupdatesmenuitem-2010-09-10-16-11-2010-09-10-16-11.png

12: 將 Check for Updates…菜單項的Send Actions指向Updater Object的checkForUpdates方法

wpid-wpid-addactionforupdate-2010-09-10-16-11-2010-09-10-16-11.png
13: 保存Interface Builder的所有更改,退出Interface Builder。

14: 為了安全防止應用程序更新遭到惡意篡改,我推薦對應用程序更新添加數字簽名。

Sparkle使用DAS SHA-1 來對程序更新包進行數字簽名。

打開終端,進入步驟2中存放已下載的Sparkle包的文件夾,進入Extras–>Signing Tools,

執行,

ruby generate_keys.rb

這個命令將會生成兩個文件 dsa_priv.pem 和 dsa_pub.pem,也就是私鑰和公鑰,請妥善保存這兩個文件,如果私鑰丟失,你得用戶將再也無法自動通過已安裝的程序來獲得更新的更新。

15: 建立一個 App Cast Feed文件

Sparkle的運作機理其實非常簡潔,本地應用程序Info.plist中含有一個URL,此URL指向一個在你網站上的App Cast Feed XML文件。當你發布更新的時候,上傳新的app到你的網站,更新此app cast xml feed。這樣,客戶端程序在運行檢查更新時,會根據Info Plist中的URL找到并Parse此文件,跟本地軟件版本進行比對。如果發現更新,則提示用戶。這就是App Cast XML Feed文件的作用。

在步驟14中提到的Extras文件夾下,有一個App Cast XML Feed文件的模版:

 

http://you.com/app/2.0.html

Wed, 09 Jan 2006 19:20:11 +0000

http://you.com/app/1.5.html

Wed, 01 Jan 2006 12:20:11 +0000
<!-- Now here's an example of a version with a weird internal version number (like an SVN revision) but a human-readable external one. -->
http://you.com/app/1.4.html

Wed, 25 Dec 2005 12:20:11 +0000

我們可以看出,這其實是一個標準的RSS Feed格式的XML文件。我們只要修改相應的項目即可。

下面我們就來一步步的演示如何使用Sparkle為你的程序加入更新支持。

16: 我們首先在本地搭建一個可用于測試軟件更新的網站。打開Mac OS X系統偏好設置(System Preferences), 找到共享(Sharing),開啟Web共享(Web Sharing),并通過點擊圖中所示URL測試Web共享是否成功開啟。http://10.0.1.2/~buick 你的顯示可能與此不同,,,,

wpid-wpid-websharing-2010-09-10-16-11-2010-09-10-16-11.png
17: 打開你的XCode中 TestSparkle 工程,編輯 TestSparkle-Info.plist,加入兩個屬性,SUPublicDSAKeyFile 和 SUFeedURL

wpid-wpid-info.plist-2010-09-10-16-11-2010-09-10-16-11.png

其中,SUFeedURL 將是指向一個 App Cast XML Fee 的 URL,比如我的測試地址是 http://10.0.1.2/~buick/testsparkleappcast.xml ,SUPublicDSAKeyFile 指向公鑰,我們把剛才步驟14中生成的 dsa_pub.pem 加入到工程的Resources中,并在 TestSparkle-Info.plist 中指定此公鑰的名稱,,,,那么現在的TestSparkle-Info.plist應該是這樣

整個配置完成,我們現在來構建一個TestSparkle.app的1.0版本,點擊Build and Run

wpid-wpid-TestSparkle-2010-09-10-16-11-2010-09-10-16-11.png
啟動TestSparkle.app, 在TestSparkle菜單下,確認Check for Updates…按鈕處于可用狀態,如果是灰色不可點擊,則返回Interface Builder修改。

wpid-wpid-checkforupdates-2010-09-10-16-11-2010-09-10-16-11.png

將此 TestSparkle.app 1.0 版本拷貝到別處備用。然后返回XCode,將應用程序版本改為1.1,然后構建工程。將TestSparkle.app 的1.1版本打包成zip文件,改名為TestSparkle_1.1.zip

將 dsa_priv.pem (私鑰) 和 TestSparkle_1.1.zip 拷貝到 Extras下的Signing Tool文件夾中,

wpid-wpid-signing-2010-09-10-16-11-2010-09-10-16-11.png

打開終端進入到此文件夾,執行:

ruby sign_update.rb TestSparkle_1.1.zip dsa_priv.pem

wpid-wpid-sign-2010-09-10-16-11-2010-09-10-16-11.png
便可得到升級包的簽名,MCwCFDZsrVGB+PewvxioJcvptkqchXi3AhQOZDJ4UukRM2/bYmZzzbHTxM2kpA==

用文本編輯器創建一個xml文件(UTF-8 編碼),內容如下:

http://10.0.1.2/~buick          The latest TestSparkle updates from localhost, more hot features and sweeties
en

Fri, 10 Sept 2010 0:00:00 +0300             http://10.0.1.2/~buick

注意(由于本網站HTML的設置問題,如果你直接拷貝以上XML Feed文件到你本地測試可能會出編碼問題導致XML Parse失敗,請到本文最后下載此文件,以及工程壓縮包)。

把此XML另存為 testsparkleappcast.xml

熟悉RSS Feed的讀者可能很容易理解此文件,,如果我們在瀏覽器中直接訪問此URL,我們會看到

wpid-wpid-feed-2010-09-10-16-11-2010-09-10-16-11.png

而我們要關注的只是這兩段:

這段指定的URL是一個介紹頁面,如果你希望在更新提示窗口中出現一個介紹新版本的頁面(或者說release notes),則使用此URL定向到你網站上的新版本介紹頁面。

Sparkle非常貼心的為大家提供了一個模版,在Extras/Release Notes Templates 文件夾下可找到

enclosure sparkle:version=“1.1” sparkle:dsaSignature=“MCwCFDZsrVGB+PewvxioJcvptkqchXi3AhQOZDJ4UukRM2/bYmZzzbHTxM2kpA==“ url=“http://10.0.1.2/~buick/TestSparkle_1.1.zip” length=“436264” type=“application/octet-stream”/>

這段是實現Sparkle Update的關鍵,

sparkle:version=“1.1” 是指當前更新包版本號,客戶端程序就是根據這個版本號來和本地APP進行比對,如果發現不同則提示更新。

sparkle:dsaSignature=“MCwCFDZsrVGB+PewvxioJcvptkqchXi3AhQOZDJ4UukRM2/bYmZzzbHTxM2kpA==“ 這個就是我們剛才為更新包生成的數字簽名

url=“http://10.0.1.2/~buick/TestSparkle_1.1.zip” 指向更新包下載地址

length=“436264” 指更新包的大小,上傳上去前用 終端 ls -al 命令可查看

type=“application/octet-stream” 是一個想對固定的值,一般不用修改。

現在把testsparkleappcast.xml 和 TestSparkle_1.1.zip 拷貝到

你的用戶主目錄/Sites 下 (~/Sites,具體路徑依你個人配置而定)

wpid-wpid-path-2010-09-10-16-11-2010-09-10-16-11.png
然后在瀏覽器敲入 http://10.0.1.2/~buick/testsparkleappcast.xml

如果能夠看到類似網頁,,,說明一切正常。

下面找到我們剛才保存的TestSparkle.app 1.0版本,運行并點擊 Check for Updates… 如果一切正常,你可以看到

wpid-update1-2010-09-10-16-11.png

點擊Install Update,如果更新成功,即可顯示:

wpid-complee-2010-09-10-16-11.png

然后再次點擊Check for Updates, 你會看到

wpid-latest-2010-09-10-16-11.png

最后希望你與Sparkle合作愉快。

點擊此處下載本次工程源代碼和示例XML Feed文件,另外,安裝包里面還帶有一個Sparkle的簡體中文包,將它放入你的Sparkle.framework/Resources下即可。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美成年人在线观看| 中文日韩在线| 在线国产精品一区| 国产精品一区二区在线观看不卡| 欧美电影在线免费观看网站| 欧美激情视频一区二区三区不卡| 久久久亚洲国产美女国产盗摄| 国产精品私人影院| 亚洲人被黑人高潮完整版| 一区二区三区日韩欧美| 99精品视频免费观看视频| 亚洲深夜av| 亚洲欧美在线观看| 久久久久国产精品一区三寸| 卡一卡二国产精品| 免费亚洲网站| 亚洲全黄一级网站| 影音先锋亚洲精品| 亚洲国产精品一区二区www在线| 亚洲日本中文字幕| 亚洲免费在线视频| 久久免费偷拍视频| 亚洲精品久久| 黄色成人在线观看| 模特精品裸拍一区| 日韩视频一区| 欧美在线综合视频| 欧美精品九九| 国产一区二区三区高清| 亚洲精品久久久久| 欧美一区二区视频免费观看| 欧美成人嫩草网站| 亚洲一区二区三区成人在线视频精品| 久久精品国产亚洲a| 欧美日韩午夜| 韩国av一区二区三区四区| 亚洲美女啪啪| 久久艳片www.17c.com| 一区二区激情视频| 美日韩精品视频| 鲁大师影院一区二区三区| 国产美女在线精品免费观看| 亚洲国产日韩欧美在线动漫| 性伦欧美刺激片在线观看| 欧美韩日高清| 久久精品av麻豆的观看方式 | 久久亚洲影院| 亚洲欧美日韩国产一区二区三区| 欧美激情亚洲自拍| 激情五月综合色婷婷一区二区| 午夜视频在线观看一区二区| 亚洲国产美女| 久久久99国产精品免费| 国产精品成人免费视频| 99在线热播精品免费| 欧美成人精品三级在线观看| 欧美亚洲网站| 国产精品亚洲产品| 亚洲欧美日韩国产综合精品二区| 亚洲福利视频网| 久久精品免费播放| 国产一区二区精品久久| 亚洲一区二区综合| 亚洲精品久久久一区二区三区| 在线电影欧美日韩一区二区私密| 亚洲欧美日韩中文视频| 一区二区精品国产| 欧美日韩视频在线一区二区 | 亚洲精品欧美在线| 欧美高清成人| 亚洲国产婷婷香蕉久久久久久99| 久久久人人人| 久久久久国内| 亚洲国产成人在线播放| 欧美高清在线观看| 免费观看成人网| 亚洲美女少妇无套啪啪呻吟| 亚洲精品激情| 国产精品久久久久久久7电影| 一区二区三区视频在线播放| 一区二区三区欧美激情| 国产日本欧美视频| 久久久久久久久综合| 久热爱精品视频线路一| 最近中文字幕日韩精品| 日韩午夜激情| 国产亚洲福利| 欧美成人免费全部| 欧美午夜在线视频| 久久手机精品视频| 欧美丰满高潮xxxx喷水动漫| 这里只有精品视频| 午夜精品久久| 亚洲欧洲综合另类| 亚洲天堂av高清| 怡红院精品视频在线观看极品| 亚洲黄网站黄| 国产日韩欧美一二三区| 欧美高清视频| 国产精品免费网站在线观看| 久久午夜国产精品| 欧美视频一区二| 免费在线亚洲| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久 | 欧美在线播放视频| 亚洲人体1000| 亚洲一区二区在线免费观看视频| 在线观看日韩av电影| 一区二区三区视频观看| 在线成人www免费观看视频| 99精品欧美一区二区三区| 国内揄拍国内精品久久| 亚洲图片欧美一区| 亚洲精品护士| 久久午夜精品一区二区| 先锋亚洲精品| 欧美日韩午夜激情| 亚洲狠狠丁香婷婷综合久久久| 国产欧美一区二区三区久久| 亚洲欧美卡通另类91av| 夜夜夜精品看看| 久久精品日韩一区二区三区| 亚洲午夜小视频| 免费久久99精品国产| 欧美在线高清| 国产精品www色诱视频| 亚洲国产成人91精品| 狠狠综合久久| 欧美一区二区三区另类| 性欧美激情精品| 国产精品高清一区二区三区| 亚洲第一偷拍| 亚洲国产精品成人精品| 久久久久久免费| 蜜臀久久久99精品久久久久久| 国产伦精品一区二区三区高清版 | 韩日欧美一区二区| 亚洲欧美日本精品| 欧美呦呦网站| 国产亚洲激情| 久久久久久久久岛国免费| 久久精品免费观看| 国产一区二区三区在线观看免费| 性感少妇一区| 久热re这里精品视频在线6| 激情欧美丁香| 蜜臀av性久久久久蜜臀aⅴ| 猫咪成人在线观看| 亚洲国产成人一区| 欧美精品二区三区四区免费看视频| 亚洲国产三级在线| 99在线观看免费视频精品观看| 欧美日韩爆操| 性色av一区二区三区红粉影视| 亚洲尤物视频在线| 国产精品国产三级国产| 亚洲视频欧洲视频| 欧美一区二区三区啪啪| 国产日韩欧美综合精品| 久久国产一区二区| 欧美承认网站| 一本综合精品| 国产精品免费观看在线| 久久久91精品| 欧美激情亚洲| 亚洲尤物精选| 在线观看欧美日本| 欧美aa在线视频| 在线综合+亚洲+欧美中文字幕| 欧美在线视频免费| 亚洲第一页自拍| 欧美精品成人在线| 亚洲欧美日韩在线观看a三区| 久久中文在线| 亚洲深夜激情| 在线看不卡av| 国产精品成人va在线观看| 欧美一区午夜精品| 亚洲精品少妇30p| 欧美在线视频不卡| 亚洲免费av片| 国产在线成人| 国产精品www色诱视频| 久热精品视频在线| 欧美一级淫片aaaaaaa视频| 亚洲第一精品夜夜躁人人爽| 国产精品久久久久免费a∨大胸| 亚洲欧美99| 亚洲国产精品va在看黑人| 欧美亚洲综合网| 日韩一二在线观看| 国产专区欧美专区| 91久久久亚洲精品| 久久精品视频在线播放| 中文国产一区| 亚洲国产一二三| 国产亚洲欧美一区二区| 欧美视频一区二区在线观看| 免费在线欧美视频| 久久久久天天天天|