【问题标题】:How to check programmatically if an App is installed?如果安装了应用程序,如何以编程方式检查?
【发布时间】:2011-03-31 13:06:11
【问题描述】:

我正在开发一个 iPhone 应用程序,它将在企业中安装少量第三方应用程序。我有关于捆绑 ID 的信息。有没有办法使用一些系统 API 来检查应用程序是否已经安装?目前应用程序再次安装,覆盖当前安装。我需要以某种方式防止这种情况。 (如果应用程序已经安装,Apple 的 AppStore 应用程序会禁用安装选项。)

【问题讨论】:

标签: iphone objective-c cocoa-touch ipad ios4


【解决方案1】:

我认为这是不可能直接实现的,但如果应用注册了 uri 方案,您可以对此进行测试。

一个 URI 方案是例如 fb:// 用于 facebook 应用程序。您可以在应用程序的 info.plist 中注册它。 [UIApplication canOpenURL:url] 会告诉您某个网址是否会打开。因此测试fb:// 是否会打开,将表明安装了一个注册fb:// 的应用程序——这对facebook 应用程序来说是一个很好的提示。

// check whether facebook is (likely to be) installed or not
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"fb://"]]) {
    // Safe to launch the facebook app
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"fb://profile/200538917420"]];
}

【讨论】:

  • “但如果应用程序注册了 uri 方案,你可以对此进行测试”:您能否进一步解释一下?
【解决方案2】:

这是一个测试是否安装了 facebook 应用程序的示例

if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"fb://"]]) {
    // Facebook app is installed
}

【讨论】:

    【解决方案3】:

    对于任何尝试使用 iOS 9/Swift 2 进行此操作的人:

    首先,您需要通过将以下内容添加到您的 Info.plist 文件中来将 URL 列入“白名单”(一种安全功能 - 请参阅 Leo Natan's answer):

    <key>LSApplicationQueriesSchemes</key>
    <array>
        <string>fb</string>
    </array>
    

    之后可以询问应用是否可用,是否有注册的scheme:

    guard UIApplication.sharedApplication().canOpenURL(NSURL(string: "fb://")!) else {
        NSLog("No Facebook?  You're a better man than I am, Charlie Brown.")
        return
    }
    

    【讨论】:

    • 这很重要。没有它,每次调用 canOpenURL() 时,它都会返回 false,并且您会看到日志消息 This app is not allowed to query for scheme fb。
    【解决方案4】:

    当涉及到社交网络时,最好检查多个方案。 (例如,因为 IOS9 SDK 的方案 'fb' 已过时。):

    NSArray* fbSchemes = @[
         @"fbapi://", @"fb-messenger-api://", @"fbauth2://", @"fbshareextension://"];
    BOOL isInstalled = false;
    
    for (NSString* fbScheme in fbSchemes) {
        isInstalled = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:fbScheme]];
        if(isInstalled) break;
    }
    
    if (!isInstalled) {
        // code
        return;
    }
    

    当然 Info.plist 也应该包含所有必要的方案:

    <key>LSApplicationQueriesSchemes</key>
    <array>
        <string>fbapi</string>
        <string>fb-messenger-api</string>
        <string>fbauth2</string>
        <string>fbshareextension</string>
    </array>
    

    【讨论】:

      【解决方案5】:

      斯威夫特 3.1、斯威夫特 3.2、斯威夫特 4

      if let urlFromStr = URL(string: "fb://") {
          if UIApplication.shared.canOpenURL(urlFromStr) {
              if #available(iOS 10.0, *) {
                  UIApplication.shared.open(urlFromStr, options: [:], completionHandler: nil)
              } else {
                  UIApplication.shared.openURL(urlFromStr)
              }
          }
      }
      

      在 Info.plist 中添加这些:

      <key>LSApplicationQueriesSchemes</key>
      <array>
          <string>fb</string>
      </array>
      

      【讨论】:

        【解决方案6】:

        iOS 9 及更新版本:

        由于Apple从iOS 9开始进行了一些安全更改,除了其他答案中提到的canOpenURL之外,您还需要在info.plist中添加一个带有字符串的LSApplicationQueriesSchemes数组。有关使用 Twitter 的示例,请参见屏幕截图。

        如果您想添加 Facebook,您只需在数组中添加另一个字符串值为“fb”的项目。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-07-08
          • 2023-03-03
          • 2022-12-03
          • 1970-01-01
          • 1970-01-01
          • 2017-08-29
          • 2011-06-23
          相关资源
          最近更新 更多