You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

UIApplication.shared.canOpenURL返回true异常咨询(未安装对应APP)

为什么canOpenURL(_:)在未安装目标APP时依然返回true?

我来帮你理清这个问题的核心原因——这和你使用的URL类型、iOS系统对canOpenURL(_:)的判断逻辑直接相关,具体拆解如下:

1. 你测试用的是HTTP协议URL,而非自定义Scheme

你当前的appUrlhttp://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

火山引擎 最新活动