2013-06-19 20 views
21

użytkownika w mojej aplikacji można zalogować się za pomocą 2 usługi Facebook lub GoogleHandling OpenURL: Facebook i Google

wszystko działa poprawnie, jednak w:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation: (id)annotation { 
    ... 
} 

mam zdecydować, aby połączyć się z Facebooka oddzwonienie lub oddzwonienie telefoniczne

jeśli użytkownik ma aplikacje, jest to łatwe, niż ja decyduję przez sourceApplication , ale gdy nie (nie ma macierzystego konta w serwisie Facebook, nie ma aplikacji FB, nie ma aplikacji GooglePlus), łączy się z przeglądarką :(i nie wiem, czy to prawda pochodzący z Facebooka lub Google

Czy istnieje sposób, aby zdecydować, do kogo zadzwonić? jak

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation: (id)annotation { 

    // how to decide? 
    if (facebook) { 

     return [FBSession.activeSession handleOpenURL:url]; 

    } else if (google) { 

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

    } 

} 

Odpowiedz

29

Nie trzeba jawnie trzeba sprawdzić URL, poniżej kod robi to: -

- (BOOL)application: (UIApplication *)application openURL: (NSURL *)url sourceApplication: (NSString *)sourceApplication annotation: (id)annotation 
{ 

    if ([GPPURLHandler handleURL:url sourceApplication:sourceApplication annotation:annotation]) { 
     return YES; 
    }else if([FBAppCall handleOpenURL:url sourceApplication:sourceApplication]){ 
     return YES; 
    } 

    return NO; 
} 
+0

D'oh (to powinna być zaakceptowana odpowiedź). –

+0

tak to jest doskonała odpowiedź +1 – ashokdy

+0

szybka wersja? – DeyaEldeen

-2

Będziemy chcieli wykorzystać [[UIApplication sharedApplication] canOpenURL:]

+0

nie, to jest to nieprawidłowe i nie związane z moim pytaniem –

+1

'canOpenURL' przede wszystkim, pozwala stwierdzić, które aplikacje są zainstalowane na urządzeniu. Możesz sprawdzić prefiks adresu URL, aby dowiedzieć się, z której usługi pochodzi. Adresy URL aplikacji Facebooka zaczną się od 'fb:' – Idles

+0

@Idles pamiętaj, że jest to metoda wywołania zwrotnego.Jeśli twoja aplikacja obsługuje adresy URL zarówno Facebook, jak i google, '' 'canOpenUrl''' zawsze zwraca' '' YES''' dla obu. Masz rację, że możesz sprawdzić adres URL, ale zazwyczaj biblioteka ma metodę handleURL: metoda zwracająca wartość logiczną. Nie musisz się martwić, jeśli nie chcesz zrobić magii samemu. – MrJre

5

można spróbować wykonać następujące czynności:

if ([[url absoluteString] rangeOfString:@"<Your Google Bundle ID>"].location ==   NSNotFound) 
{ 
    // Call FBAppCall's handleOpenURL:sourceApplication to handle Facebook app responses 
    BOOL wasHandled = [FBAppCall handleOpenURL:url sourceApplication:sourceApplication]; 
    // You can add your app-specific url handling code here if needed 
    return wasHandled; 
} 
else 
{ 
    return [GPPURLHandler handleURL:url 
        sourceApplication:sourceApplication 
         annotation:annotation]; 
} 
return YES; 

Wezwania powyższej metody w

(BOOL)application:(UIApplication *)application 
      openURL:(NSURL *)url 
sourceApplication:(NSString *)sourceApplication 
     annotation:(id)annotation 

w swoim appDelegeate.m

Zasadniczo to, co to zrobi, to zbadanie przedrostka adresu URL, a następnie wywołanie metody google +, jeśli prefiks url jest zgodny z identyfikatorem pakietu google +, a jeśli nie, to wywoła metodę fb. Nadzieja to pomaga

+0

Można na przemian testować, czy schemat adresu URL zaczyna się od "fb", co uniezależnia identyfikator aplikacji kodu. – jmdecombe

+0

Geniuszu, nie mogłem do końca życia zrozumieć, dlaczego działał tylko FB lub G +, nigdy obydwoje w tym samym czasie – user1282637

-4
- (BOOL)application:(UIApplication *)application 
      openURL:(NSURL *)url 
    sourceApplication:(NSString *)sourceApplication 
     annotation:(id)annotation 
{ 


    if([GPPURLHandler handleURL:url 
        sourceApplication:sourceApplication 
        annotation:annotation]) 
    { 
     return [GPPURLHandler handleURL:url 
        sourceApplication:sourceApplication 
          annotation:annotation]; 
    } 
    else if([[FBSDKApplicationDelegate sharedInstance] application:application 
                  openURL:url 
               sourceApplication:sourceApplication 
                 annotation:annotation]) 
    { 
     return [[FBSDKApplicationDelegate sharedInstance] application:application 
                   openURL:url 
                sourceApplication:sourceApplication 
                  annotation:annotation]; 
    } 
    return NO; 
} 
1

Dla użytkowników SWIFT (Pomysł z user2144179)

poniżej

importu Ramki

import Firebase 
import GoogleSignIn 
import FacebookCore // (FBSDKCore's alternative for swift) 

iw metodach delegata

// when your target is under iOS 9.0 
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool { 
    let isFBOpenUrl = SDKApplicationDelegate.shared.application(application, open: url, sourceApplication: sourceApplication, annotation: annotation) 
    let isGoogleOpenUrl = GIDSignIn.sharedInstance().handle(url, sourceApplication: sourceApplication, annotation: annotation) 
    if isFBOpenUrl { return true } 
    if isGoogleOpenUrl { return true } 
    return false 
} 

lub możesz użyć innej metody "otwartego adresu URL", jeśli Twój cel to 9.0+. Pakiety SDK zawierają także metodę.

Firebase referencyjny: https://firebase.google.com/docs/auth/ios/google-signin

Facebook referencyjny: https://developers.facebook.com/docs/swift/reference/classes/applicationdelegate.html

0

Metoda "application: OpenURL: sourceApplication: adnotacja:" jest przestarzała od iOS9. więc teraz możesz użyć jak.

- (BOOL)application:(UIApplication *)app 
     openURL:(NSURL *)url 
     options:(NSDictionary *)options { 
     // For Google sign in SDK 
     if ([[GIDSignIn sharedInstance] handleURL:url 
           sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey] 
             annotation:options[UIApplicationOpenURLOptionsAnnotationKey]]) { 
      return YES; 
     // For Facebook SDK 
     }else if ([[FBSDKApplicationDelegate sharedInstance] application:app 
                  openURL:url 
               sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey] 
                 annotation:options[UIApplicationOpenURLOptionsAnnotationKey]]){ 
      return YES; 
     //For Google plus SDK 
     }else if ([GPPURLHandler handleURL:url 
         sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey] 
           annotation:options[UIApplicationOpenURLOptionsAnnotationKey]]){ 
      return YES; 
     } 

    return NO; 
}