【问题标题】:Default iOS apps url schemes call problem默认 iOS 应用程序 url 方案调用问题
【发布时间】:2021-04-02 14:22:32
【问题描述】:

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

我将应用程序名称添加到 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 设备上测试。

【问题讨论】:

  • 您现在认为该 URL 有效吗?在 Safari 中输入它只会出现错误。并非所有应用都有 URL 方案。
  • @Paulw11 URL 有效。我在 safari 中尝试“calc://app” url,在 ios 14 上完美运行。

标签: ios swift xcode


【解决方案1】:

此应用程序的 url 不是公开的,因此您无法使用它们从您自己的应用程序中打开此默认应用程序,也无法使用 UIApplication.shared.canOpenURL 进行检查

【讨论】:

    【解决方案2】:

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

    来自-canOpenURL: docs

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

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

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

    【讨论】:

    • 我声明了我使用的所有方案,包括示例中的计算器。关于限制,我连续测试了这个函数 5 次(50 个 canopenurl 调用 1 个函数调用),除了这个应用程序之外一切正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多