Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Firebase
- Xcode
- stack
- Archive
- iOS16
- UIButton
- Realm
- Swift
- Git
- 웹뷰
- FLUTTER
- 개발자
- Session
- Apple
- github
- 한글
- Code
- Python
- IOS
- Notification
- appstore
- darkmode
- view
- MacOS
- rxswift
- SwiftUI
- error
- mac
- window
- JPA
Archives
- Today
- Total
EEYatHo 앱 깎는 이야기
Swift ) lottie keyNotFound error - EEYatHo iOS 본문
반응형
배경 설명
갑자기 특정 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, 을 붙혀주면서 해결.
수정 전
수정 후
직감적으로 했는데 잘 고쳐져서 너무나도 다행이던 트러블 슈팅!
'iOS, Swift' 카테고리의 다른 글
Swift ) UIImagePickerController 권한 필요없음 - EEYatHo iOS (0) | 2021.12.03 |
---|---|
Swift ) 한글 스캔 OCR 시도한 것들 정리 - EEYatHo iOS (0) | 2021.11.30 |
Swift ) IDFA (ADID) (광고식별자) - EEYatHo iOS (0) | 2021.11.19 |
Swift ) Realm List Migration - EEYatHo iOS (0) | 2021.11.14 |
Swift ) StackView backgroundColor - EEYatHo iOS (0) | 2021.11.03 |
Comments