iOS Today Widget Универсальные ссылки с экрана блокировки и Центра уведомлений - PullRequest
0 голосов
/ 22 октября 2018

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

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

1 Ответ

0 голосов
/ 25 октября 2018

Вот решение, с которым мы столкнулись (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>

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

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...