【问题标题】:Can't create URL from string with '#' in the middle无法从中间带有“#”的字符串创建 URL
【发布时间】:2018-04-14 05:10:33
【问题描述】:

问题通过代码解释。

    let u = "tel://*111*11111111111#" //Works perfectly on iOS11 and later
    let u = "tel://*111#11111111111#" //Doesn't work, Can't create URL

    let app = UIApplication.shared
    if let url = URL(string:u) {
        if app.canOpenURL(url) {
            app.open(url, options: [:], completionHandler: { (finished) in 
            })
        }
    }

** 如果我对字符串进行编码,那么canOpenURL() 会失败!

【问题讨论】:

标签: swift ios11 tel


【解决方案1】:

只需使用URLComponents。自动为您和所有内容处理百分比转义。

var comps = URLComponents()

comps.scheme = "tel"
comps.host = "*111#11111111111#"

print(comps.url!) // prints "tel://*111%2311111111111%23"

【讨论】:

    【解决方案2】:

    问题已修复

    数字应单独编码,不带tel://

    let u = "tel://*111#11111111111#"
    if let encoded = u.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) {
        let u = "tel://\(encoded)"
        if let url = URL(string:u) {
            if app.canOpenURL(url) {
                app.open(url, options: [:], completionHandler: { (finished) in
                    
                })
            }
        }
    }
    

    【讨论】:

    • 即使您正在对哈希进行百分比转义,调用是否有效?最终到达网址将是 tel://tel%3A%2F%2F*111%2311111111111%23
    • 是的,呼叫提示自动解码了 url
    • IMO,URLComponents 是一种更简单、更干净的方法。 URLComponents 也是最新的,因为它符合 RFC 3986,不像 URL(string:) 文档声明符合旧 RFC。
    • 为什么u的初始值包含tel://?只需编码实际数字,而不是方案。并且tel URL 不使用//
    猜你喜欢
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    相关资源
    最近更新 更多