swift 为什么URL总是nil?[副本]

hkmswyz6  于 2023-05-05  发布在  Swift
关注(0)|答案(3)|浏览(192)

此问题已在此处有答案

Non-latin characters Alamofire 4.0 .GET Request(1个答案)
22小时前关门了。
我想从我的应用程序打开苹果Map使用URL方案。

let url = URL(string: "http://maps.apple.com/?q=대한민국")

使用这个URL进行测试,但它总是为nil。
这是我猜测。

  1. URL必须只包含英语,数字和一些字符。
  2. url方案无法使用URL初始化。
    1.我的项目上有事情要做
    有没有人知道这件事或如何解决这个问题?
s3fp2yjn

s3fp2yjn1#

这里的各种答案中的编码都是正确的,但通常不应该在整个URL上使用.addingPercentEncoding。正如参数urlQueryAllowed所指出的,这种编码只适用于查询部分,而不适用于其他部分,如路径、主机或权限。
对于硬编码的URL,您可以手动编码,但如果您以编程方式构建URL,则应该使用URLComponents:

var components = URLComponents(string: "http://maps.apple.com/")!

components.queryItems = [
    URLQueryItem(name: "q", value: "대한민국")
]

// Or, if more convenient:
// components.query = "q=대한민국"

let url = components.url!

这确保了每个片段都被正确编码,并避免了在以编程方式构建URL时混乱的字符串插值。
作为addingPercentEncoding出错的一个例子,考虑一个IDN域,如Bücher。例如:

let urlString = "https://Bücher.example/?q=대한민국"
print(urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed))

// https://B%C3%BCcher.example/?q=%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD

这是不正确的。IDN域名必须使用Punycode编码,而不是percent-encoding。

var components = URLComponents(string: "http://Bücher.example/")!
components.query = "q=대한민국"
print(components.url!)

// http://xn--bcher-kva.example/?q=%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD
qyswt5oh

qyswt5oh2#

您必须对路径进行编码,因为它包含URL中不允许的字符:

let urlString = "http://maps.apple.com/?q=대한민국"
let encodedUrlString = urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
let url = URL(string: encodedUrlString!)
print(url)

输出:

http://maps.apple.com/?q=%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD
pbossiut

pbossiut3#

URL最初仅定义为ASCII。
w3.org
当你试图将一个包含非ascii字符的字符串转换为URL时,由于上述原因,它不能这样做。您需要以某种方式将其编码为%xx(UTF-8的十六进制值)格式。
由于非ascii字符在查询字符串中,因此您可以在Swift中使用以下代码执行此操作:

urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)

相关问题