You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:02:18