ios - 默认 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 设备上测试。
解决方案
此代码适用于 appstore 应用程序、书籍、Apple tv、facetime、消息等,但不适用于计算器、时间应用程序、指南针、联系人、提示。
...您必须通过将 LSApplicationQueriesSchemes 键添加到应用程序的 Info.plist 文件来声明传递给此方法的 URL 方案。对于未声明的方案,无论是否安装了适当的应用程序,此方法始终返回 false。
因此,一种可能性是您没有在 Info.plist 中声明失败的应用程序。
此外,Apple长期以来一直阻止应用程序尝试查询设备以获取太多已安装的应用程序,因为这样做表明您正在尝试创建“指纹”来跟踪设备,或者以其他方式了解更多关于用户的信息,因此您的失败可能只是超出了当前对canOpenURL:
具有不同 URL 的调用的限制。
推荐阅读
- linux - 添加附加源文件时,Linux 内核模块会忽略主模块文件
- ios - 在 ARSCNView 中禁用实时摄像机源?
- hive - 蜂巢如何使用远程hadoop而不是本地hadoop?
- gdb - 如何调试从 lustre 读取产生的悬挂作业?
- python - 如何在启动新线程之前等待线程执行完成?
- reactjs - 获取使用 react-ga 实现的 Google Analytics Page Views
- java - 使用 Jackson 将嵌套的 JSON 列表映射到 Spring Boot 中的对象数组
- python - FT不收敛,找不到理由……体验正常吗?
- assembly - 将内存地址传递给C64程序集中的子程序?
- qt - Qt中的“发出”与“返回”-异同