从小部件点击开始 ViewController 的问题

Problems starting ViewController from a widget click

我有一个小部件,希望在单击它时打开一个特定的 ViewController。我已经阅读了有关该主题的所有文档和问题,但无法弄清楚为什么它不起作用。单击小部件时,它总是打开默认的 ViewController.

这是 WidgetView 的代码。

struct WidgetAdapter : View {

    let entry: TimeLine.Entry
    @Environment(\.widgetFamily) var family

    @ViewBuilder
    var body: some View {
        switch family {
        case .systemSmall:
            SmallView(...).widgetURL(URL(string: "fcv://open_activity"))
        case .systemMedium:
            MediumView(...).widgetURL(URL(string: "fcv://open_activity"))
        default:
            LargeView(...).widgetURL(URL(string: "fcv://open_activity"))
        }
    }
}

这里是管理 URLs 的 AppDelegate 方法。

func application(_ application: UIApplication, open
                    url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool{ 
    if url.scheme == "fcv"{
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let vc = storyboard.instantiateViewController(withIdentifier: "WidgetActivity") as! WidgetActivityController
        self.window?.rootViewController = vc
        self.window?.makeKeyAndVisible()
    }
    return true
}

我还尝试为 SceneDelegate 实现各自的方法,我将 url 方案添加到项目信息中的 URL 类型,我将 LSApplicationQueriesSchemes 项目添加到 info.plist,使用 Link 而不是 .widgetURL... 而且它甚至一次都不起作用。我还认为没有调用 AppDelegate 中的方法,但是,我检查了可能发生的情况,但没有发生。

如有任何帮助,我们将不胜感激。

我通过找到当前 rootViewController 并推送我需要的视图解决了同样的问题:

let rootViewController = window!.rootViewController as! UINavigationController
let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)let profileViewController = mainStoryboard.instantiateViewController(withIdentifier: "MainVC") as! CombinedMainVC
rootViewController.pushViewController(profileViewController, animated: false)

在我的情况下总是 UINavigationController,所以我 push 一个新的 VC,在你的情况下你可以 present 它。

我在AppDelegate中使用了相同的方法,因此您的if语句可能有问题。您在哪里为小部件 URL 设置方案?也许你可以检查 URL string:

if url.absoluteString.prefix(3) == "fcv" { }