SwiftUIでWebView表示しようとしたところエラーが発生。
Agenda
現象
Xcodeのシミュレーターで日本語を含むURLを読み込むと、以下のエラーが発生して強制的に落ちる。
Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
エラーが発生したソースコード
import SwiftUI
import WebKit
struct WebView: UIViewRepresentable {
let loadUrl: String
func makeUIView(context: Context) -> WKWebView {
return WKWebView()
}
func updateUIView(_ uiView: WKWebView, context: Context) {
uiView.load(URLRequest(url: URL(string: loadUrl)!))
}
}
struct WebView_Previews: PreviewProvider {
static var previews: some View {
WebView(loadUrl: "https://example.com/")
}
}
原因
URLに日本語が含まれていると強制的にnilになってしまうらしい。
対策
URLエンコードを行う。
具体的にはURLに .addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!
をつけてURLエンコード化する。
実装したソースコード
import SwiftUI
import WebKit
struct WebView: UIViewRepresentable {
let loadUrl: String
func makeUIView(context: Context) -> WKWebView {
return WKWebView()
}
func updateUIView(_ uiView: WKWebView, context: Context) {
let loadUrlEncoding = loadUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!
uiView.load(URLRequest(url: URL(string: loadUrlEncoding)!))
}
}
struct WebView_Previews: PreviewProvider {
static var previews: some View {
WebView(loadUrl: "https://example.com/")
}
}