EEYatHo 앱 깎는 이야기

Swift ) lottie keyNotFound error - EEYatHo iOS 본문

iOS, Swift

Swift ) lottie keyNotFound error - EEYatHo iOS

EEYatHo 2021. 11. 30. 20:11
반응형

 

배경 설명


갑자기 특정 Lottie 파일만 작동을 안하는 버그 발생..

 

에러 메세지 : 

keyNotFound(Discriminator(stringValue: "ty", intValue: nil), Swift.DecodingError.
Context(codingPath: [_JSONKey(stringValue: "Index 12", intValue: 12), 
_JSONKey(stringValue: "Index 0", intValue: 0)], debugDescription: "No value associated 
with key Discriminator(stringValue: \"ty\", intValue: nil) (\"ty\").", 
underlyingError: nil))

 

에러 메세지나 관련 키워드로 아무리 구글링해도 답이 보이지 않아서, 직접 파헤쳐보기로!

 

메세지를 보아하니,

Codable 객체로 파싱할 때 실패해서 생기는 오류고, "ind" 라는 키값이 없어서 발생.

 

"ind" 값을 가지고 추적해보면,

Pods 프로젝트의 lottie-ios 폴더에서, LayerModel.swift 의 LayerModel Class 에서 발생하는 오류.

( lottie-ios 버젼 3.2.3 )

 

 

LayerModel.swift :

class LayerModel: Codable {
  
  /// The readable name of the layer
  let name: String
  
  /// The index of the layer
  let index: Int
  
  /// The type of the layer.
  let type: LayerType
  
  /// The coordinate space
  let coordinateSpace: CoordinateSpace
  
  /// The in time of the layer in frames.
  let inFrame: Double
  /// The out time of the layer in frames.
  let outFrame: Double
  
  /// The start time of the layer in frames.
  let startTime: Double
  
  /// The transform of the layer
  let transform: Transform
  
  /// The index of the parent layer, if applicable.
  let parent: Int?
  
  /// The blending mode for the layer
  let blendMode: BlendMode
  
  /// An array of masks for the layer.
  let masks: [Mask]?
  
  /// A number that stretches time by a multiplier
  let timeStretch: Double
  
  /// The type of matte if any.
  let matte: MatteType?
  
  let hidden: Bool
  
  private enum CodingKeys : String, CodingKey {
    case name = "nm"
    case index = "ind"
    case type = "ty"
    case coordinateSpace = "ddd"
    case inFrame = "ip"
    case outFrame = "op"
    case startTime = "st"
    case transform = "ks"
    case parent = "parent"
    case blendMode = "bm"
    case masks = "masksProperties"
    case timeStretch = "sr"
    case matte = "tt"
    case hidden = "hd"
  }
  
  required init(from decoder: Decoder) throws {
    let container = try decoder.container(keyedBy: LayerModel.CodingKeys.self)
    self.name = try container.decodeIfPresent(String.self, forKey: .name) ?? "Layer"
    self.index = try container.decode(Int.self, forKey: .index)
    self.type = try container.decode(LayerType.self, forKey: .type)
    self.coordinateSpace = try container.decodeIfPresent(CoordinateSpace.self, forKey: .coordinateSpace) ?? .type2d
    self.inFrame = try container.decode(Double.self, forKey: .inFrame)
    self.outFrame = try container.decode(Double.self, forKey: .outFrame)
    self.startTime = try container.decode(Double.self, forKey: .startTime)
    self.transform = try container.decode(Transform.self, forKey: .transform)
    self.parent = try container.decodeIfPresent(Int.self, forKey: .parent)
    self.blendMode = try container.decodeIfPresent(BlendMode.self, forKey: .blendMode) ?? .normal
    self.masks = try container.decodeIfPresent([Mask].self, forKey: .masks)
    self.timeStretch = try container.decodeIfPresent(Double.self, forKey: .timeStretch) ?? 1
    self.matte = try container.decodeIfPresent(MatteType.self, forKey: .matte)
    self.hidden = try container.decodeIfPresent(Bool.self, forKey: .hidden) ?? false
  }
}

 

 

 

Solution


  • 음.. ind가 없어서 문제니까, 해당 값이 없어도 index가 값을 가질 수 있게하자!
    -> 값이 없어도 error 를 뱉지말고, 0을 가져보렴~

 

그래서 required init에서 아래 코드를

self.index = try container.decode(Int.self, forKey: .index)

 

아래 처럼 바꾸니 해결. ( 으응? )

self.index = try container.decodeIfPresent(Int.self, forKey: .index) ?? 0

 

  • index 값이 무슨 의미를 가지고, 왜 그냥 0으로 도배해도 괜찮은지는 모르겠음.
    해당 값이 무엇인지 어디에도 제공된 정보가 없음...

  • 안드로이드나 웹에서는 잘 되는 거 보면 예외처리가 되어있는 듯.

  • 1차적으로 해결은 했으나,
    위처럼 Pods 프로젝트를 수정할 경우, 새로 프로젝트를 pull할 경우 반영이 안될테니, ( Pods 프로젝트는 당연히 .gitignore )
    그냥 문제가 있는 lottie 파일 ( .json파일 )을 수정하기로.

  • 필수 값인 "ty"값을 찾아서, 그 앞에 모두 "ind":0, 을 붙혀주면서 해결.

 

수정 전

 

수정 후

 

직감적으로 했는데 잘 고쳐져서 너무나도 다행이던 트러블 슈팅!

Comments