read
UIScene
was introduced in iOS 13, and it replaced many functionalities of AppDelegate
.
If you use UIScene
, then the old way of using application(_:open:options:)
in AppDelegate
will NOT work anymore.
1. Basic setup
To handle deeplink, the Info.plist must have the CFBundleURLTypes
key added. In the example, we will have our app support a myschema://
deeplink.
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>myschema</string>
</array>
</dict>
</array>
2. Handle when app is running
In SceneDelegate
, add the following method:
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
for context in URLContexts {
// Your method to handle the deeplink url
handleDeepLink(context.url)
}
}
Note: There can be multiple URLs. The delegate method provides a set of UIOpenURLContext
. We are only interested in only the url
. There is also an options
in the context.
3. Handle cold start
When the app is not yet running, you need to handle in scene(_:willConnectTo:options:)
instead.
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// The typical window set up
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = MainViewController()
self.window = window
window.makeKeyAndVisible()
}
for context in connectionOptions.urlContexts {
handleDeepLink(context.url)
}
}
The code is similar, and again we use the same handleDeepLink()
.