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
}