You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的代码,比如:
    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)
        }
    }
    
    之后在Header里就可以用AuthManager.shared.getToken()来读取,代码更整洁易维护。

内容的提问来源于stack exchange,提问作者ga-yo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 12:32:30