iOS Today Widget Универсальные ссылки с экрана блокировки и Центра уведомлений

У нас есть виджет сегодня для глубокой ссылки в приложение. Глубокие ссылки прекрасно работают, когда пользователь обращается к виджету с домашнего экрана. Однако, когда пользователь получает доступ к виджету, когда устройство заблокировано, или когда пользователь скользит вниз от верхней части экрана, ссылки открываются в Safari.

Мне было интересно, сталкивался ли кто-нибудь еще с этой проблемой, и если да, то как они ее решили.

1 ответ

Вот решение, с которым мы столкнулись (Swift 4.1). Нам нужно было поддерживать собственную схему URL, чтобы сообщить iOS, что мы можем открывать ссылки из виджета Today. При этом используется другая функция делегата 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>

Далее, при открытии ссылки из виджета Today, установите схему URL для iOS, распознаваемой сегодня WidgetScheme.

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 просит приложение обработать универсальную ссылку, установите исходную схему URL

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
}
Другие вопросы по тегам