求助:iOS应用崩溃问题排查(附Firebase用户信息获取代码)
以下是代码中潜在的崩溃风险点及修复建议:
强制解包
identifierForVendor触发崩溃
代码中private static let uuid = UIDevice.current.identifierForVendor!.uuidString使用强制解包!,但identifierForVendor在模拟器、未激活设备等场景下会返回nil,此时直接强制解包会导致应用崩溃。
修复示例:private static let uuid = UIDevice.current.identifierForVendor?.uuidString ?? UUID().uuidString隐式可选
membershipStatus的崩溃隐患var membershipStatus: memberships!为隐式可选类型,若Utils.getUserMembershipStatus(dateJoined: dateJoined)返回nil,后续将其传入User初始化时会因隐式可选无值触发崩溃。
修复示例(二选一):// 方案1:改为可选类型,后续处理nil场景 var membershipStatus: memberships? // 方案2:兜底默认值,确保状态非nil var membershipStatus: memberships = Utils.getUserMembershipStatus(dateJoined: dateJoined) ?? .noMembership静态属性初始化时机导致的异常
private static let user = Auth.auth().currentUser作为静态属性会在类首次访问时初始化,但此时Firebase Auth可能尚未完成用户状态同步,导致user为nil,进而userRef指向Users/空路径。虽不直接崩溃,但会引发数据读取异常,间接导致崩溃。
修复示例:class func getUser(completion: @escaping (User?) -> ()) { guard let currentUser = Auth.auth().currentUser else { completion(nil) return } let userRef = Database.database().reference().child("Users").child(currentUser.uid) userRef.observeSingleEvent(of: .value, with: { (snapshot) in // 原有逻辑代码 }) { (error) in print(error.localizedDescription) completion(nil) } }dateJoined空值引发的间接崩溃
若dateJoined为空字符串,Utils.getUserMembershipStatus内部可能因日期解析失败崩溃。需在Utils方法中增加空值处理,或确保Firebase中该字段始终存储有效日期字符串。
内容的提问来源于stack exchange,提问作者great8

