'Method 'application:openURL:options:' is not called
I'm trying to open my app from a web page using custom schemes. The app is opened but the following method is not called:
func application(_ app: UIApplication, open url: URL, options [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
// This is not called
}
My info.plist
looks like the following:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>MyApp</string>
</array>
<key>CFBundleURLName</key>
<string>url here</string>
</dict>
</array>
The project is created with Xcode 11.1, and I'm testing on iOS 13.
Solution 1:[1]
Implement scene(_:openURLContexts:)
in your scene delegate.
If the URL launches your app, you will get scene(_:willConnectTo:options:)
instead and it’s in the options
.
Solution 2:[2]
Here is the method in SceneDelegate.swift. Swift version For iOS13
@available(iOS 13.0, *)
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
if let url = URLContexts.first?.url {
// Handle URL
WXApi.handleOpen(url, delegate: AppDelegate.shared)
}
}
Solution 3:[3]
With the latest SDK, this does work fine if you are at NOT using SceneDelegate.
If you are using sceneDelegate the the following AppDelegate method is not called and therefore the login cannot be handled.
func application(_ application: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
let handled = ApplicationDelegate.shared.application(
application,
open: url,
sourceApplication: options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String,
annotation: options[UIApplication.OpenURLOptionsKey.annotation])
return handled
}
This is because, this method is (understandably) deferred to the following method in the SceneDelegate:
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
...
}
The solution which I can confirm as working for iOS 13 applications implementing a SceneDelegate is:
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
guard let url = URLContexts.first?.url else {
return
}
let _ = ApplicationDelegate.shared.application(
UIApplication.shared,
open: url,
sourceApplication: nil,
annotation: [UIApplication.OpenURLOptionsKey.annotation])
}
Solution 4:[4]
Thanks to @Matt there This is how I solve the problem.
on SceneDelegate.m
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions { NSURL *url = connectionOptions.URLContexts.allObjects.firstObject.URL; NSLog(@"When app is not on memory ::::: %@",url); } ? - (void)scene:(UIScene *)scene openURLContexts:(NSSet *)URLContexts { NSURL *url = URLContexts.allObjects.firstObject.URL; NSLog(@"When app is on memory ::::: %@",url); }
Solution 5:[5]
iOS 14 and above
For SwiftUI apps
Note: This method handles the reception of Universal Links
public func onOpenURL(perform action: @escaping (URL) -> ()) -> some View
@main
MyApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup {
RootView()
.onOpenURL(perform: handleURL)
}
}
func handleURL(_ url: URL) {
}
}
Solution 6:[6]
I had the same problem, and neither scene(_ scene:, continue userActivity:)
nor scene(_ scene:, openURLContexts URLContexts:)
was called.
When I checked the connectionOptions
passed to the method scene(_ scene:, willConnectTo session, options connectionOptions:)
it had a user activity with the expected URL. So, I ended up calling the method manually:
func scene(_ scene: UIScene,
willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions) {
if let userActivity = connectionOptions.userActivities.first {
self.scene(scene, continue: userActivity)
}
}
Solution 7:[7]
I encountered a problem, using safari shortcut to start the application, openURLContexts callback multiple times.
2019-12-09 18:33:41.257088+0800 OCTEST[5019:1468254] openURLContextsopenURLContexts {(
<UIOpenURLContext: 0x2805a71c0; URL: appoctest://action=123123123; options: <UISceneOpenURLOptions: 0x280bd4750; sourceApp: (null); annotation: (null); openInPlace: NO>>
)}
2019-12-09 18:33:42.022132+0800 OCTEST[5019:1468254] openURLContextsopenURLContexts {(
<UIOpenURLContext: 0x2805a6d40; URL: appoctest://action=123123123; options: <UISceneOpenURLOptions: 0x280bd6f70; sourceApp: (null); annotation: (null); openInPlace: NO>>
)}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 | |
Solution 3 | Sagar Patel |
Solution 4 | Peterworks |
Solution 5 | Mike.R |
Solution 6 | Hejazi |
Solution 7 | Sheldon |