2013-06-19 30 views
21

người dùng trong ứng dụng của tôi có thể đăng nhập sử dụng 2 dịch vụ: Facebook hoặc GoogleXử lý openURL: với Facebook và Google

mọi thứ hoạt động tốt, tuy nhiên, trong:

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

tôi nên quyết định gọi cho Facebook gọi lại hoặc gọi lại Google

nếu người dùng có ứng dụng, dễ dàng hơn tôi quyết định bởi sourceApplication nhưng khi không (không có tài khoản Facebook gốc, không có ứng dụng FB, không có ứng dụng GooglePlus), nó liên kết với trình duyệt :(và tôi không biết nếu nó là đến từ Facebook hoặc Google

có cách nào để quyết định xem nên gọi gì không? như

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

    } 

} 

Trả lời

29

Chúng tôi không cần phải Rõ ràng cần phải kiểm tra URL, bên dưới mã không nó: -

- (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 (đây phải là câu trả lời được chấp nhận). –

+0

có đây là câu trả lời hoàn hảo +1 – ashokdy

+0

một phiên bản nhanh? – DeyaEldeen

-2

Bạn sẽ muốn sử dụng [[UIApplication sharedApplication] canOpenURL:]

+0

không, điều đó không đúng và không liên quan đến câu hỏi của tôi –

+1

'canOpenURL' trước hết, cho phép bạn biết ứng dụng nào được cài đặt trên thiết bị. Bạn có thể kiểm tra tiền tố của URL để tìm ra dịch vụ nào của nó. URL cho ứng dụng của Facebook sẽ bắt đầu bằng 'fb:' – Idles

+0

@Idles nhớ rằng đây là phương thức gọi lại.Nếu ứng dụng của bạn hỗ trợ cả url facebook và google, '' 'canOpenUrl''' luôn trả về' '' YES''' cho cả hai. Bạn nói đúng là bạn có thể kiểm tra url, nhưng thường một thư viện có một phương thức handleURL: trả về một boolean cho bạn. Bạn sẽ không phải bận tâm nếu bạn không muốn tự làm phép thuật. – MrJre

5

Bạn có thể thử như sau:

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; 

Gọi các phương pháp trên trong

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

trong bạn appDelegeate.m

Về cơ bản, điều này sẽ làm là kiểm tra tiền tố url và sau đó gọi phương thức google + nếu url là url google + bundle id, và nếu không, nó sẽ gọi phương thức fb. Hope this helps

+0

Bạn có thể kiểm tra luân phiên rằng lược đồ của URL bắt đầu bằng "fb", điều này sẽ làm cho ID ứng dụng mã độc lập. – jmdecombe

+0

Genius, tôi không thể cho cuộc sống của tôi tìm ra lý do tại sao chỉ FB OR G + đã làm việc, không bao giờ cả hai cùng một lúc – 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

Đối với người dùng Swift, (Ý tưởng từ user2144179)

Nhập khung bên dưới

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

và theo phương thức đại biểu của bạn

// 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 
} 

hoặc bạn có thể sử dụng phương pháp 'mở url:' khác nếu mục tiêu của bạn là 9,0+. SDK cũng bao gồm một phương pháp cho nó.

căn cứ hỏa lực tham khảo: https://firebase.google.com/docs/auth/ios/google-signin

Facebook tham khảo: https://developers.facebook.com/docs/swift/reference/classes/applicationdelegate.html

0

Phương pháp "ứng dụng: openURL: sourceApplication: chú thích:" bị phản đối từ iOS9. vì vậy bây giờ bạn có thể sử dụng như thế nào.

- (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; 
} 
Các vấn đề liên quan