2011-08-30 9 views

Respuesta

12

Ésta es mi solución actual:

- (BOOL) respondsToUrl:url 
{ 
    BOOL schemeIsInPlist = NO; // find out if the sceme is in the plist file. 
    NSBundle* mainBundle = [NSBundle mainBundle]; 
    NSArray* cfBundleURLTypes = [mainBundle objectForInfoDictionaryKey:@"CFBundleURLTypes"]; 
    if ([cfBundleURLTypes isKindOfClass:[NSArray class]] && [cfBundleURLTypes lastObject]) { 
     NSDictionary* cfBundleURLTypes0 = [cfBundleURLTypes objectAtIndex:0]; 
     if ([cfBundleURLTypes0 isKindOfClass:[NSDictionary class]]) { 
      NSArray* cfBundleURLSchemes = [cfBundleURLTypes0 objectForKey:@"CFBundleURLSchemes"]; 
      if ([cfBundleURLSchemes isKindOfClass:[NSArray class]]) { 
       for (NSString* scheme in cfBundleURLSchemes) { 
        if ([scheme isKindOfClass:[NSString class]] && [url hasPrefix:scheme]) { 
         schemeIsInPlist = YES; 
         break; 
        } 
       } 
      } 
     } 
    } 

    BOOL canOpenUrl = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString: url]]; 

    return schemeIsInPlist && canOpenUrl; 
} 

La limitación es que estamos comprobando que esta aplicación registrado para el esquema y algunos aplicación responde a esa URL.

AFAIK esto no garantiza que su aplicación sea la respuesta real para ese esquema (en el caso donde otra aplicación también se registró para ese esquema).

Por lo que he intentado, parece que iOS abre la primera aplicación instalada para cada esquema de url único.

+0

Ah, ahora entiendo un poco mejor. No hay forma de saber con certeza antes de abrir una URL qué sucederá cuando abra esa URL. No hay interfaz LaunchServices en iOS para consultar. –

+0

Decidí aceptar mi respuesta ya que parece que este es el mejor método disponible (aunque no es 100% confiable). –

0

Aquí es cómo lo resolví en Swift:

var plistPath = NSBundle.mainBundle().pathForResource("Info", ofType: "plist") 

var urlStuff = NSMutableDictionary(contentsOfFile: plistPath!) 
var urlType = NSDictionary(objectsAndKeys: "com.appprefix.AppName", "CFBundleURLName", NSArray(object: "fb123456789"), "CFBundleURLSchemes") 
urlStuff?.setObject(NSArray(object: urlType), forKey: "CFBundleURLTypes") 
urlStuff?.writeToFile(plistPath!, atomically: true) 
0

Una solución más simple:

+ (BOOL)isBundleURL:(NSURL *)url 
{ 
    NSArray *urlTypes = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleURLTypes"]; 
    NSArray *urlSchemes = [urlTypes.firstObject objectForKey:@"CFBundleURLSchemes"]; 
    return [urlSchemes containsObject:url.scheme]; 
} 

+ (BOOL)respondsToURL:(NSURL *)url 
{ 
    return [self isBundleURL:url] && [[UIApplication sharedApplication] canOpenURL:url]; 
} 
Cuestiones relacionadas