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

Cra*_*ake 5 url objective-c url-scheme ios swift

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

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

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

有没有办法获得当前应用程序的URL方案?

Cra*_*ake 9

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

- (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;
}
Run Code Online (Sandbox Code Playgroud)


Nai*_*hta 7

在 Swift 4 中编程方式从 Info.plist 获取自定义 url 方案的工作版本

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
    }
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明