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
  }