如何以编程方式查询当前应用程序的URL方案?

时间:2016-04-05 18:55:30

标签: ios objective-c swift url url-scheme

我的iOS应用程序有50多个目标,每个目标都有自己的自定义URL方案。我需要检测来自webview的请求是否与当前正在运行的应用程序的方案匹配。为此,我需要能够从代码中查询当前应用程序的URL方案。

类似的问题涉及试图询问其他应用程序以发现其URL方案,这似乎是不可能的。我需要在我的应用程序中为我自己的应用程序找到该方案。

我希望避免为URL方案设置另一个plist值,并将其包含在目标中。

有没有办法获取当前应用的网址方案?

3 个答案:

答案 0 :(得分:6)

这是我想出来实现这一目标的功能。

- (BOOL)doesMatchURLScheme:(NSString *)scheme {
  if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleURLTypes"]) {
    NSArray *urlTypes = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleURLTypes"];
    for(NSDictionary *urlType in urlTypes)
    {
      if(urlType[@"CFBundleURLSchemes"])
      {
        NSArray *urlSchemes = urlType[@"CFBundleURLSchemes"];
        for(NSString *urlScheme in urlSchemes)
          if([urlScheme caseInsensitiveCompare:scheme] == NSOrderedSame)
            return YES;
      }

    }
  }
  return NO;
}

答案 1 :(得分:3)

在Swift 4中:以编程方式从Info.plist获取自定义网址方案的工作版

func externalURLScheme() -> String? {
        guard let urlTypes = Bundle.main.infoDictionary?["CFBundleURLTypes"] as? [AnyObject],
            let urlTypeDictionary = urlTypes.first as? [String: AnyObject],
            let urlSchemes = urlTypeDictionary["CFBundleURLSchemes"] as? [AnyObject],
            let externalURLScheme = urlSchemes.first as? String else { return nil }

        return externalURLScheme
    }

(假设urlTypes和urlSchemes数组中只有1个元素,因此获取第一个元素)。这是我的 plist条目的URL方案

enter image description here

答案 2 :(得分:0)

捆绑快速4语法的扩展

extension Bundle {

    static let externalURLSchemes: [String] = {
        guard let urlTypes = main.infoDictionary?["CFBundleURLTypes"] as? [[String: Any]] else {
            return []
        }

        var result: [String] = []
        for urlTypeDictionary in urlTypes {
            guard let urlSchemes = urlTypeDictionary["CFBundleURLSchemes"] as? [String] else { continue }
            guard let externalURLScheme = urlSchemes.first else { continue }
            result.append(externalURLScheme)
        }

        return result
    }()

}