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