문제
문제 1. LinkNavigation Push 처리 시 url을 매개변수로 넘겨 받는데, URL을 정상적으로 처리하지 못하는 문제 발생
원인
@Reducer
struct LinkDetailFeature {
@Dependency(\.swiftDataClient) var swiftDataClient
@Dependency(\.linkNavigator) var linkNavigator
@ObservableState
struct State {
...
}
enum Action {
...
/// 원문보기
case originalArticleTapped(URL)
}
var body: some ReducerOf<Self> {
Reduce { state, action in
switch action {
...
/// 원문보기
case .originalArticleTapped(let url):
linkNavigator.push(Route.originalArticle, url.absoluteString)
return .none
}
}
}
}
LinkDetailFeature에서는 '원문 보기' 버튼의 탭 이벤트를 감지하여 OriginalArticleView로 네비게이션(push)하는 로직을 구현했습니다. 이때, 화면 전환을 위해 라우팅 목적지와 데이터 바인딩에 필요한 item을 매개변수로 함께 전달하도록 구성했습니다.

OriginalArticleView에서는 WKWebView를 사용해서 웹페이지를 렌더링하고 있었는데, 어떠한 문제로 인해 WebView가 제대로 렌더링 되지 않고 있음을 확인했습니다.
크래시 로그를 분석해본 결과 WebKit -> JSCore -> CoreFoundation 순으로 스택이 이어지는데, 이는 WKWebView 내부 렌더링 또는 URL 로드 과정에서 발생한 크래시일 가능성이 높다고 판단하여 URL 로그를 찍어보았습니다.

디코딩 된 URL을 확인해 보니 Base64 -> 디코딩 -> 문자열 변환 과정에서 이스케이프 문자(\, ", /)가 남아있어 WebKit이 내부적으로 비정상적인 URL을 로드하려다가 크래시가 발생했음을 확인했습니다.
해결
guard let data = Data(base64Encoded: trimmedItem),
let decoded = String(data: data, encoding: .utf8)?
.replacingOccurrences(of: "\\/", with: "/")
.replacingOccurrences(of: "\"", with: ""),
let url = URL(string: decoded)
else {
return WrappingController(matchPath: matchPath) {
Text("Invalid URL")
}
}
Base64 디코딩 이후, 문자열 내의 불필요한 이스케이프 문자를 제거하도록 수정하였고, 이를 통해 유효한 URL 객체만 생성되어 WKWebView에 정상적으로 렌더링되도록 해결하였습니다.
'🔫 트러블슈팅' 카테고리의 다른 글
| [🔫트러블슈팅] 01. ModelContainer 충돌 문제 (0) | 2025.10.31 |
|---|