我正在使用Factual来获取当地餐馆的电话号码,并且最终用户可以选择在我的应用程序中调用该地点,但由于一些奇怪的原因它会一直崩溃。
这是有效的代码:
func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem) {
if item.tag == 1 {
print("\(RestaurantCountry)")
}
}
RestaurantCountry代表电话号码。它在控制台中打印电话号码,但是当我使用此代码时它会崩溃。有人知道为什么会这样吗?
func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem) {
if item.tag == 1 {
let url:NSURL = NSURL(string: "tel://\(RestaurantCountry)")!
UIApplication.sharedApplication().openURL(url)
}
}
此代码崩溃,但我觉得它应该可行。任何人都可以告诉我为什么会这样吗?
答案 0 :(得分:2)
将您对选项的不安全处理(强制解包...)放在一边,您需要确保您的电话号码的字符串表示具有正确的编码,以便进行以下NSUrl
查询/尝试启动呼叫。在这种情况下,我认为电话号码中的空格是失败查询的根。
您可以使用NSString
方法stringByAddingPercentEncodingWithAllowedCharacters(_:)对字符串进行编码,例如
let phoneNr : NSString = "(219) 465-4022"
let fixedPhoneNr = phoneNr
.stringByAddingPercentEncodingWithAllowedCharacters(
NSCharacterSet.URLQueryAllowedCharacterSet()) ?? "Non-encodable..."
print(fixedPhoneNr) // (219)%20465-4022
之后你应该(希望)能够(安全地)发起你的呼叫
if let phoneNumberURL = NSURL(string: "tel:\(fixedPhoneNr)") {
UIApplication.sharedApplication().openURL(phoneNumberURL)
}
另见:
答案 1 :(得分:1)
如果它是零,则需要正确解开可选的url来处理。您似乎还需要删除数字中的“ - ”。
let strippedUrlString = RestaurantCountry.stringByReplacingOccurrencesOfString("-", withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil)
if let url = NSURL(string: "tel://\(strippedUrlString)") {
UIApplication.sharedApplication().openURL(url)
} else {
print("url is nil")
}