iOS中Token存储及代码实现求助:UserDefaults与Header配置问题
解决UserDefaults存储Token与Header配置的问题
嘿,我看到你在对接服务器的项目里,用UserDefaults存Token和配置Header时踩了坑,咱们来一步步把代码理顺~
先揪出核心错误
你误用了UserDefaults的set(_:forKey:)方法——这个方法是用来存储值的,不是读取!要获取已存储的Token,得用string(forKey:)(因为Token是字符串类型),它会返回可选的String,刚好能配合guard做安全解包。
修正后的Header配置代码
先统一Token的存储Key(比如用"authToken",避免Key混乱),然后重新编写headers计算属性:
var headers: [String: String]? { switch self { // 登录接口不需要Authorization头 case .signIn: return nil // 刷新Token和其他接口需要携带Authorization头 case .renewalToken, default: // 从UserDefaults读取存储的Token guard let token = UserDefaults.standard.string(forKey: "authToken") else { // 如果Token不存在,可返回nil(或根据业务需求处理,比如抛出未登录错误) return nil } return ["Authorization": "Bearer \(token)"] } }
补充Token的存储逻辑
你还需要在登录成功后,把服务器返回的Token存到UserDefaults里,比如登录接口的回调中:
// 假设登录成功后拿到了服务器返回的tokenString UserDefaults.standard.set(tokenString, forKey: "authToken") UserDefaults.standard.synchronize() // iOS10+后系统会自动同步,手动调用也没问题
配合你的Get请求方法
修正后的headers属性已经能正确返回带Token的Header字典了,你的Get请求方法不需要修改,直接使用api.headers即可:
func get(_ api: TargetType) -> DataRequest{ return AF.request(baseURI + api.path, method: .get, parameters: api.parameters, encoding: JSONEncoding.prettyPrinted, headers: api.headers, interceptor: nil) }
额外的最佳实践提醒
- 不要用UserDefaults存敏感Token:UserDefaults是明文存储的,安全性很低,建议用iOS的Keychain来存储Token这类敏感信息。
- 封装Token管理:可以写一个单独的
AuthManager工具类,统一处理Token的存储、读取、删除逻辑,避免到处写UserDefaults的代码,比如:
之后在Header里就可以用class AuthManager { static let shared = AuthManager() private let tokenKey = "authToken" private init() {} func saveToken(_ token: String) { UserDefaults.standard.set(token, forKey: tokenKey) } func getToken() -> String? { return UserDefaults.standard.string(forKey: tokenKey) } func removeToken() { UserDefaults.standard.removeObject(forKey: tokenKey) } }AuthManager.shared.getToken()来读取,代码更整洁易维护。
内容的提问来源于stack exchange,提问作者ga-yo
相关产品推荐
相关产品推荐

