我的iOS应用程序有50多个目标,每个目标都有自己的自定义URL方案。我需要检测来自webview的请求是否与当前正在运行的应用程序的方案匹配。为此,我需要能够从代码中查询当前应用程序的URL方案。
类似的问题涉及试图询问其他应用程序以发现其URL方案,这似乎是不可能的。我需要在我的应用程序中为我自己的应用程序找到该方案。
我希望避免为URL方案设置另一个plist值,并将其包含在目标中。
有没有办法获取当前应用的网址方案?
答案 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方案
答案 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
}()
}