iOS Swift按钮拨号报错“不允许查询tel协议”,求排查方案
解决Swift拨号功能的"This app is not allowed to query for scheme tel"错误
嘿,这个问题我之前帮好几个开发者解决过,核心原因确实是Info.plist里缺少了URL Scheme的声明,iOS 9之后苹果收紧了URL Scheme的访问权限,必须显式声明你要调用的Scheme才行,另外代码里也有个小细节可以优化,我一步步给你讲:
1. 必须配置Info.plist的LSApplicationQueriesSchemes
你需要在Info.plist中添加LSApplicationQueriesSchemes数组,并把tel加入其中,具体有两种方式:
方式一:可视化编辑模式
- 打开项目里的
Info.plist文件 - 点击右上角的
+号,添加新的键 - 输入
LSApplicationQueriesSchemes,类型选择Array - 点击这个数组的
+号,添加一个String类型的项,值填tel
方式二:源代码编辑模式
右键点击Info.plist选择"Open As" -> "Source Code",然后添加这段代码到合适的位置:
<key>LSApplicationQueriesSchemes</key> <array> <string>tel</string> </array>
2. 优化你的拨号代码
你的代码里用了强制解包number!,如果restaurant.number是无效格式(比如为空、包含特殊字符),会直接崩溃,建议换成可选绑定,同时可以先格式化号码(去掉空格、括号等非数字字符):
@IBAction func call(_ sender: Any) { // 先格式化号码,去掉非数字字符 let cleanedNumber = restaurant.number.components(separatedBy: CharacterSet.decimalDigits.inverted).joined() guard let numberURL = URL(string: "tel://\(cleanedNumber)"), !cleanedNumber.isEmpty else { // 这里可以提示用户号码无效 print("无效的电话号码") return } if UIApplication.shared.canOpenURL(numberURL) { if #available(iOS 10.0, *) { UIApplication.shared.open(numberURL, options: [:], completionHandler: nil) } else { UIApplication.shared.openURL(numberURL) } } else { print("无法打开拨号功能") } }
额外注意点
- 测试的时候记得用真机,模拟器是无法调用拨号功能的
- 有些地区的号码可能需要加国家码,你可以根据需求调整号码格式化逻辑
内容的提问来源于stack exchange,提问作者BRK
相关产品推荐
相关产品推荐

