使用 canOpenURL 来检测是不是安装了被指定的 APP

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用 canOpenURL 来检测是不是安装了被指定的 APP相关的知识,希望对你有一定的参考价值。

参考技术A 准备:现在有两个 APP  A 和 B,现在要在 B 里面检测是否安装了A。

方法:使用 [[UIApplication sharedApplication] openURL:url] 来判断设备是否安装了 APP A

一般来说,在 APP 中如果自定了 URL Types ,如下图:

NSString *urlString = @"first://";

NSURL *url = [NSURL URLWithString:urlString];

if ([[UIApplication sharedApplication] canOpenURL:url])

        [[UIApplication sharedApplication] openURL:url]



在 APP B中使用 [[UIApplication sharedApplication] openURL:url] 就能判断设备是否安装了 A 了,如果您的 ios 系统是 9 以下,恭喜您,您应该已经成功了,但是不幸的是,笔者已经升级到 Xcode 7 与 iOS 9 了,说到这里,您大概也已经猜到了,结果肯定是失败的,失败的错误信息是:"first://myparams" - error: "This app is not allowed to query for scheme first", 这是 9 的新特性,为了用户的隐私安全,在检测的 APP (也就是这里的 APP B )中,必须将 APP A 设置成白名单之后才能通过 canOpenURL 的检测。

注意 这里需要添加 白名单 的是  APP B,而不是被检测的 APP A ,笔者就是给弄反了,折腾了好久才弄出来。 

如何检查是不是在没有 canOpenURL 的情况下安装了 iOS 应用程序 [重复]

【中文标题】如何检查是不是在没有 canOpenURL 的情况下安装了 iOS 应用程序 [重复]【英文标题】:How to check if an iOS app is installed without canOpenURL [duplicate]如何检查是否在没有 canOpenURL 的情况下安装了 iOS 应用程序 [重复] 【发布时间】:2021-05-30 19:52:13 【问题描述】:

如here 所述,用于验证应用是否安装了“some.bundle.id://”方案,并且可以使用 canOpenURL 技术。

但是,我在 SwiftUI 5 和 iOS 14.1 中发现它并不总是有效,例如

// Works    
UIApplication.shared.canOpenURL(URL(string: "com.garmin.connect.mobile://")!)  

// Doesn't work
UIApplication.shared.canOpenURL(URL(string: "com.fitbit.FitbitMobile://")!)    

我在连接到 iPhone 的 Mac 控制台应用程序日志中发现了以下错误。看起来 Fitbit 应用程序正在阻止查询:

default 12:03:34.339735-0700    2fahub  -canOpenURL: failed for URL: "FitbitMobile://app" - error: "This app is not allowed to query for scheme fitbitmobile"

在我的 Xcode 调试窗口中,我可以看到:

2021-05-30 12:46:16.416998-0700 2fahub[588:100068] -canOpenURL: failed for URL: "com.fitbit.FitbitMobile://" - error: "The operation couldn’t be completed. (OSStatus error -10814.)"

在我的应用中查询权限设置正确

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>com.garmin.connect.mobile</string>
    <string>com.fitbit.FitbitMobile</string>
</array>

还有什么可以用来确保它始终有效? iOS 中有没有类似 Android 的 PackageManager API 的东西?

更新#1:

其实 Fitbit 论坛提供的答案是正确的。 Fitbit 的方案必须是“fitbit://”,鉴于此应用程序的捆绑 ID 是 com.fitbit.FitbitMobile,因此完全不清楚为什么。 'fitbit' 不是应用名称,也不是整个捆绑 ID。在 Garmin 的情况下,我必须使用整个捆绑 ID 才能使其正常工作。很高兴知道这里的规则到底是什么。如果需要添加更多应用进行验证,我该怎么办?

【问题讨论】:

【参考方案1】:

Fitbit 的 URL Scheme 似乎不是 com.fitbit.FitbitMobile://(这是它的捆绑包 ID)\

试试 fitbit://

这两个帖子似乎可以正常工作Answer from 2016 - community.fitbit.comAnswer from 2020 - community.fitbit.com

【讨论】:

谢谢。 “fitbit://”有效,但绝对不清楚为什么 fitbit 不是应用程序名称,也不是整个捆绑 ID。请投票重新开放,因为其他裁判绝对没有意义 fitbit 是将捆绑 ID 或应用程序名称放在 LSApplicationQueriesSchemes 上的 URL 方案根本不起作用,LSApplicationQueriesSchemes - Summary。 garmin 很有可能将其 URL Scheme 和 bundle ID 设置为 com.garmin.connect.mobile

以上是关于使用 canOpenURL 来检测是不是安装了被指定的 APP的主要内容,如果未能解决你的问题,请参考以下文章

vmware下安装mac os虚拟机问题,最后还是最终攻克了被一个小失误给陷害了

稚晖君发文承认已离开华为;iPhone “车祸检测”被指占用大量救援资源;18年的Firefox Bug被修复|极客头条...

稚晖君发文承认已离开华为;iPhone “车祸检测”被指占用大量救援资源;18年的Firefox Bug被修复|极客头条

我自己编辑的bat格式关机文件转成exe格式怎么变成病毒了被杀软删了

-canopenurl:failed for url:怎么解决

Xcode 7 + canOpenURL,如何让Facebook和Twitter打开我自己的应用链接