我们有一个Today小部件,可以深入链接到该应用。当用户从主屏幕访问窗口小部件时,深层链接就可以正常工作。但是,当用户在设备锁定时访问窗口小部件时,或者当用户从屏幕顶部向下滑动时,链接会在Safari中打开。
我想知道是否还有其他人遇到过这个问题,如果可以,他们是如何解决的。
答案 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
}