swift 未调用方法“scene(_:openURLContexts:)”

ioekq8ef  于 12个月前  发布在  Swift
关注(0)|答案(5)|浏览(135)

在info.plist文件中,我成功地配置了URL IdentifierURL Scheme。我还可以使用自定义URL打开应用程序。问题是当应用程序第一次启动时,方法

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

字符串
不会被召唤。
我有一些依赖于上述方法的功能。所以当应用程序第一次启动时,我无法在应用程序中看到任何内容。
我还在方法中添加了代码

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        
        guard let _ = (scene as? UIWindowScene) else { return }
        
        let url = connectionOptions.urlContexts.first?.url
        
    }


但是我在这里得到的URL是nil。
然而,如果我的应用程序处于后台模式,我点击URL,那么上面的方法调用成功,依赖的功能工作正常。下面是我在sceneDelegate中的scene(_:openURLContexts:)方法的代码。

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>){
        let url = URLContexts.first?.url
        let urlString: String = url!.absoluteString
        
        if let urlComponents = URLComponents(string: urlString),let queryItems = urlComponents.queryItems {
            queryParams = queryItems
        } else {
            print("invalid url")
        }
        
        guard let windowScene = (scene as? UIWindowScene) else { return }

        self.window = UIWindow(windowScene: windowScene)
        //self.window =  UIWindow(frame: UIScreen.main.bounds)

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        guard let rootVC = storyboard.instantiateViewController(identifier: "LocationViewIdentifier") as? UIViewController else {
            print("ViewController not found")
            return
        }
        let rootNC = UINavigationController(rootViewController: rootVC)
        self.window?.rootViewController = rootNC
        self.window?.makeKeyAndVisible()
    }


谁能告诉我为什么第一次上面的方法不调用?

mm9b1k5b

mm9b1k5b1#

也许这会帮助你的情况。

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
       
    let urlinfo = connectionOptions.urlContexts
    let url = urlinfo.first?.url as! NSURL
  
}

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext*h>) {
       
    let url = URLContexts.first!.url as NSURL

}

字符串

更新于2021年6月17日

如果你想使用Deeplink和Universal Link,这是我的方法。

//Deeplink or Universial Link Open when app is start.
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
                
        // Universial link Open
        if let userActivity = connectionOptions.userActivities.first,
           userActivity.activityType == NSUserActivityTypeBrowsingWeb,
           let urlinfo = userActivity.webpageURL{
            
            print ("Universial Link Open at SceneDelegate on App Start ::::::: \(urlinfo)")
            
        }
        
        //deeplink Open
        if connectionOptions.urlContexts.first?.url != nil {
          let urlinfo = connectionOptions.urlContexts.first?.url
            
            print ("Deeplink Open at SceneDelegate on App Start ::::::: \(String(describing: urlinfo))")

          
        }
        
        guard let _ = (scene as? UIWindowScene) else { return }
    }

    // Universial link Open when app is onPause
    func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
        
        if userActivity.activityType == NSUserActivityTypeBrowsingWeb,
            let urlinfo = userActivity.webpageURL{
            
            print ("Universial Link Open at SceneDelegate on App Pause  ::::::: \(urlinfo)")
            
        }
    }
    
    // Deeplink Open when app in onPause
    func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
        
        let urlinfo = URLContexts.first?.url
        print ("Deeplink Open on SceneDelegate at App Pause :::::::: \(String(describing: urlinfo))")

    }


谢谢

velaa5lx

velaa5lx2#

我认为the Apple docs解释得最清楚,即,
如果您的应用已选择进入场景,并且您的应用未运行,则系统会在启动后将URL传递给scene(_:willConnectTo:options:)委托方法,并在您的应用在运行或挂起在内存中时打开URL时将URL传递给scene(_:openURLContexts:)
因此,它只会在您的应用在运行或仅在内存中挂起时打开URL时调用您的scene(_:openURLContexts:)(即问题中具有此签名的func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>))。
相反,当应用程序第一次启动时,它调用scene(_:willConnectTo:options:)

xyhw6mcr

xyhw6mcr3#

我也遇到了同样的问题,方法scene(_ scene:, continue userActivity:)只在应用程序打开时被调用。
当我检查传递给scene(_ scene:, willConnectTo session, options connectionOptions:)方法的connectionOptions时,它有一个带有预期URL的用户活动。所以,我最终手动调用了第一个方法:

func scene(_ scene: UIScene,
           willConnectTo session: UISceneSession,
           options connectionOptions: UIScene.ConnectionOptions) {

    if let userActivity = connectionOptions.userActivities.first {
        self.scene(scene, continue: userActivity)
    }
}

字符串

ctehm74n

ctehm74n4#

我的情况是,从Facebook身份验证返回后,SceneDelegate中提供的openURL extra函数没有被调用。
解决方案是使用

.onOpenURL { (url) in
                ApplicationDelegate.shared.application(
                    UIApplication.shared,
                    open: url,
                    sourceApplication: nil,
                    annotation: [UIApplication.OpenURLOptionsKey.annotation]
                )
            }

字符串
在我的额外应用程序委托中调用函数,然后它就正常工作了。

zxlwwiss

zxlwwiss5#

当您的应用包含 * 多个 * UIWindowSceneDelegate实现时的重要提示:
必须在 eachUIWindowSceneDelegate实现中实现openURLContexts,因为此委托方法将定向到当前活动的场景。

相关问题