openURL()中的双重标签会使应用程序崩溃

时间:2016-07-29 12:17:06

标签: swift xcode nsurl

我需要从应用程序拨打电话,到目前为止它正在工作。该号码由两个数字组成:电话号码和密码后跟密码标签。 但有些用户需要在数字的末尾添加双重#Hottag标签,并在应用程序立即调用该网址时崩溃:

UIApplication.sharedApplication().openURL(NSURL (string: "tel//:1111111,,222##"))

使用单个主题标签可以正常工作,并且可以在设备已经拨号后在键盘上按下#标签。我试图附加ASCII表 - 十六进制数,23(表示#) - 它没有帮助。

修改

我找到了here

let encodedHost = 
numberToDial.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())

确实交换了这样的主题标签:

enter image description here

但是当试图拨打这个号码(NSURL)时,该应用仍会崩溃。如何在URL的末尾仍然有双重#标签,而不是让应用程序崩溃?

2 个答案:

答案 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,当你为这个问题修剪它时它被删除了?如果是这样,那将是您崩溃的原因。