macOS - 使用 Sparkle 进行自更新


一、创建程序,引入 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

官方文档:

git 讨论:

猜你喜欢

转载自blog.csdn.net/lovechris00/article/details/80247987