更新后登录状态丢失

2019-08-14  本文已影响0人  墨隐于非

小编最近在 Swift 项目中遇到这么一个问题,那就是用户在更新后,登录状态丢失了。

关于当前用户数据,我是使用归解档,存储到 Document文件下的一个 plist文件中。判断登录状态的依据是在 App启动的时候是否可以获取到这个文件中的用户数据。

第一个猜想:plist文件是不是被删除?

多方考证后确定,覆盖安装是不会删除这个文件的,除非将 App删除。

第二个猜想:解档失败

一顿 debug跟踪后,确定是这个问题导致更新后登录状态丢失

debug过程中,在控制台打印如下:

po PropertyListDecoder().decode(User.self, from: data)
▿ DecodingError
  ▿ keyNotFound : 2 elements
    - .0 : CodingKeys(stringValue: "likeFind", intValue: nil)
    ▿ .1 : Context
      - codingPath : 0 elements
      - debugDescription : "No value associated with key CodingKeys(stringValue: \"likeFind\", intValue: nil) (\"likeFind\")."
      - underlyingError : nil

分析:likeFind这个字段是在新的版本添加的字段,在旧版本的原来的 plist文件中没有这个字段,解档的时候直接报错,导致解档失败

解决:由于没有默认值,使用 decoder方法解档就会报错,使用 decodeIfPresent方法解档就没有问题了。

原来的代码:

class YMLoginModel: YMBaseModel {
    
    ...    
    //用户个人主页新增
    var likeFind: String = ""    
    ...
    
    override func mapping(map: Map) {
        ...
        //用户个人主页新增
        likeFind <- map["like_find"]
        ...
    }
    
    private enum CodingKeys: String, CodingKey {
        ...        
        case likeFind = "likeFind"
        ...
    }
    
    required init(from decoder: Decoder) throws {
        super.init()
        let container = try decoder.container(keyedBy: CodingKeys.self)
        ...
        likeFind = try container.decode(String.self, forKey: .likeFind)
        ...
    }
    
    override func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        ...        
    }    
}

没有问题的代码:

class YMLoginModel: YMBaseModel {
    
    ...    
    //用户个人主页新增
    var likeFind: String = ""    
    ...
    
    override func mapping(map: Map) {
        ...
        //用户个人主页新增
        likeFind <- map["like_find"]
        ...
    }
    
    private enum CodingKeys: String, CodingKey {
        ...        
        case likeFind = "likeFind"
        ...
    }
    
    required init(from decoder: Decoder) throws {
        super.init()
        let container = try decoder.container(keyedBy: CodingKeys.self)
        ...
        likeFind = try container.decodeIfPresent(String.self, forKey: .likeFind) ?? ""
        ...
    }
    
    override func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        ...        
    }    
}
上一篇下一篇

猜你喜欢

热点阅读