2013-06-19 29 views
21

用户在我的应用程序可以登录使用2个服务:Facebook或谷歌处理的OpenURL:与Facebook和谷歌

一切正常,但在:

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

我应该决定调用一个Facebook回调或谷歌回调

如果用户有应用程序,它很容易,比我决定由sourceApplication 但是当没有(没有本地Facebook帐户链接,没有FB应用程序,没有GooglePlus应用程序),它链接到浏览器:(我不知道它是否来自Facebook或谷歌

有没有办法如何决定要拨打什么?像

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

    } 

} 

回答

29

我们并不需要明确地需要查询的网址,下面的代码做的: -

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

达哦(这应该是公认的答案)。 –

+0

是的,这是完美的答案+1 – ashokdy

+0

一个快捷版? – DeyaEldeen

-2
+0

没有,那不是正确的,不相关的我的问题 –

+1

'canOpenURL'首先,允许你告诉哪些应用安装在设备上。您可以检查URL的前缀以确定它来自哪个服务。 Facebook应用的URL将以'fb开头:' – Idles

+0

@Idle记住这是回调方法。如果你的应用程序同时支持Facebook和谷歌地址,canOpenUrl总是返回两个“YES”。你是对的,你可以检查的URL,但通常库有一个handleURL:方法,为您返回一个布尔值。除非你想自己做魔法,否则你不必打扰自己。 – MrJre

5

你可以尝试以下方法:

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; 

调用上述方法在

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

appDelegeate.m

基本上,要做的是检查url前缀,然后调用google +方法,前提是url前缀是ur google + bundle id,如果没有,则调用fb方法。 希望这有助于

+0

您可以选择测试URL的方案以“fb”开头,这会使代码应用ID独立。 – jmdecombe

+0

天才,我无法为我的生活找出为什么只有FB或G +工作,从来没有在同一时间 – 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

为SWIFT用户(发件人user2144179想法)

导入框架下面

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

并在您的委托方法

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

或者如果您的目标为9.0+,则可以使用其他'open url:'方法。 SDK也包含一个方法。

火力地堡参考:https://firebase.google.com/docs/auth/ios/google-signin

Facebook的参考:https://developers.facebook.com/docs/swift/reference/classes/applicationdelegate.html

0

的方法 “申请:的OpenURL:sourceApplication:注释:” 是从iOS9弃用。所以现在你可以使用像。

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