2014-08-28 11 views
7

Mam 2 SDK, które muszą używać metody application:openURL:sourceApplication:annotation. Jeden to FacebookSDK, a drugi to GooglePlusSDK.Obsługa dwóch aplikacji: openURL: sourceApplication: adnotacja

Są to metody:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 
{ 
    return [FBAppCall handleOpenURL:url sourceApplication:sourceApplication]; 
} 

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 
{ 
    return [GPPURLHandler handleURL:url sourceApplication:sourceApplication annotation:annotation]; 
} 

Moje pytanie brzmi: jak to możliwe, aby przenieść je do jednej metody? Jaka jest najlepsza droga?

Z góry dziękuję.

+0

Nie można określić na podstawie adresu URL z siedzibą w użyciu prosty 'if statement'? Czy schematy URL nie będą się różnić? – Popeye

Odpowiedz

8

Można chyba zrobić tak:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 
{ 
    BOOL shouldOpen = [FBAppCall handleOpenURL:url sourceApplication:sourceApplication]; 
    shouldOpen = shouldOpen ? shouldOpen : [GPPURLHandler handleURL:url sourceApplication:sourceApplication annotation:annotation]; 

    return shouldOpen; 
} 
+0

Dziękuję. Oszczędzasz mój czas. Błogosławieństwa. – Smita

+0

shouldOpen | = [GPPURLHandler handle ..] –

20

Używaj operatora logicznego OR ||

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 
{ 
    return [FBAppCall handleOpenURL:url sourceApplication:sourceApplication] || [GPPURLHandler handleURL:url sourceApplication:sourceApplication annotation:annotation]; 
} 

Swift Wersja

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String!, annotation: AnyObject) -> Bool { 
    return FBAppCall.handleOpenURL(url, sourceApplication: sourceApplication) || GPPURLHandler.handleURL(url, sourceApplication: sourceApplication, annotation: annotation) 
} 
3

Można również umieścić czek na prefiks podstawowy z URL

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 
{ 
if FB URL prefix 
//Call FB method 
else 
//Google plus method 
} 
6

Czystsze sposób (tu w Swift) byłoby:

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String!, annotation: AnyObject) -> Bool { 
    var handled: Bool 
    if let facebook = url.scheme?.hasPrefix("fb") { 
     handled = FBAppCall.handleOpenURL(url, sourceApplication: sourceApplication) 
    } else { 
     handled = GPPURLHandler.handleURL(url, sourceApplication: sourceApplication, annotation: annotation) 
    } 
    // include any specific handling code as necessary 
    return handled 
} 
2

skończyło się robi:

- (BOOL)application:(UIApplication *)application //facebook & Google+ 
      openURL:(NSURL *)url 
    sourceApplication:(NSString *)sourceApplication 
     annotation:(id)annotation { 
    return([[FBSDKApplicationDelegate sharedInstance] application:application 
                  openURL:url 
               sourceApplication:sourceApplication 
                 annotation:annotation] 
      || 

      [GPPURLHandler handleURL:url 
        sourceApplication:sourceApplication 
         annotation:annotation] 
      ); 

    ; 
} 
Powiązane problemy