如何仅向App老用户在启动时展示新功能提示弹窗?
如何区分新老用户展示不同的新功能提示弹窗?
完全可以做到!这是iOS开发中非常常见的需求——毕竟新用户和老用户对App功能的认知差异很大,针对性展示提示体验会好很多。我给你整理几个实用的实现思路和代码示例:
核心思路
本质是通过本地存储或服务器记录来区分用户类型:
- 新用户:首次安装/启动App,无历史使用记录
- 老用户:之前安装过App,有历史版本记录
方案一:用UserDefaults实现(简单易上手)
UserDefaults是iOS本地存储最基础的方式,适合快速实现这个需求。我们可以存储两个关键信息:用户是否首次启动,以及上次启动的App版本号。
实现步骤:
- 在App启动完成后(比如
SceneDelegate的scene(_:willConnectTo:options:)方法里),检查存储的标记 - 根据标记判断用户类型,展示对应的弹窗
- 更新存储的版本号或首次启动标记
代码示例(Swift):
func checkAndShowFeatureAlert() { let userDefaults = UserDefaults.standard guard let currentVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String else { return } // 判断是否是新用户(首次启动) if !userDefaults.bool(forKey: "hasLaunchedBefore") { // 新用户逻辑:可以展示全功能引导,或者不展示新功能提示 showNewUserOnboardingAlert() // 存储标记和当前版本 userDefaults.set(true, forKey: "hasLaunchedBefore") userDefaults.set(currentVersion, forKey: "lastLaunchedVersion") userDefaults.synchronize() } else { // 老用户,检查是否有版本更新 let lastVersion = userDefaults.string(forKey: "lastLaunchedVersion") ?? "" // 对比版本号,当前版本更高则展示新功能提示 if currentVersion.compare(lastVersion, options: .numeric) == .orderedDescending { showNewFeatureAlertForExistingUsers() // 更新存储的版本号 userDefaults.set(currentVersion, forKey: "lastLaunchedVersion") userDefaults.synchronize() } } } // 新用户专属引导弹窗 private func showNewUserOnboardingAlert() { let alert = UIAlertController(title: "欢迎加入!", message: "这里有你需要的所有功能,快来探索吧~", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "开始使用", style: .default)) // 确保获取到当前根控制器再弹窗 if let rootVC = UIApplication.shared.connectedScenes .first(where: { $0.activationState == .foregroundActive }) .flatMap({ $0 as? UIWindowScene })?.windows .first(where: { $0.isKeyWindow })?.rootViewController { rootVC.present(alert, animated: true) } } // 老用户新功能提示弹窗 private func showNewFeatureAlertForExistingUsers() { let alert = UIAlertController(title: "功能更新啦!", message: "我们新增了XX功能,帮你更高效地完成XX操作,快来试试吧~", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "了解更多", style: .default)) alert.addAction(UIAlertAction(title: "知道了", style: .cancel)) // 确保获取到当前根控制器再弹窗 if let rootVC = UIApplication.shared.connectedScenes .first(where: { $0.activationState == .foregroundActive }) .flatMap({ $0 as? UIWindowScene })?.windows .first(where: { $0.isKeyWindow })?.rootViewController { rootVC.present(alert, animated: true) } }
方案二:用Keychain存储(更可靠)
如果担心用户卸载重装后被误判为新用户,或者UserDefaults被系统/用户清除,可以用Keychain存储关键信息——Keychain在App卸载后默认会保留(除非用户重置设备或清除所有数据)。
实现思路和UserDefaults一致,只是把存储介质换成Keychain。你可以直接使用系统的Security框架,或者用第三方库来简化操作。
方案三:结合服务器验证(适合有账号系统的App)
如果你的App有用户登录功能,最准确的方式是在服务器端记录用户的首次使用版本、注册时间等信息。用户登录后,从服务器获取这些信息,再决定展示哪种弹窗。这种方式不受本地存储的影响,数据更可靠。
注意事项
- 弹窗时机:不要在App启动瞬间就弹窗,最好延迟0.5-1秒,等主界面加载完成后再展示,避免出现弹窗无法弹出的问题。
- 版本号对比:用
compare(_:options: .numeric)来对比版本号,而不是直接字符串相等,这样即使用户跳过了某个版本,也能正确触发更新提示。 - 用户体验:可以给用户添加“不再提示”的选项,避免每次更新都弹窗打扰用户。
内容的提问来源于stack exchange,提问作者Jared L.
相关产品推荐
相关产品推荐

