这里每天分享一个 iOS 的新知识,快来关注我吧
前言
在移动应用的开发过程中,版本更新是必不可少的一环。
无论是修复漏洞、功能迭代,还是提升用户体验,更新都扮演着至关重要的角色。那么,如何给用户有效地传递更新信息,并在必要时执行强制更新呢?本文将为你详细解析这一过程。
为什么需要更新?
随着时间的推移,应用需要不断迭代,以适应用户的需求和市场的变化。而有的功能也随之废弃,此时就需要让用户更新到最新版本。
还有的时候,应用需要进行安全更新,以修复已知的安全漏洞和优化用户体验。
作为开发者,我们有责任在代码中传达更新的重要性。
请在微信客户端打开
非侵入性通知策略
应用内通知
首先我们需要有个服务端接口来获取应用的最新版本,客户端开启时调用接口检查,把当前的版本号传给服务端,服务端返回是否需要更新,以及更新内容。
如果你没有服务端,那么可以利用 iTunes Lookup API 来获取应用的最新版本,然后进行版本对比。具体的 URL 规则为https://itunes.apple.com/br/lookup?bundleId={你的bundleId}
,它会返回一个 JSON 对象,其中包含应用的最新版本号。
通过应用内通知,我们可以在用户打开应用时,温和地提示他们进行更新。以下是一个简单的 Swift 实现示例:
php
func showInAppNotification(message: String) {
let alertController = UIAlertController(
title: "有更新可用啦",
message: message,
preferredStyle: .alert
)
let updateAction = UIAlertAction(title: "更新", style: .default) { _in
iflet appStoreURL = URL(string: "https://apps.apple.com/cn/app/%E6%8A%96%E9%9F%B3/id1142110895") {
UIApplication.shared.open(appStoreURL, options: [:], completionHandler: nil)
}
}
alertController.addAction(updateAction)
iflet viewController = UIApplication.shared.keyWindow?.rootViewController {
viewController.present(alertController, animated: true, completion: nil)
}
}
// 示例使用
let updateMessage = "应用程序的新版本已可用。立即更新以获取最新功能和改进。"
showInAppNotification(message: updateMessage)
这个示例中,我们通过UIAlertController
创建了一个弹窗,并在用户点击更新按钮时,打开应用在 App Store 的链接,Alert 也会被关闭。

理论上,这种更新方式可以被用户跳过。
推送通知
如果用户没有打开应用,那么就需要通过推送通知来提醒用户更新了,服务端存储用户的版本,然后根据版本号来判断给哪些用户发送更新推送。
利用推送通知是一种在用户不打开应用的情况下,提醒用户的有效方式。结合苹果的 APNS,可以在 AppDelegate 中处理收到的推送通知,进而弹出更新弹窗:
swift
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
if let updateMessage = userInfo["updateMessage"] as? String {
showInAppNotification(message: updateMessage)
}
}
强制更新的情况
强制更新侵入性比较强,也比较容易引起用户的反感,通常用于特定场景,比如发现安全漏洞、修复严重 bug、服务器端的重大变更或旧版本的弃用等等。
在制定强制更新方案时,需要考虑用户的不同选择、可能的中断、网络情况等。
实现方案
利用 iTunes Lookup API,我们可以获取应用的最新元数据。我们以抖音 app 为例,写一个获取最新版本号的并唤起强更的示例。
抖音 app 的 iTunes Lookup API 地址为https://itunes.apple.com/cn/lookup?bundleId=com.ss.iphone.ugc.Aweme
。
请求 iTunes Lookup API
简单的代码如下:
vbnet
guard let url = URL(string: "https://itunes.apple.com/cn/lookup?bundleId=com.ss.iphone.ugc.Aweme") else {
return
}
URLSession.shared.dataTask(with: url) { data, response, error in
iflet data = data {
do {
let json = tryJSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
iflet results = json?["results"] as? [[String: Any]], let version = results.first?["version"] as? String {
let localVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String
iflet localVersion = localVersion, version > localVersion {
DispatchQueue.main.async {
// 弹出更新弹窗
let updateMessage = "应用程序的新版本已可用。立即更新以获取最新功能和改进。"
self.showInAppNotification(message: updateMessage)
}
}
}
} catch {
print("Error parsing JSON: \(error)")
}
}
}.resume()
处理异常情况
首先,既然是强更,就不让让用户跳过了,最简单的方法是在用户点击"更新"按钮后,重新将 Alert 弹出:
php
func showInAppNotification(message: String) {
let alertController = UIAlertController(
title: "有更新可用啦",
message: message,
preferredStyle: .alert
)
let updateAction = UIAlertAction(title: "更新", style: .default) { _in
iflet appStoreURL = URL(string: "https://apps.apple.com/cn/app/%E6%8A%96%E9%9F%B3/id1142110895") {
UIApplication.shared.open(appStoreURL, options: [:], completionHandler: nil)
}
// 重新弹出更新弹窗
self.showInAppNotification(message: message)
}
alertController.addAction(updateAction)
iflet viewController = UIApplication.shared.keyWindow?.rootViewController {
viewController.present(alertController, animated: true, completion: nil)
}
}
另外还需要考虑用户断网、请求失败等情况,最好的方法是在本地记录一个是否检查过版本更新的值,然后监听设备有网络时重新检查一下更新状态,保证一次冷启动周期内检查成功一次,进而保证用户无法跳过强制更新。
结语
应用的更新与用户体验息息相关。通过合理的策略,我们可以在尽量不打扰用户的情况下,及时有效地推动更新,确保应用的安全性和功能性。希望本文能为你的应用更新策略提供一些启发。
这里每天分享一个 iOS 的新知识,快来关注我吧
本文同步自微信公众号 "iOS新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!