一、创建程序,引入 Sparkle
1、下载 Sparkle 源码
下载地址:https://github.com/sparkle-project/Sparkle
源码中提供了生成秘钥的工具,可以使用;
我们也可以通过源码分析sparkle 的实现。
2、引入Sparkle 到工程
使用 pod 导入 Sparkle (推荐)
platform :osx, '10.10'
target "Mac_SparklelyUpdate" do
pod 'Sparkle', '~> 1.14.0'
end
二、在本地搭建软件更新网站
在桌面或者某个地方,创建文件夹(如我的文件夹名为 UpdateHost);进入这个文件夹,并创建 http 服务:
$ cd /Users/administrator/Desktop/UpdateHost
$ python -m SimpleHTTPServer 8902
输入完成后, 在浏览器中输入 http://127.0.0.1:8902 即可访问到本文件夹;
查看目前网卡连接的IP地址,把 127.0.0.1 改为这个IP 即可被局域网内其他用户访问;
查看方法:https://jingyan.baidu.com/article/b0b63dbf3fefd14a48307013.html
三、生成秘钥
打开 sparkle 源码文件夹,进入 bin 文件夹,可以看到 genenrte_keys 和 sign_update,这是两个 shell 文件。
cd 进这个文件夹,拖拽 genenrte_keys 到 终端,即可生成 公钥(das_pub.pem)和私钥(das_priv.pem)。保存好这两个文件,因为后续的更新都会用到,否则会更新失败。当然,你也可以修改源码,把这里的秘钥匹配环节修改掉。
生成秘钥,和秘钥的使用。上述文章中用 ruby 来执行,可能不对。
如果执行完这些命令,没有看到你的 pem 文件,可以检查下命令行是在哪个文件夹下执行的。
四、配置工程
1、拖拽公钥到工程
2、设置 SUPublicDSAKeyFile
在 info.plist 中设置 SUPublicDSAKeyFile 为 dsa_pub.pem
3、设置 SUFeedURL
sparkle 会根据 xml 来了解新版本的 名字、版本、秘钥等信息;
我们需要在更新的文件夹(UpdateHost)下创建一个xml文件,如 appupdate.xml;xml文件内容编写会在第六大步中讲述;
那么在 info.plist 中设置 SUFeedURL 为 http://127.0.0.1:8902/appupdate.xml
4、IB 连接 Sparkle 更新事件
详见 http://www.cocoachina.com/mac/20100920/2111.html
4.1、从Library中拖拽一个 NSObject到MainMenu主窗口.
4.2、点击此Object对象,点击Inspector,设定此Object的Class为 SUUpdater
4.3、添加一个菜单项到到TestSparkle Menu,重命名为 Check For Updates
4.4、将 Check for Updates…菜单项的Send Actions指向Updater Object的checkForUpdates方法
4.5、保存Interface Builder的所有更改,退出Interface Builder。
五、创建高版本
5.1 运行项目
1)将版本号改为 1.2 或者更高;
2)运行后, 查看左上方菜单下,确认Check for Updates…按钮处于可用状态,如果是灰色不可点击,则返回Interface Builder修改。
3)拿到 app 文件,压缩为zip 包,拖拽到存放私钥的地方;
5.2 生成数字签名
在压缩包和存放私钥的文件夹,运行:
最新:
$ cd /Users/administrator/Downloads/他山之石_MacOS/Sparkle-master/bin
$ ./sign_update MacSoftwareManeger_1.1.dmg dsa_priv.pem
得到数字签名
MEUCIAsqJN2HPEsfyGbHjBTGuDHlkW5+sQ2WbryytXX/6nddAiEAg3+OWPS432S5
KNullEnXC9CeocVnHVWxDkGSnuWTLqQ=
六、编写 App Cast Feed(xml)文件
进入UpdateHost文件夹 ,编辑第四步创建的 appupdate.xml 文件。
这个文件sparkle又称为 App Cast XML Feed文件,模版如下:
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
<channel>
<title>MSUpdate测试</title>
<link>http://10.242.45.198:8902/MSUpdate/msupdate_1_2.xml</link>
<description>Most recent changes with links to updates.</description>
<language>en</language>
<item>
<title>Version 1.3</title>
<description>
<![CDATA[
<ul>
<li>MS - 变更</li>
<li>1.可以</li>
<li>2.test</li>
<li>3.支持</li>
</ul>
]]>
</description>
<pubDate>Wed, 16 May 2018 11:20:11 +0000</pubDate>
<enclosure url="http://10.242.45.198:8902/MSUpdate/MSUpdateDemo0622_1_2.zip" sparkle:version="1.3"
length="1887436"
type="application/octet-stream"
sparkle:dsaSignature="MEYCIQDELdw38iONZiQldKFlDrDkYQSSsSJIbllhMt5n2svSkwIhAJtHvg0XCNij
kS+XTtViOr35bJV+mrIKgJX1AfDr0m7u"/>
</item>
</channel>
</rss>
其中 channel 中
- title 是工程名字;
- link 是本xml 链接地址;
- description 是跟新描述,将出现在更新面板中;
- pubDate 是发布日期 ;
- sparkle:dsaSignature 后面跟的是第五步生成的数字签名;
- enclosure url 后面是 安装包地址;
- sparkle:version 后面是安装包的版本;
- length=“436264” 指更新包的大小,上传上去前用 终端 ls -al 命令可查看;
- type=“application/octet-stream” 是下载类型,使用afn 的同学可能会了解,一般不用修改。
七、完善服务器文件、测试更新
将 zip 包拖拽到 UpdateHost 文件夹;
然后在浏览器访问 http://127.0.0.1:8902 ,可以看到这两个文件,才正常。
将xcode 中的工程版本改为 1.0,运行并点击 Check for Updates… 如果一切正常,你可以看到更新提示窗口。
点击Install Update,将会进行更新;更新成功后,再点点击更新,会提示这是最新版本。
八、参考资料
参考改编自:
http://www.cocoachina.com/mac/20100920/2111.html
http://blog.sina.com.cn/s/blog_8343bc050102v83m.html
http://www.cocoachina.com/bbs/3g/read.php?tid=71139
https://www.jianshu.com/p/e2a6670aafd6
http://www.cocoachina.com/bbs/read.php?tid-71139-keyword-sparkle.html
官方文档:
Basic Setup:
https://sparkle-project.org/documentation/Customizing Sparkle:https://sparkle-project.org/documentation/customization/
git 讨论:
- checkForUpdatesInBackground not installing new version
https://github.com/sparkle-project/Sparkle/issues/839