Swift 4.0中向Firebase添加变量子值时App崩溃,报InvalidPathValidation异常
解决InvalidPathValidation未捕获异常导致的应用崩溃
你遇到的这个崩溃,根源是在使用数据库(大概率是Firebase系列服务)时,传入了不符合要求的路径节点——错误信息明确说了,路径节点必须是非空字符串,且不能包含. # $ [ ]这些特殊字符。结合你的代码来看,是在点击“下一步”跳转时,把当前页面的输入值直接传给了RegistrationViewController,但这些值可能是空的,或者包含了禁用字符,后续被用作数据库路径时就触发了异常。
下面是具体的解决步骤:
跳转前先做输入校验,从源头拦截非法值
不要直接在prepare(for:sender:)里传值,而是在触发跳转的按钮点击事件里先校验输入内容,确认合法后再执行跳转。示例代码如下:@IBAction func nextButtonTapped(_ sender: UIButton) { // 先检查昵称是否为空(去除首尾空格后判断) guard let inputDisplayName = displayNameText, !inputDisplayName.trimmingCharacters(in: .whitespaces).isEmpty else { showTipAlert(message: "请输入有效的昵称") return } // 检查昵称是否包含禁用字符 let forbiddenCharacters = CharacterSet(charactersIn: ".#$[]") if inputDisplayName.rangeOfCharacter(from: forbiddenCharacters) != nil { showTipAlert(message: "昵称不能包含 . # $ [ ] 这些字符哦") return } // 再检查邮箱/手机号是否为空 guard let inputContact = emailOrPhoneText, !inputContact.trimmingCharacters(in: .whitespaces).isEmpty else { showTipAlert(message: "请输入邮箱或手机号") return } // 所有校验通过,再执行跳转 performSegue(withIdentifier: "你的Segue标识", sender: self) } // 自定义弹窗提示方法 private func showTipAlert(message: String) { let alert = UIAlertController(title: "提示", message: message, preferredStyle: .alert) alert.addAction(UIAlertAction(title: "好的", style: .default)) present(alert, animated: true) }在目标页面做二次校验,防止意外情况
即使在跳转前做了校验,也建议在RegistrationViewController里再做一次安全检查,避免因为其他异常情况导致非法值传入:override func viewDidLoad() { super.viewDidLoad() // 校验昵称合法性 guard let validDisplayName = displayNameText, !validDisplayName.trimmingCharacters(in: .whitespaces).isEmpty, validDisplayName.rangeOfCharacter(from: CharacterSet(charactersIn: ".#$[]")) == nil else { showTipAlert(message: "昵称格式无效,请返回修改") navigationController?.popViewController(animated: true) return } // 后续的注册逻辑可以在这里安全执行了 }排查数据库操作代码,确保路径合法
找到你使用这些变量作为数据库路径的代码(比如child(displayNameText!)这类写法),确保只有在校验通过后才执行这类操作,不要直接使用未校验的可选值。
这样处理后,就能有效避免这个InvalidPathValidation异常,保证应用不会因为非法输入崩溃。
内容的提问来源于stack exchange,提问作者EpicNav
相关产品推荐
相关产品推荐

