2011-08-30 18 views

Odpowiedz

12

To jest mój obecny rozwiązanie:

- (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; 
} 

Ograniczeniem jest to, że są sprawdzając, ta aplikacja zarejestrowany do programu i niektóre aplikacja reaguje na tego adresu URL.

AFAIK nie gwarantuje, że twoja aplikacja jest rzeczywistym odpowiednikiem tego programu (w przypadku, gdy inna aplikacja również zarejestrowała się dla tego programu).

Wygląda na to, że iOS otwiera pierwszą zainstalowaną aplikację dla każdego unikalnego schematu URL.

+0

Ach, teraz rozumiem trochę lepiej. Przed otwarciem adresu URL nie można się dowiedzieć, co się stanie, gdy otworzysz ten adres URL. Na zapytania iOS nie ma interfejsu LaunchServices. –

+0

Postanowiłem zaakceptować moją odpowiedź, ponieważ wydaje się, że jest to najlepsza dostępna metoda (chociaż nie jest w 100% niezawodna). –

0

Oto jak rozwiązać go w 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

Prostsze rozwiązanie:

+ (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]; 
} 
Powiązane problemy