如何在“小部件/今日扩展”上打开特定视图控制器,请单击

Asm*_*ita 4 widget today-extension swift3

我正在尝试在小部件click上打开特定的视图控制器,但无法打开它,我能够使用url模式打开应用程序,但是我想打开特定的视图控制器我该怎么做,这是使用open app的代码网址架构:

@IBAction func open_app(_ sender: Any) { extensionContext?.open(URL(string: "open://")! , completionHandler: nil) } 在按钮上单击,我正在使用url模式成功运行应用程序。但是现在我想在该点击上打开特定的视图控制器,我该怎么做?

PGD*_*Dev 7

根据您的要求,我创建了一个示例来使其正常工作。

1.首先在TodayViewController界面中,创建3个不同UIButtonstag值,并赋予它们的值以唯一地标识它们。 在此处输入图片说明

在这里,我给的标签为:1, 2, 3First, Second and Third UIButton

2.接下来,您需要编写代码以从Today Extension中打开您的Containing App。在TodayViewController创建@IBActionfor并将其连接到所有三个UIButtons

@IBAction func openAppController(_ sender: UIButton)
{
    if let url = URL(string: "open://\(sender.tag)")
    {
        self.extensionContext?.open(url, completionHandler: nil)
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,标记将添加到url方案中,以标识UIViewController需要在UIButton印刷时打开的内容。因此,该网址将类似于:open://1

3.包含应用程序中, URL Types需要输入URL Scheme,即

在此处输入图片说明

从上面的屏幕截图可以明显看出,无需为要从扩展名中打开的每个URL进行输入。URLs具有相同的url scheme条目只有一个

4.包含应用程序是由拓开了,你可以在手柄AppDelegate’s application(_ : url: sourceApplication: annotation: )的方法。在这里,您可以处理要打开哪个控制器,即

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool
{
    if url.scheme == "open"
    {
        switch url.host
        {
        case "1":
            //Open First View Controller

        case "2":
            //Open Second View Controller

        case "3":
            //Open Third View Controller

        default:
            break
        }
    }
    return true
}
Run Code Online (Sandbox Code Playgroud)

url.scheme标识URLie 的方案,openurl.host标识URL其中当前设置为的主机组件UIButton's tag value,您可以使用该主机组件唯一地标识UIButton按下了哪个组件以及相应地下一步该做什么。

有关Today Extensions的更多信息,可以参考:https : //hackernoon.com/app-extensions-and-today-extensions-widget-in-ios-10-e2d9fd9957a8

让我知道您是否仍然面临与此有关的任何问题。