不添加 LSApplicationQueriesSchemes 的 CanOpenURL

CanOpenURL without add LSApplicationQueriesSchemes

我想在我的应用程序中打开其他应用程序,
(类似 MDM 的应用程序),
但在 iOS 9,
之后 使用CanOpenURL查询其他应用需要在LSApplicationQueriesSchemes中添加Schemes,
我在 websrevice 上获取了我的应用程序列表,所以我无法将它们添加到 plist 中,
有没有使用 CanOpenURL 检查其他应用程序是否安装的解决方案不在 LSApplicationQueriesSchemes 中添加方案?

您可以使用 UIApplication.open(_:​options:​completion​Handler:​) 而无需在 LSApplicationQueriesSchemes 中指定 URLS。该密钥仅用于 can​Open​URL(_:​)。 见 Apple's documentation here:

... Unlike this method, the open​URL(_:​) method is not constrained by the LSApplication​Queries​Schemes requirement. That method works if an app is available to open the URL, whether or not you have declared the scheme.


更新

因此,如果您需要 canOpenURL,您还需要 .plist 中的那些 LSApplication​QueriesSchemes 条目,否则 canOpenURL 将始终 return false.此限制已在 iOS 9(我认为)中实施,以防止恶意应用程序 嗅探 安装的 phone.

由于无法在运行时添加条目且无法使用通配符,因此唯一的解决方案是直接调用openURL 并检查是否成功。如果您的网络服务和 MDM 保证被调用的应用程序已安装,这可能是一个可行的解决方法。

你也可以实现类似 x-callback 的东西。想想以下几点:

  • 中央(类似 MDM)应用程序注册一个 URL 类似 "register-app://",其他应用程序可以在其中注册自己的(回调)URL 方案
  • 另一个应用程序调用 "register-app" 并提供它自己的(回调)方案
    • 必须手动启动一次才能这样做
  • 类似 MDM 的应用程序将 "callback-URLS" 存储在数据库中
  • 类 MDM 应用程序现在直接使用 openURL
  • 不再需要网络服务

或者您的 MDM(真正的 MDM)可以发送推送通知来通知新安装的应用程序及其 URL 方案。

不过,这都是apple想到的规避限制的小技巧...