我需要从应用程序拨打电话,到目前为止它正在工作。该号码由两个数字组成:电话号码和密码后跟密码标签。 但有些用户需要在数字的末尾添加双重#Hottag标签,并在应用程序立即调用该网址时崩溃:
UIApplication.sharedApplication().openURL(NSURL (string: "tel//:1111111,,222##"))
使用单个主题标签可以正常工作,并且可以在设备已经拨号后在键盘上按下#标签。我试图附加ASCII表 - 十六进制数,23(表示#) - 它没有帮助。
修改
我找到了here:
let encodedHost =
numberToDial.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())
确实交换了这样的主题标签:
但是当试图拨打这个号码(NSURL)时,该应用仍会崩溃。如何在URL的末尾仍然有双重#标签,而不是让应用程序崩溃?
答案 0 :(得分:2)
我认为您的问题的答案在文档中。
防止用户恶意重定向电话或更改 手机或帐户的行为,手机应用程序支持最多,但 不是全部,电话方案中的特殊字符。具体来说,如果 URL包含*或#字符,Phone应用程序不会尝试 拨打相应的电话号码。如果您的应用收到了网址 来自用户或未知来源的字符串,您还应该确保 任何可能不适合在URL中的特殊字符 逃脱得当。对于原生应用,请使用 stringByAddingPercentEscapesUsingEncoding:NSString的方法 转义字符,返回正确转义的版本 原始字符串。
特别是方法stringByAddingPercentEscapesUsingEncoding
尝试将此方法与您要拨打的字符串一起使用。
答案 1 :(得分:1)
问题是NSURL认为这不是有效的URL。这样:
NSURL(string: "tel//:1111111,,222##")
...返回nil。问题不在于逃避;这是NSURL显然不接受任何带有两个#
符号的东西。 (将其粘贴到游乐场中为自己进行实验。)looks like it ought to,因此您可以将其作为Apple的错误提交。但请注意this from Apple:
为防止用户恶意重定向电话或更改手机或帐户的行为,Phone应用程序支持tel方案中的大多数但不是全部特殊字符。具体来说,如果URL包含*或#字符,则Phone应用程序不会尝试拨打相应的电话号码。
我不知道为什么这段代码会编译:
UIApplication.sharedApplication().openURL(NSURL(string: "tel//:1111111,,222##"))
NSURL(string:)
是一个可用的初始化器,意味着它返回一个可选项,而openURL()
的arg是非可选的。这提示你做这样的检查,这可以防止崩溃:
if let url = NSURL(string: "tel//:1111111,,222##") {
UIApplication.sharedApplication().openURL(url)
} else {
showErrorMessage("Unable to dial this number")
}
你是否在!
构造函数之后有一个NSURL
,当你为这个问题修剪它时它被删除了?如果是这样,那将是您崩溃的原因。