做 Mac 开发的同学应该至少都听说过 Sparkle,一个应用升级框架,Sparkle 是开源的,参考 Github。
不过需要注意的是,Sparkle 的使用场景应仅仅局限于 非 App Store 且非 Sandbox 应用。
使用 Sparkle 几乎不需要写代码,但需要做一些 Xcode 配置还是必要的。
添加 Sparkle 到你的项目
CocoaPods:
pod 'Sparkle'
记得要使用 use_frameworks!。
手动
- 下载 最新版本
 - 用 Xcode 打开你的项目并将 
Sparkle.framework文件拖入你 - 拖入时请勾选 
Copy items into the destination group’s folder - 拖入时确保勾选了正确的 Target
 - 在对应的 Target 中 
Build Phases->Copy Files Build Phase中添加Sparkle.framework - 在对应的 Target 中 
Build Settings中设置Runpath Search Paths为@loader_path/../Frameworks - 如果你的应用是非 App 性质,如偏好设置和插件等,此项应设置为 
-Wl,-rpath,@loader_path/../Frameworks 
配置 Sparkle
- 打开 
MainMenu.xib/Main.storyboard - 依次选择 
View->Utilities->Object Library... - 在搜索栏中搜索 
Object并将Object拖入左侧 - 选中刚才添加的内容
 - 依次选择 
View->Utilities->Identity Inspector - 修改 
Custom Class为SUUpdater - 如果需要,你也可以添加一个检查更新的菜单项,设置它的 
target为刚才的SUUpdater实例,action为checkForUpdates: 
DSA 签名
- 使用 
Installer Package(.pkg)/Binady Delta Updates更新必须进行 Sparkle 的 DSA 签名 - 偏好设置和插件更新必须进行 Sparkle 的 DSA 签名
 - 对于常规使用苹果开发者签名的 App,不强制但推荐进行 Sparkle 的 DSA 签名
 
要进行 DSA 签名:
- 使用 Sparkle 目录下 
bin/generate_keys工具生成 DSA 密钥,这个步骤只需执行一次 - 备份你的私钥 
dsa_priv.pem并 保证它的安全,不要被他人获取 - 用 Xcode 打开你的项目并将公钥 
dsa_pub.pem拖入其中 - 在 
Info.plist中添加字典 (Dictionary) 键值SUPublicDSAKeyFile,将其值设置为公钥的文件名 (dsa_pub.pem) 
发布应用
DMG
对于 macOS Sierra 及之后的系统版本,最好的方式是使用 signed disk image (.dmg) 映像包。
默认的,网络下载的应用可能会被系统隔离 (translocate),除非它们使用的是已签名的 DMG、PKG 包,或使用 Finder 复制它们。
因此,如果你使用 DMG 方式发布,确保你的 DMG 包在 macOS 10.11.5 及之后的系统中使用开发者 ID 签名。
如果你不做签名,那么则应将应用放在归档的根目录,因为复制整个文件夹不能移除系统的隔离。
当然,你还应该添加一个 /Applications 目录的替身 symlink 方便用户复制应用到他们的系统中。
ZIP/tar
类似的,你也应该想办法让用户更方便的复制你的应用到它们的应用目录,比如使用 LetsMove。
避免在归档中防止除应用外的其它文件,同样的,将应用放在归档根目录。
发布 Appcast
Appcast 用来提供应用更新的细节信息,事实上,它只是在 RSS 源,添加了一些额外信息。
- 在 
Info.plist中添加SUFeedURL并将它的值设置为你的Appcast地址,例如{{ site.url }}/appcast.xml - 当然,最好的选择还是使用 
HTTPS - 注意,你的 
Info.plist中还应包含有格式正确的CFBundleVersion键值对 
<?xml version="1.0" standalone="yes"?><rss xmlns:sparkle="https://www.andymatuschak.org/xml-namespaces/sparkle" version="2.0"><channel><title>Ezra</title>
<item>
<title>1.0</title>
<pubDate>2017-04-25</pubDate>
<sparkle:minimumSystemVersion>10.11</sparkle:minimumSystemVersion>
<enclosure url="{{ site.url }}/clients/mac/Ezra.zip" sparkle:version="21" sparkle:shortVersionString="1.0" length="4312551" type="application/octet-stream" sparkle:dsaSignature="MC0CFxxxxxxxxxxxxxx4Ag4X8n+ogIxxxxxxxxxxxxxxxR4SKM="/>
</item>
</channel></rss>
自动生成
如果你更新的是常规应用,并且进行了前面介绍的 DSA 签名,那么你可以使用 generate_appcast 工具自动生成 Appcast 文件
Build你的应用并进行压缩,例如 DMG/ZIP/tar.bz2等,将压缩后的归档内容放入一个新的文件夹- 执行 
./bin/generate_appcast DSA私钥文件路径.pem 压缩后的归档所在的目录 generate_appcast工具会生成Appcast文件和*.delta文件
手动生成
- 直接复制 
Sparkle目录下准备好的Appcast文件 - 根据你自己的情况进行修改
 
至此,基本的流程已经全部结束,Yay!!


