Introduction
何の因果か Swift のモバイルアプリの解析と DeepLink の検証をすることになった。
そんな中、DeepLink の実装の一つである Universal Link を実装し、その処理をハンドリングする処理を実装していたが、このハンドリングが動かない。
通常、AppDelegate クラス内で下記のようにすれば Universal Link から呼ばれた際に、処理に介入できる。
Swift 5 以前なら
1 | @main |
Swift 5 なら
1 | @main |
しかし、ブレークポイントに停止しない。
何故?
How to resolve?
iOS 13 空サポートされた UIScene API が原因。
詳細は省くが、Xcode 11 から、この UIScene API のライフサイクルを使用したものがデフォルトテンプレートになってしまっている。
そのため、前述の ApoDegate に追加しメソッドが無視されてしまう。
Universal Link のハンドリングを行うには、
- UIScene API を無効にする
- UIScene API に基づいた実装を行う
という選択肢がある。
UIScene API を無効にする
1. Info.plist の修正
UIApplicationSceneManifest を削除する
1 | <?xml version="1.0" encoding="UTF-8"?> |
2. SceneDelegate.swift の削除
SceneDelegate.swift をプロジェクトから削除してファイルも削除
3. SceneDelegate.swift の削除
AppDelegate に記述されている UISceneSession 周りの処理を削除し、var window: UIWindow?
を追加する。
1 | import UIKit |
UIScene API に基づいた実装を行う
こちらのシンプルだろう。
1 | class SceneDelegate: UIResponder, UIWindowSceneDelegate { |
前者はアプリがバックグラウンドで起動中、後者は新規にアプリが起動するときを制御する。