「The Ultimate Guide to WKWebView」をSwiftUIで実装する #01 - Making a web view fill the screen -

最近入っていたプロジェクトでWebViewに関して本当に色々なタイプの実装をしました。
何年も改修を繰り返して様々な外部システムとの連携が必要だったということもあるでしょう。
色々ありましたが、自分のキャリア的には大きな影響を与えてくれました。（なぜかここで感謝）

とそんな時に
Hacking with Swiftで[「The Ultimate Guide to WKWebView」](https://www.hackingwithswift.com/articles/112/the-ultimate-guide-to-wkwebvie)という何やら良さげなページを発見。

見てみると、結構これやったな。
あ、他にもこんなことできるんだ、という学びになりました。

おさらいがてらそれを振り返りつつ、
**SwiftUIでちゃんとアプリとして動くところまで実装**してみました。

## 前提

私はUIKitの経験は少なく、SwiftUIの経験が長いかつ濃いです。
また自分の好みとしてもUIKitよりSwiftUIです。

このことからも推測できるとおり、**iOS開発に関してまだまだひよっこ**です。
もっと良い方法が見つかった、などあれば随時更新していきたいです。

またいきなりおいって感じですが、
**SwiftUIの機能としてWebView表示はサポートされていません**。:innocent:

なので、お決まり`UIViewRepresentable`を利用して、SwiftUIとUIKitを統合していく必要があります。

つまり**SwiftUIが標準でWebViewをサポートするようになれば、この記事は参考にならない可能性は大いにあります**。

ですが、今までのSwiftUIの感じからして、単純なWebView表示は近いうちにサポートされるようになるかもしれないですが、
今回参考にしている記事に載っているような**より応用的なことをしたい時、
SwiftUIの標準機能ですぐにそこまでサポートしてくれるかというと、そうではない気がします**。

また今回参考にした記事は、
こういうことをやりたいというユースケースごとにではどうやって実装するのか、という構成になっています。

個人的にはほーこういうユースケースもあるのか、それってどういう場合になるのか、と言ったことも一緒に考えたいので
他の人の役には立たなくても、今の私や未来の私の役に立ちそうなので、この記事を書いています。

## 目次

シリーズ化していこうと思うので、全体の目次を置いておきます。
リンクが貼られていないタイトルは、記事作成中または未作成のものになります。

|#|タイトル|
|------|-----------------|
|01|[Making a web view fill the screen](https://qiita.com/kamimi01/items/b4d6cbafa587831c1be0) <br> （WebViewを画面に表示する）|
|02|[Loading remote content](https://qiita.com/kamimi01/items/c889979964820d5f9fa2) <br> （リモートのコンテンツを読み込む）|
|03|[Loading local content](https://qiita.com/kamimi01/items/9cefe1e73ab5b88051c6) <br> （ローカルのコンテンツを読み込む）|
|04|[Loading HTML fragments](https://qiita.com/kamimi01/items/2f267b328f3f6158bc26) <br> （HTMLフラグメントの読み込み）|
|05|[Controlling which sites can be visited](https://qiita.com/kamimi01/items/7c01aed497108da35b5a) <br> （訪問可能なサイトの制御）|
|06|[Opening a link in the external browser](https://qiita.com/kamimi01/items/716dccb6f109ee50c900) <br> （外部ブラウザでリンクを開く）|
|07|[Monitoring page loads](https://qiita.com/kamimi01/items/33446e032822518cb7f7) <br> （ページの読み込みを監視する）|
|08|[Reading a web page’s title as it changes](https://qiita.com/kamimi01/items/7e0153ee68474a155b9a) <br> （Webページのタイトルの変化を読み取る）|
|09|[Reading pages the user has visited](https://qiita.com/kamimi01/items/f5f6c35a6a68726fa485) <br> （ユーザーが閲覧したページを読み取る）|
|10|[Injecting JavaScript into a page](https://qiita.com/kamimi01/items/6076081dc54e2b3d0abf) <br> （JavaScriptをページに注入する）|
|11|[Reading and deleting cookies](https://qiita.com/kamimi01/items/90139fe692ec988d28bb) <br> （cookieの読み取りと削除）|
|12|[Providing a custom user agent](https://qiita.com/kamimi01/items/5884330e315338df8ec0) <br> （カスタムUser Agentを提供する）|
|13|[Showing custom UI ](https://qiita.com/kamimi01/items/3315e4df0813eda75eeb)<br> （カスタムUIを表示する）|
|14|Snapshot part of the page <br> （ページの一部のスナップショットを撮る）|
|15|Detecting data <br> （データの探索）|

## 環境

【Xcode】13.1
【Swift】5.5
【iOS】15.0
【macOS】Big Sur バージョン 11.4

## 実現したいこと

では早速「Making a web view fill the screen （フルスクリーンのWebViewを作る）」からやっていきます。

今回やることは
とあるViewに、WebViewを表示する、というただそれだけです。

特別なことは特にやりません。
一応きちんとビルドしてアプリとして動くっぽいところまで実装したいので、「2. Loading remote content」の内容にも踏み込んではいます。

ただ、2の方は別途書きたいことがあるので、別記事で改めて書きます。

こんな感じのものができます。
ほんとシンプル

![](https://user-images.githubusercontent.com/47489629/151644327-fb9a03f9-9288-49ba-8ac2-fb6edf9b52a8.gif)

## 実現方法

Hacking with Swiftを見る限り、
UIKitだと数行で実装が済むっぽい・・・
がSwiftUIではUIKitとの統合という一手間が必要になります。

まずWebViewです。

`String`のURLを受け取ります。
それを`URL`型に変換して、
次に`URLRequest`型に変換し、
`load`の引数に入れます。

```swift:WebView.swift
import SwiftUI
import WebKit

struct WebView: UIViewRepresentable {
    let url: String
    
    func makeUIView(context: Context) -> WKWebView {
        return WKWebView()
    }
    
    func updateUIView(_ uiView: WKWebView, context: Context) {
        guard let url = URL(string: url) else {
            return
        }
        let request = URLRequest(url: url)
        uiView.load(request)
    }
}
```

このWebViewを、画面に表示させます。

```swift:ContentView.swift

struct ContentView: View {
    private let url = "https://www.apple.com"
    
    var body: some View {
        WebView(url: url)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
```

以上！

説明なさすぎかも？まあ一番最初の基礎部分なので、許してください。。 :pray:

コード全体はこちらにあげました。

https://github.com/kamimi01/TheUltimateGuidetoWKWebViewWithSwiftUI/tree/main/MakingAWebviewFillTheScreen

## 参考

- [SwiftUIでWebViewを使う](https://qiita.com/wiii_na/items/36123cf901839a8038e2)
- [The Ultimate Guide to WKWebView](https://www.hackingwithswift.com/articles/112/the-ultimate-guide-to-wkwebview)