UIApplication.shared.canOpenURL返回true异常咨询(未安装对应APP)
canOpenURL(_:)在未安装目标APP时依然返回true? 我来帮你理清这个问题的核心原因——这和你使用的URL类型、iOS系统对canOpenURL(_:)的判断逻辑直接相关,具体拆解如下:
1. 你测试用的是HTTP协议URL,而非自定义Scheme
你当前的appUrl是http://dum:site2015@jobz.store.com/,这是标准的HTTP协议链接,并非你在Info.plist里配置的jobz-com自定义Scheme(比如jobz-com://open这类格式)。
iOS的canOpenURL(_:)对于HTTP/HTTPS这类系统原生支持的协议,判断逻辑是:只要设备上存在能处理该协议的应用(比如系统自带的Safari),就会返回true。因为Safari是默认存在的,它完全能打开HTTP链接,所以这个API自然会返回true,之后就会触发Safari打开该网址——这和你的目标APP是否安装没有关系。
2. 自定义Scheme的正确判断方式
如果你想通过canOpenURL(_:)检测目标APP是否安装,必须使用你配置的自定义Scheme来构造测试URL,而不是HTTP链接。举个实际的代码例子:
// 使用自定义Scheme构造测试URL guard let customSchemeUrl = URL(string: "jobz-com://") else { return } if UIApplication.shared.canOpenURL(customSchemeUrl) { // 目标APP已安装,打开自定义Scheme链接 UIApplication.shared.open(customSchemeUrl) } else { // 未安装APP,执行跳转App Store等备用逻辑 }
3. 关于URL中的HTTP认证信息
你URL里的dum:site2015@是HTTP基本认证内容,这不会改变canOpenURL(_:)的判断结果——因为Safari本身支持处理带认证的HTTP链接(可能会弹出认证弹窗,或自动使用URL里的信息,取决于系统设置),所以API依然会返回true。
一句话总结
你现在的问题本质是用错了测试URL的协议类型:要判断自定义Scheme的APP是否安装,就得用自定义Scheme的URL去调用canOpenURL(_:);而HTTP协议的URL只要有浏览器存在就会返回true,和目标APP的安装状态无关。
内容的提问来源于stack exchange,提问作者Mohamed Lee




