【SwiftUI】ディープリンクのQRを読み込んで目的の動作をさせる方法【ディープリンク】

# はじめに
私はSwiftUIでアプリを開発しています。SwiftUIに関する記事数は多いとはいえ、増やしていく必要があると思います（戒め）。今回この記事でご紹介する*ディープリンク*もSwiftUIの記事が少なく多くの記事を参考にして完成させました。私がディープリンクを使ってアプリに遷移するまでの流れをブログにまとめましたのでぜひご覧ください。

# 環境
* MacBook Pro 2019 15インチ
* Intel corei7 9th
* RAM:16GB Storage:256GB
* Xcode:Ver14.2
* MacOS 13.2.1
# この記事を読むとできるようになること
`
team-hoge://app/share?who=Mattchan&twitter=_mat&github=mat%instagram=mat
`
上のようなリンクがあった場合、以下のようにひとつずつ値を取り出すことができるようになります。
ホスト名の部分だと
* scheme : team-hoge
* host : app
クエリの部分だと
* key = twitter
* value = _mat
みたいな感じで。

それではやっていきましょう！

# まずはXCodeでディープリンクを有効にする
![スクリーンショット 2023-02-20 21.09.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/710848/5bdddd9f-408c-e698-471f-550082cf7155.png)
まずは手順の通りにXcodeを設定させてください。URL-Schemesを設定させてください。
> Schemesとは「http://」とか「ftp://」とかのことです

そして設定したら**ビルド&インストール**してください。インストールが完了した段階でスマホ本体とアプリが結びつき、特定のリンクを踏んだときにアプリを開く画面に誘導されるように自動的に設定されます。つまり、QRからURLを開いたときに自動的にアプリが起動する仕組みを作ることができたことになります。
![noname.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/710848/b59ff9fb-4d28-4987-ff2e-778bf5194d30.png)
こうなればOKです。僕はサンプルでCameraQRというプロジェクトを作っているので『CameraQR』というアプリ名が表示されましたね。

# プログラムを書く 
## #1URLを取り出す編
SwiftUIでQRを取り出すには以下の方法が良いかと思われます。
```CameraQR_App.swift
@main
struct CameraQR: App {
    var body: some Scene {
        WindowGroup {
            NavigationView{
                ContentView()
                    .onOpenURL(perform: { url in
                    let urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: true)
                   //あとでここからのプログラムを書きます。
                }
            }
        }
    }
}
```
### プログラムの説明
* URLComponentsとはURLを解析できるようにするツールのことです。このの恩恵は**あとで感じられるでしょう**
* resolvingAgainstBaseURLとは、Trueの場合解析前に元のURLをそのベースURLに対して解決します。Falseの場合は、文字列部分がそのまま使用されます。

## #2URLをかんたんに取り出して分類する編
### URLComponentsの具体的な恩恵
公式ドキュメントを読むとかなり複数ありますが、今回はよく使う＆今回の記事で使うものをご紹介します。
`
team-hoge://app/share?who=Mattchan&twitter=_mat&github=mat%instagram=mat
`

```CameraQR_App.swift
//あとでここからのプログラムを書きます
    print("url は \(url.absoluteString)")
    print("scheme は \(url.scheme!)") //team-hoge
    print("host は \(url.host!)") //app
    //ここからしたも書きます##
```
今回はwho,twitter,github,instagramなどさまざまなクエリがあります。これを一個ずつ取り出しちゃいましょう！

```CameraQR_APp.swift
//ここからしたも書きます##
if let queryItems = urlComponents?.queryItems {
    for queryItem in queryItems {
        print("\(queryItem.name): \(queryItem.value ?? "")")
```
``who:Mattchan`` ``twitter:_mat`` ``github:mat``のようにprintで出力されるはずです。
てな感じで取り出すことができます。このようにqueryItemsは配列で保存されているので配列のindex指定をして取り出すことも可能です。
URLの他の要素を取り出したい場合は以下の『URLComponents』のドキュメントを参照してください

https://developer.apple.com/documentation/foundation/urlcomponents


# さいごに
実はディープリンクは **HTTPS接続するので安全（らしい）**。QRコードや直接リンクをアプリ同士で通信する場合はこの方法を使った方が良いらしいです。
今回の記事はいかがだったでしょうか。基本的に公式ドキュメント読んで記事を書いたので間違っていないと思います（多分）。ディープリンク、初めてアプリに実装してみましたがこんな方法があったのかとあっけに取られました。それではまた記事を更新するときまでさよなら。

この記事に関して間違いがございましたら遠慮なくお知らせください。よろしくお願いいたします。



### 参考文献

https://developer.apple.com/documentation/swiftui/environmentvalues/openurl
https://developer.apple.com/documentation/foundation/nsurlcomponents/1416476-init
https://developer.apple.com/documentation/foundation/url
https://developer.apple.com/documentation/foundation/urlcomponents

https://zenn.dev/usk2000/articles/cc8184ed619da3b37b02
https://qiita.com/Riscait/items/3a1c5c0f214d4e9b4e52
https://dev.classmethod.jp/articles/ios-custom-url-scheme/