【问题标题】:How to parse URL with # in Swift?如何在 Swift 中使用 # 解析 URL?
【发布时间】:2021-03-02 02:35:00
【问题描述】:

假设,我有以下 URL:https://something.com/room/order/12345555/product/543333?is_correct=true。这是一种深度链接,我应该解析它的参数并显示一些 ViewController。我对 12345555、543333 和 true 等值感兴趣。其实很容易得到这些参数。

为了得到 12345555 或 543333,我们可以使用返回 ["/", "room", "order", "12345555", "product", "543333"] 的 URL 的 pathComponents。要获取查询项(is_correct: true),我们可以使用 URLComponents。一切都清晰而简单。

但假设我的链接包含# 作为路径https://something.com/room/#/order/12345555/product/543333?is_correct=true。现在,对于这个链接,pathComponents 只返回["/", "room"] 忽略其他所有内容。当然,查询参数也有问题。

为什么# 符号会如此影响?我该如何解决问题?我应该用某些东西替换# 还是 Swift 中的URL 包含一些辅助方法?谢谢。

【问题讨论】:

  • # 符号代表URL fragment
  • 你的意思是如果我调用url.fragment,它会返回#之后的所有内容?
  • 问题是url.fragment返回字符串,基本上你不能使用像pathComponentsURLComponents这样方便的东西
  • 您是否正在处理room/#/orderroom/order 可以或多或少互换使用的情况?如果是这样的话,.replacingOccurrences(of: "/#/", with: "/") 可能是转型的合理第一步。否则,您可以执行let fragmentUrl = URL(string: url.fragment!, relativeTo: url)! 之类的操作来获取# 之后的内容

标签: ios swift url nsurl


【解决方案1】:

您遇到的问题是 # 不是路径的一部分,而是引入了 URL 的新组件,存储在 url.fragment 中。这类似于如果您有https://example.com/foo/?test=/bar?test= 不是路径组件,而是查询的开头。

您可以采取两种方法。

如果 https://something.com/room/order/12345555/product/543333?is_correct=truehttps://something.com/room/#/order/12345555/product/543333?is_correct=true 可以互换使用,因为在浏览器中查看任一页面都会使您进入同一页面,您可以在流程中进行清理:

var rawUrl = ...
var sanitizedUrl = url.replacingOccurrences(of: "/#/", with: "/")
var url = URL(string: url)

您进行多少消毒取决于您的应用程序。可能你只想做(of: "/room/#/", with: "/room/")

另一个选择,如果你知道你的片段总是看起来像一个部分 URL,那么将片段传递给URL

let url = URL(string: rawUrl)!
let fragmentUrl = URL(string: url.fragment!, relativeTo: url)!

let fullPathComponents = url.pathComponents + fragmentUrl.pathComponents[1...];
var query = fragmentUrl.query

上述方法产生:["/", "room", "order", "12345555", "product", "543333"] 用于连接的 URL。

您使用哪种方法以及进行多少清理取决于您的用例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-14
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多