来自锁定屏幕和通知中心的iOS Today小部件通用链接

时间:2018-10-22 18:52:05

标签: swift today-extension ios12 ios-universal-links

我们有一个Today小部件,可以深入链接到该应用。当用户从主屏幕访问窗口小部件时,深层链接就可以正常工作。但是,当用户在设备锁定时访问窗口小部件时,或者当用户从屏幕顶部向下滑动时,链接会在Safari中打开。

我想知道是否还有其他人遇到过这个问题,如果可以,他们是如何解决的。

1 个答案:

答案 0 :(得分:0)

这是我们遇到的解决方案(Swift 4.1)。我们需要支持一个自定义URL方案,以告诉iOS我们可以打开今日小部件中的链接。这使用了另一个UIApplication委托函数。除了实现func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool之外,我们还需要实现func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool

首先,在Info.plist中,我们在CFBUndleURLTypes下拥有受支持的方案。

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>todayWidgetScheme</string>
        </array>
    </dict>
</array>

然后,也在Info.plist中,我们还在LSApplicationQueriesSchemes下列出了该方案。

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>todayWidgetScheme</string>
</array>

接下来,从“今日”窗口小部件中打开链接时,将url方案设置为iOS公认的“今天”窗口小部件方案。

func openAppFromTodayWidget() {
    if let url = URL(string: "https://url.com") {
        var components = URLComponents(url: url, resolvingAgainstBaseURL: true)
        components?.scheme = "todayWidgetScheme"

        if let todayWidgetUrl = components?.url {
            extensionContext?.open(todayWidgetUrl)
        }
    }
}

最后,在AppDelegate.swift中,当iOS要求应用程序处理通用链接时,请设置原始网址方案

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    if url.scheme == "todayWidgetScheme" {
        var components = URLComponents(url: url, resolvingAgainstBaseURL: true)
        components?.scheme = "https"

        if let todayWidgetUrl = components?.url {
            // do your thing
            return true
        }
    }

    return false
}