不调用方法“ application:openURL:options:”

时间:2019-10-30 11:53:21

标签: ios swift ios13 custom-scheme-url

我正在尝试使用自定义方案从网页上打开我的应用程序。该应用已打开,但未调用以下方法:

func application(_ app: UIApplication, open url: URL, options [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    // This is not called
}

我的info.plist如下所示:

    <key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>MyApp</string>
            </array>
            <key>CFBundleURLName</key>
            <string>url here</string>
        </dict>
    </array>

该项目是使用Xcode 11.1创建的,我正在iOS 13上进行测试。

8 个答案:

答案 0 :(得分:8)

在场景委托中实施scene(_:openURLContexts:)

如果该网址启动了您的应用,则您将获得scene(_:willConnectTo:options:)且位于options中。

答案 1 :(得分:1)

我遇到了同样的问题,scene(_ scene:, continue userActivity:)scene(_ scene:, openURLContexts URLContexts:)都没有被呼叫。

当我检查传递给方法connectionOptions的{​​{1}}时,它进行了具有预期URL的用户活动。因此,我最终手动调用了该方法:

scene(_ scene:, willConnectTo session, options connectionOptions:)

答案 2 :(得分:0)

感谢@Matt,这就是我解决问题的方式。

在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);

}

答案 3 :(得分:0)

  

这是SceneDelegate.swift中的方法。适用于 iOS13

的Swift版本
@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)
    }
}

答案 4 :(得分:0)

使用最新的SDK,如果您不使用SceneDelegate,则可以正常工作。

如果使用的是SceneDelegate,则不会调用以下AppDelegate方法,因此无法处理登录。

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
}

这是因为(可以理解)将此方法推迟到SceneDelegate中的以下方法:

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
    ...
}

我可以确认适用于实现SceneDelegate的iOS 13应用程序的解决方案是:

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])        
}

答案 5 :(得分:0)

我遇到了一个问题,使用Safari浏览器快捷方式启动应用程序,多次调用openURLContexts。

std::vector<TextComponent>&

答案 6 :(得分:0)

iOS 14

MyApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate

    var body: some Scene {
        WindowGroup {
            RootView()
                .onOpenURL(perform: handleURL)
        }
    }

    func handleURL(_ url: URL) {

    }
}

答案 7 :(得分:-3)

Refer this apple documentation

如果您的实现从application:willFinishLaunchingWithOptions:和application:didFinishLaunchingWithOptions:方法返回否,则不调用此方法。 (如果仅实现这两种方法之一,则其返回值确定是否调用此方法。)如果您的应用实现了applicationDidFinishLaunching:方法,而不是application:didFinishLaunchingWithOptions :,则调用此方法以在应用程序打开后打开指定的URL。已初始化。 如果在您的应用暂停或在后台运行时到达URL,则系统会在调用此方法之前将您的应用移到前台。 此委派方法没有等效的通知。