一个用 Swift 编写的针对 iOS 的企业级应用更新框架
功能
- 在设计和行为上类似于在 macOS 上的知名 Sparkle 框架。
- 易于使用。仅用几行代码即可设置,并只需要托管在 Web 服务器上的几个静态文件即可操作。
- 使用基于 RSS 的应用播客发布信息。应用播客是第三方更新跟踪程序和网站支持的既定标准。
- 直到第二次启动才显示,以获得更好的第一印象。
- 允许某些版本被标记为强制性更新,以修复关键修复和更改。
- 允许配置应用的部署目标,以便用户无需担心无法使用的应用更新。
- 与(但不要求)新企业部署功能(如应用瘦身)配合使用,以保持下载文件大小适中。
要求
- 运行环境:iOS 10 或更高版本
- 构建:Xcode 9.2+ & Swift 5+
- HTTPS 服务器用于提供应用更新,以符合应用传输安全和企业部署要求
安装
CocoaPods
CocoaPods 是 Objective-C 和 Swift 的依赖管理器,它自动简化了在你的项目中使用第三方库的过程。首先,将以下行添加到你的 Podfile
pod 'ShineUpdater', '~> 1.3'
其次,将 Shine 添加到你的项目中
pod install
手动安装
- 将
Shine.swift
文件拖放到你的项目中。 - 安装
SWXMLHash
依赖项。
依赖项
我们使用以下库作为依赖关系
- SWXMLHash,用于解析 RSS 应用播客文件。
用法
在应用代理中初始化
Shine.shared.setup { config in
config.feedURL = URL(string: "https://www.supergoodapp.com/app/appcast.xml")!
}
这是使用Shine的唯一代码级要求。在应用启动时,将自动进行更新检查,并根据需要显示和管理工作更新对话框。
手动检查更新
Shine.shared.checkForUpdates(forceNotify: true)
如果您在应用中某个地方有“检查更新...”UI控件,这将很有用。此方法将执行检查,并显示对话框告知用户是否有可用的更新。
自定义
可以使用以下代码在配置闭包中自定义检查机制的行为:
Shine.shared.setup { config in
config.feedURL = URL(string: "...")!
config.updateCheckInterval = 300 // Default: 3600 (1 hour)
config.remindLaterInterval = 3600 // Default: 86400 (1 day)
config.automaticallyChecksForUpdates = false // Default: true
config.showReleaseNotes = false // Default: true
config.updateDialogDelay = 3.0 // Default: 0 (no delay)
config.customDisplayName = "My Great App" // Default: nil (use Bundle Display Name)
}
updateCheckInterval
:从应用启动时自动检查更新的时间间隔(秒)。
remindLaterInterval
:当用户选择“稍后提醒”时隐藏更新对话框的时间(秒)。
automaticallyChecksForUpdates
:应用在启动时是否自动检查更新。如果将其更改为false
,则应用只有在调用checkForUpdates
函数时才会检查更新并通知。
showReleaseNotes
:是否在更新对话框中显示App Cast中的发布说明。
updateDialogDelay
:在启动时增加了更新对话框的显示延迟。这在应用UI需要一些时间来加载或存在启动画面时很有用。
customDisplayName
:自定义更新对话框中使用的应用标题。默认情况下,该对话框使用CFBundleDisplayName
,但如果为Springboard使用了简短名称,则可以对其进行覆盖。
版本号
iOS应用在Info.plist
文件中设置了两个版本号:CFBundleVersion
和CFBundleShortVersionString
。
Shine仅比较CFBundleVersion
值来判断是否有新版本可用。但如果列出了CFBundleShortVersionString
,则会将显示该字符串给用户。如果这些版本号相同,则不需要在您的Appcast文件中添加简短版本字符串。
服务器设置
Appcast示例
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" xmlns:shine="http://www.eightythreecreative.com/shinens" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>Initial Release</title>
<description>Most recent changes with links to updates.</description>
<language>en</language>
<item>
<title>Version 1.0</title>
<description><![CDATA[• Initial release]]></description>
<pubDate>Tue, 10 April 2018 10:01:11 -0600</pubDate>
<enclosure url="https://www.supergoodapp.com/app/1.0/manifest.plist"
sparkle:version="25"
sparkle:shortVersionString="1.0" />
<sparkle:minimumSystemVersion>10.3</sparkle:minimumSystemVersion>
</item>
<item>
<title>Version 2.0</title>
<description><![CDATA[• Some great new feature
• Another feature
• A third awesome feature]]></description>
<pubDate>Tue, 11 April 2018 10:01:11 -0600</pubDate>
<enclosure url="https://www.supergoodapp.com/app/2.0/manifest.plist"
sparkle:version="40"
sparkle:shortVersionString="2.0" />
<sparkle:minimumSystemVersion>10.3</sparkle:minimumSystemVersion>
<shine:forcedUpdate />
</item>
</channel>
</rss>
Appcast注意和需求
Shine不支持Appcast规范的所有功能。提供的description
标签中的版本说明必须是纯文本。描述中的任何格式化(例如换行符)将显示在对话框中,因此请注意内容。如果某个版本没有与它相关的版本说明,则可以省略该标记,版本说明将不会显示在对话框中。
每个项目仅需要的两个标记是pubDate
和一个包含url
和sparkle:version
属性的enclosure
。
服务器上的文件布局
更新服务器上的文件具体布局由您决定,主要是由该版本的manifest.plist
文件设置的。无论如何,在本存储库的ServerExample中提供了一个建议的目录结构和示例文件。
appcast.xml
文件位于结构根目录,包含应用程序版本1.0和2.0的条目。根据Xcode对manifest.plist
文件的要求,也在这里提供了应用图标。每个新版本都会得到自己的目录,这在需要下载旧版本或一些老设备上的用户因为部署目标不匹配而无法更新到最新版本时很有用,他们仍然可以更新到他们系统可用的最新版本。
精简文件位于每个版本的bin
目录中,由Xcode生成的manifest.plist
文件放置在版本目录中。请确保manifest.plist
文件中的所有URL都准确无误且指向正确的版本。
最后,在发布新版本时,将新版本的详细信息添加到appcast.xml
文件中,将文件复制到新版本目录中,然后从版本目录中复制完成的最新的manifest.plist
文件到根目录,将其重命名为manifest-latest.plist
并覆盖旧文件。这样,您的网站和其他材料可以通过使用以下链接始终指向最新版本:
itms-services://?action=download-manifest&url=https://www.supergoodapp.com/app/manifest-latest.plist
当然,如果需要,您的网站也可以链接到特定老年/较新的版本,这些版本在其自己的文件夹中。
为此项目做贡献
如果您有功能请求或错误报告,请随时通过发送拉取请求或通过创建新问题来帮助。
许可证
Shine在 MIT 许可证的条款和条件下分发。
鸣谢
Shine由Eighty Three Creative, Inc.的创意才智和项目的贡献者共同创造。如果您在项目中使用Shine, تمece应归功于它,尽管这不是必须的。