如何在iOS应用首次启动时存储权限状态并在后续启动复用?
嗨,这个问题的核心是你现在用的saveQuestion是内存中的临时变量,APP重启后就会被重置,所以得把用户的选择持久化存储起来。iOS里最适合存这种轻量配置的就是UserDefaults啦,我给你一步步改代码:
第一步:定义统一的存储Key
先定义一个常量作为存储的键名,方便后续统一维护,避免拼写错误:
private let kPermissionSaveQuestion = "PermissionSaveQuestion"
第二步:修改弹窗的权限存储逻辑
把原来赋值给self.saveQuestion的代码,改成把状态存到UserDefaults里,同时用户同意时直接执行功能:
func AlertOnce(Message: String) { let alert1 = UIAlertController(title: "أهلا بك", message: Message, preferredStyle: .alert) alert1.addAction(UIAlertAction(title: "موافق", style: .default, handler: { _ in // 把同意状态持久化存储 UserDefaults.standard.set(true, forKey: kPermissionSaveQuestion) print("OK") // 用户同意后立即执行功能 self.performTargetFunction() })) alert1.addAction(UIAlertAction(title: "غير موافق", style: .destructive, handler:{ _ in // 把拒绝状态持久化存储 UserDefaults.standard.set(false, forKey: kPermissionSaveQuestion) print("Not OK") } )) self.present(alert1, animated: true) }
第三步:封装功能执行代码
把原来的功能代码抽成单独的函数,方便弹窗和APP启动时复用:
private func performTargetFunction() { ref.child("QuestionOfUsers").childByAutoId().setValue(label1.text) label1.text = "" }
第四步:调整首次启动的判断逻辑
原来的isFirstLaunch()只判断是否首次启动,但其实我们需要的是用户还没做过权限选择时才弹窗,所以改成检查UserDefaults里有没有存储过状态:
// 检查是否从未存储过权限状态(即用户还没做过选择) if UserDefaults.standard.object(forKey: kPermissionSaveQuestion) == nil { self.AlertOnce(Message: "hello may i use ....") } else { // 如果已经有历史选择,直接读取状态并判断是否执行功能 let hasPermission = UserDefaults.standard.bool(forKey: kPermissionSaveQuestion) if hasPermission { self.performTargetFunction() } }
原理说明
UserDefaults会把数据存在APP的沙盒目录里,属于持久化存储,APP重启、甚至卸载重装前(卸载会清空沙盒),数据都会保留,完全满足你存储用户权限选择的需求~如果之后想让用户修改权限,只需要在设置页面加个开关,修改UserDefaults对应键的值就可以啦。
内容的提问来源于stack exchange,提问作者Nada Sami
相关产品推荐
相关产品推荐

