Deep link URL Scheme 不调用任何函数(swift)
Deep link URL Scheme doesn't call any function(swift)
我实施深度 link 是 iOS。我已经在 Project-Setting->Info->Url 类型中配置了 URL Scheme
URL 方案:洗车 role:Viewer
当我键入 carwash://something 时,浏览器要求打开应用程序,但在我处理的应用程序中没有调用任何应该发生的操作。
苹果文档说你应该在 AppDelegate 中覆盖 application(open url) 但深度 link dosent 调用它并且应用程序在最后状态打开
application:openURL:options:' 未被调用
这是我的代码,不起作用
func application(_ app: UIApplication, open url: URL,
options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
fatalError()
}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
if let url = launchOptions?[UIApplication.LaunchOptionsKey.url] as? URL {
/// some
fatalError()
}
GMSServices.provideAPIKey("")
return true
}
swift 5
模拟器:iOS 13
您应该在 Info.plist 文件
中配置深层链接
示例:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>CFBundleURLName</key>
<string>carwash</string> // your identifier
<key>CFBundleURLSchemes</key>
<array>
<string>carwash</string> // schema
</array>
</dict>
</array>
你应该使用application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool
请注意,您的方法
中没有 return 语句
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
print("Got from URL: \(url)"
return true
}
模拟器中的链接最好通过终端完成
xcrun simctl openurl booted “carwasher://deeplink”
经过几天与方案 url 的斗争,我终于找到了答案。
我的模拟器的 iOS 版本是 13 。在 iOS 13 UIApplication 中,打开 url 没有接到电话(至少在我的情况下可能)
您应该重写 SceneDelegate 中的以下函数,该函数在 iOS 13 中可用:
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
if let url = URLContexts.first?.url{
print(url)
}
}
已编辑:
如果用户在您的应用未 运行 时点击 link,您将不会响应它
您必须实施 scene(_:willConnectTo:options:)
来检测选项中的 URLContext 并处理它。
对我而言 iOS13+ 以下作品(在我的 SceneDelegate
中):
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// Set up everything you need
// ...
// Handle deep link on cold start
if let url = connectionOptions.userActivities.first?.webpageURL {
handle(url: url)
}
}
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
if let url = userActivity.webpageURL {
// Handle deep link when the app is running
handle(url: url)
}
}
在iOS 13+或场景委托中有两个方法会调用,willPerformHTTPRedirection方法肯定会调用。
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
if userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL {
}
}
}
func urlSession(_ session: URLSession, task: URLSessionTask, willPerformHTTPRedirection response: HTTPURLResponse, newRequest request: URLRequest, completionHandler: @escaping (URLRequest?) -> Swift.Void) {
if let url = request.url {
guard let detailDictionary = String.queryParameters(from: url) else { return }
}
}
}
通过这个函数解析url:
static func queryParameters(from url: URL) -> [String: String]? {
let urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: false)
var queryParams: [String : String]? = nil
if let components = urlComponents?.queryItems {
queryParams = [String: String]()
for queryItem in components {
if queryItem.value == nil {
continue
}
queryParams?[queryItem.name] = queryItem.value
}
}
return queryParams
}
我实施深度 link 是 iOS。我已经在 Project-Setting->Info->Url 类型中配置了 URL Scheme URL 方案:洗车 role:Viewer
当我键入 carwash://something 时,浏览器要求打开应用程序,但在我处理的应用程序中没有调用任何应该发生的操作。
苹果文档说你应该在 AppDelegate 中覆盖 application(open url) 但深度 link dosent 调用它并且应用程序在最后状态打开
application:openURL:options:' 未被调用
这是我的代码,不起作用
func application(_ app: UIApplication, open url: URL,
options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
fatalError()
}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
if let url = launchOptions?[UIApplication.LaunchOptionsKey.url] as? URL {
/// some
fatalError()
}
GMSServices.provideAPIKey("")
return true
}
swift 5 模拟器:iOS 13
您应该在 Info.plist 文件
中配置深层链接示例:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>CFBundleURLName</key>
<string>carwash</string> // your identifier
<key>CFBundleURLSchemes</key>
<array>
<string>carwash</string> // schema
</array>
</dict>
</array>
你应该使用application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool
请注意,您的方法
中没有 return 语句func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
print("Got from URL: \(url)"
return true
}
模拟器中的链接最好通过终端完成
xcrun simctl openurl booted “carwasher://deeplink”
经过几天与方案 url 的斗争,我终于找到了答案。 我的模拟器的 iOS 版本是 13 。在 iOS 13 UIApplication 中,打开 url 没有接到电话(至少在我的情况下可能)
您应该重写 SceneDelegate 中的以下函数,该函数在 iOS 13 中可用:
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
if let url = URLContexts.first?.url{
print(url)
}
}
已编辑: 如果用户在您的应用未 运行 时点击 link,您将不会响应它
您必须实施 scene(_:willConnectTo:options:)
来检测选项中的 URLContext 并处理它。
对我而言 iOS13+ 以下作品(在我的 SceneDelegate
中):
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// Set up everything you need
// ...
// Handle deep link on cold start
if let url = connectionOptions.userActivities.first?.webpageURL {
handle(url: url)
}
}
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
if let url = userActivity.webpageURL {
// Handle deep link when the app is running
handle(url: url)
}
}
在iOS 13+或场景委托中有两个方法会调用,willPerformHTTPRedirection方法肯定会调用。
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
if userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL {
}
}
}
func urlSession(_ session: URLSession, task: URLSessionTask, willPerformHTTPRedirection response: HTTPURLResponse, newRequest request: URLRequest, completionHandler: @escaping (URLRequest?) -> Swift.Void) {
if let url = request.url {
guard let detailDictionary = String.queryParameters(from: url) else { return }
}
}
}
通过这个函数解析url:
static func queryParameters(from url: URL) -> [String: String]? {
let urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: false)
var queryParams: [String : String]? = nil
if let components = urlComponents?.queryItems {
queryParams = [String: String]()
for queryItem in components {
if queryItem.value == nil {
continue
}
queryParams?[queryItem.name] = queryItem.value
}
}
return queryParams
}