如何在iOS中使用tel:并包含*或#符号?

26

我想使用带有 * 的 tel url 在 iPhone 上发起电话呼叫。它能够正确地打开呼叫对话框,但是当您点击呼叫时,会回到 Safari。

<a href="tel:123*12">Test</a>
4个回答

33
这篇来自苹果的文档 (点击链接可查看) 可能会对您有所帮助:
为了防止用户恶意重定向电话或更改电话或帐户的行为,电话应用程序支持tel方案中的大多数特殊字符,但并非全部。具体而言,如果URL包含*或#字符,则电话应用程序不会尝试拨打相应的电话号码。
更新(2018年1月2日):此处提到的信息可能已过时。如果Apple在其新的SDK中放宽了这些规则,请参考最新文档。请参考Husam的回答。

1
iOS 11允许拨打*#,请在此处阅读我的答案https://dev59.com/_W445IYBdhLWcg3w3N2z#47062700。 - Husam

11

iOS11 现在允许我们使用 * 或者 # 来拨打电话号码。


Swift 代码示例

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

                })
                return
            }
        }
    }

如何解决在使用iOS11、Xcode 9.2和Swift 4.0.3时,无法拨打带有#和*的电话号码的问题? - leanne
谢谢,Husam!我正在对整个字符串(tel://11112345#)进行编码。关键是只对号码进行编码,而不是tel://前缀。 - leanne

5
批准的答案不正确,至少现在不正确了。我已经测试了网页和应用程序,能够使用特殊字符#*拨号。但是,如果您希望在任何情况下使用这些字符,您需要对它们进行编码。
在HTML中,#变为%23,而*不需要转义。
如果使用Swift,您可以使用此函数对链接进行编码并从应用程序中调用它:
//number format example (commas are pauses): 123-456-7890,,555#,1234
fileprivate func callNumber(_ number: String) {
    let dialString = "telprompt://" + number
    if let escapedDialString = dialString.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) {
      if let dialURL = URL(string: escapedDialString) {
        UIApplication.shared.openURL(dialURL)
      }
    }
  }

我们能否从我的应用程序中打开拨号键盘,例如*123456#这样的字符串?我已经尝试了上面的答案,但它们都不起作用。请帮帮我,这非常紧急。 - Akshada-Systematix
请参考@Husam的答案。Husam的示例代码确实适用于iOS 11。诀窍是仅对数字部分进行编码,而不是tel://部分。(还要注意,现在不再需要使用telprompt://来获取呼叫确认提示。tel://现在也可以做到同样的效果。) - leanne
我认为你只需要使用 .open() 而不是 .openURL。 - Jason

0

如果您想在“tel”类型的href中添加*,则需要使用utf-8编码版本 - %2A

参考:W3

例如:

<a href="tel:%2A1234"> Phone me <a/>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接