首页 > 解决方案 > 默认 iOS 应用程序 url 方案调用问题

问题描述

我正在尝试检查用户手机上安装了哪些默认应用程序。

我添加到带有应用程序方案名称的 LSApplicationQueriesSchemes 数组字符串(例如计算器的“calc”),然后我使用这个函数来检查:

func isAppInstalled(_ appName:String) -> Bool{

    let appScheme = "\(appName)://app"
    let appUrl = URL(string: appScheme)


    if UIApplication.shared.canOpenURL(appUrl! as URL){
        return true
    } else {
        return false
    }

}

并像使用它一样

let result = isAppInstalled("calc")

但在控制台中收到此错误

-canOpenURL:URL 失败:“calc://app” - 错误:“操作无法完成。(OSStatus 错误 -10814。)”

这意味着未安装应用程序。此代码适用于 appstore 应用程序、书籍、Apple tv、facetime、消息等,但不适用于计算器、时间应用程序、指南针、联系人、提示。

我的代码有什么问题?或者也许苹果改变了这个应用程序方案?在 iOS 14 设备上测试。

标签: iosswiftxcode

解决方案


此代码适用于 appstore 应用程序、书籍、Apple tv、facetime、消息等,但不适用于计算器、时间应用程序、指南针、联系人、提示。

-canOpenURL:文档

...您必须通过将 LSApplicationQueriesSchemes 键添加到应用程序的 Info.plist 文件来声明传递给此方法的 URL 方案。对于未声明的方案,无论是否安装了适当的应用程序,此方法始终返回 false。

因此,一种可能性是您没有在 Info.plist 中声明失败的应用程序。

此外,Apple长期以来一直阻止应用程序尝试查询设备以获取太多已安装的应用程序,因为这样做表明您正在尝试创建“指纹”来跟踪设备,或者以其他方式了解更多关于用户的信息,因此您的失败可能只是超出了当前对canOpenURL:具有不同 URL 的调用的限制。


推荐阅读