Sparkle是一个非常简单且易用的macOS应用程序更新框架,目前众多知名macOS App都在使用,包括微信、迅雷等 ,如下图:
官网地址:https://sparkle-project.org/
Github:https://github.com/sparkle-project/Sparkle
原理:提前在服务器配置好的xml文件,然后每次启动后解析xml,查看是否有比当前版本新的数据,有的话提示更新,注意检查的是Build,即CFBundleVersion的值。
具体操作如下:
第一步:引入SnapKit.framework,方式有两种,第一种就是直接pod导入,第二种就是下载源码本地编译生成framework导入项目。
1. pod导入
pod 'Sparkle'
2. 下载本地并编译出framework
git clone --recursive https://github.com/sparkle-project/Sparkle
第二步:创建自动更新检查连线,如下图:
即创建一个Object对象,然后设置他是Class类型为SUUpdater,然后按住control,拖动检查更新的菜单连线到更新对象的方法,如下图:
第三步:代码中编写检查更新的方法:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
// Insert code here to initialize your application
//自动更新机制
[[SUUpdater sharedUpdater] checkForUpdatesInBackground];
}
第四步:生成本地SUPublicEDKey写入到info.plist文件,如下图:
即在生成generate_keys然后直接拖动路径到终端下执行即可看到这个SUPublicEDKey,然后保存到info里面,如下图:
第五步:生成在线检查更新的xml文件,首先在info中添加文件地址,如下图:
通过直接执行命令generate_appcast(同上先生成可执行文件)来生成,首先把xxx.app压缩后放入一个文件夹,然后执行命令如下:
第六步:把xml文件和APP压缩包传到对应的服务器即可,如果想更丰富xml的内容,可以添加一些更新内容(description中添加),如下源码:
<?xml version="1.0" standalone="yes"?>
<rss xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" version="2.0">
<channel>
<title>风车签名管理</title>
<item>
<title>1.0.4</title>
<pubDate>Thu, 24 Dec 2020 10:51:32 +0800</pubDate>
<sparkle:minimumSystemVersion>10.12</sparkle:minimumSystemVersion>
<description>
<![CDATA[
<ul>
<li>新增【动态库导出】功能;</li>
<li>新增APP每日安装量统计功能;</li>
<li>新增APP到达安装限量邮件通知功能;</li>
<li>优化一些功能,修复已知bug。</li>
</ul>
]]>
</description>
<enclosure url="http://xxxxxxxxx/download/pinwheel.zip" sparkle:version="5" sparkle:shortVersionString="1.0.4" length="5561536" type="application/octet-stream" sparkle:edSignature="/gOemYmxDFJlXspvPYGeAM2CJDJ/fmsxxxxxxxxxxiM0PzlWbeSz/25LLANDnWuWYzXNQsoZ3UeFBQ=="/>
</item>
</channel>
</rss>
至此,Sparkle就完美的实现了自动更新的功能,大快人心的时刻到了,产品【风车签名管理】展示效果图如下:
产品实践总结:在阅读和引入开源项目时,我们总会发现优雅思维和代码的存在,比如说在info.plist配置SUFeedURL文件请求地址、SUPublicEDKey安全效验码,甚至在xml中从容的配置多版本更新、升级版本内容,以及配置强制更新(即没有Skip 和 Later,只有Update)功能,一切都是如此的美妙,如果读者有疑问,可关注留言讨论。
啊,开源,是一件多么美妙的事业,再次感谢 Sparkle 团队的开源精神。
附录:参考微信更新弹窗和XML文件:
XML文件:https://dldir1.qq.com/weixin/mac/mac-release.xml
<rss version="2.0" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>Mac Wechat</title>
<link>https://mac.weixin.qq.com</link>
<description>Most recent changes with links to updates.</description>
<language>en</language>
<item>
<title>2.6.1.19</title>
<description xml:lang="en">
<![CDATA[
<h2>2.6.1.19</h2>
<li> Set remarks for groups.</li>
<li> Hide a chat in the chat list.</li>
<li> Bug fixes and improvements.</li>
]]>
</description>
<description xml:lang="zh-Hans">
<![CDATA[
<h2>2.6.1.19</h2>
<li> 可以给群聊设置备注;</li>
<li> 可以在聊天列表中不显示某个聊天;</li>
<li> 修复了一些已知问题。</li>
]]>
</description>
<description xml:lang="zh-Hant">
<![CDATA[
<h2>2.6.1.19</h2>
<li> 可為群組設定備註;</li>
<li> 可在聊天清單中設定隱藏某個聊天;</li>
<li> 修復一些已知問題。</li>
]]>
</description>
<pubDate>2021-01-14 20:32:57</pubDate>
<enclosure url="https://dldir1.qq.com/weixin/mac/WeChatMac.dmg?t=1610627577" sparkle:version="16853" sparkle:shortVersionString="2.6.1.19" length="60864466" type="application/octet-stream" sparkle:dsaSignature="MCwCFBYlOcX8O/cHSRzdAZBicDuTzL9eAhQw6kgy+Q6MAqtejwXOvKoX195Tkw==" sparkle:md5="52bb402c8112f1fa23752dba25ebd2e8" />
<sparkle:minimumSystemVersion>10.11</sparkle:minimumSystemVersion>
</item>
<item>
<title>2.3.31.22</title>
<description xml:lang="en">
<![CDATA[ <h2>2.3.31.22</h2> <li> Fixed various bugs;</li> ]]>
</description>
<description xml:lang="zh-Hans">
<![CDATA[ <h2>2.3.31.22</h2> <li>修复了一些已知问题;</li> ]]>
</description>
<description xml:lang="zh-Hant">
<![CDATA[ <h2>2.3.31.22</h2> <li> 修復了一些已知問題</li> ]]>
</description>
<pubDate>2020-05-21 18:40:20</pubDate>
<enclosure url="https://dldir1.qq.com/weixin/mac/WeChatMac_10_10.dmg" sparkle:version="13425" sparkle:shortVersionString="2.3.31.22" length="33457380" type="application/octet-stream" sparkle:dsaSignature="MC0CFQCb/M1dbbxrENJxmFrqPgJoaVJPtAIUHC/sMPXL1iJmrF6p+Cn8R+XNPqI=" sparkle:md5="f6923955df322302a68167fa8f3078ac" />
<sparkle:maximumSystemVersion>10.10.6</sparkle:maximumSystemVersion>
</item>
</channel>
</rss>