Ios 处理openURL:使用Facebook和Google

Ios 处理openURL:使用Facebook和Google,ios,facebook,cocoa-touch,oauth-2.0,Ios,Facebook,Cocoa Touch,Oauth 2.0,我的应用程序中的用户可以使用两种服务登录:Facebook或Google 但是,在以下情况下,一切正常: - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation: (id)annotation { ... } 我应该决定调用Facebook回调或Google回调 如果用户有应用程序,这比

我的应用程序中的用户可以使用两种服务登录:Facebook或Google

但是,在以下情况下,一切正常:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation: (id)annotation {
    ...
}
我应该决定调用Facebook回调或Google回调

如果用户有应用程序,这比我根据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];

    }

}

您将要使用

您可以尝试以下操作:

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;
在您的
appdelegate.m

基本上,这将要做的是检查url前缀,然后调用google+方法(如果url前缀是ur google+bundle id),如果不是,它将调用fb方法。
希望这对我们有所帮助,我们不需要显式地检查URL,下面的代码可以做到这一点:-

- (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;
}
对于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也包括一个方法

Firebase参考:

Facebook参考:

iOS9不推荐使用“application:openURL:sourceApplication:annotation:”方法。因此,现在您可以使用like

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

您可以在Swift 4.2版本中尝试以下操作:

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool 
{
    if (url.scheme?.hasPrefix("fb"))! {
        return SDKApplicationDelegate.shared.application(app, open: url, options: options)
    } 
    else
    {
        return GIDSignIn.sharedInstance().handle(url as URL?, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String,
                                                                 annotation: options[UIApplicationOpenURLOptionsKey.annotation])
    }           
}

您可以让Google SDK或Facebook SDK尝试处理,如果SDK不处理,则允许其他SDK尝试:

    @available(iOS 9.0, *)
private func application(_ application: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any])
    -> Bool {
        let handled: Bool = SDKApplicationDelegate.shared.application(application, open: url, options: options)

        if handled { return handled }

        return GIDSignIn.sharedInstance().handle(url,
                                                 sourceApplication:options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String,
                                                 annotation: [:])
}

//deprecated method iOS 8 and older
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
    let handled: Bool =  SDKApplicationDelegate.shared.application(application,
                                                                   open: url,
                                                                   sourceApplication: sourceApplication,
                                                                   annotation: annotation)

    if handled { return handled }

    return GIDSignIn.sharedInstance().handle(url,
                                             sourceApplication: sourceApplication,
                                             annotation: annotation)
}

iOS 9.0及以上版本的公认答案的Swift版本可能是这样的:

import FacebookCore

[...]

    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        if (GIDSignIn.sharedInstance().handle(url)) {
            return true
        } else if (ApplicationDelegate.shared.application(app, open: url, options: options)) {
            return true
        }

        return false
    }
尝试用每个SDK处理URL,第一个识别URL的SDK在执行结束时返回true。如果没有SDK可以处理URL,则返回false

我希望它能帮助别人


哈维

这可能是最简单的解决方案

import GoogleSignIn
import FBSDKCoreKit

    func application(_ application: UIApplication,
                 open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
    if GIDSignIn.sharedInstance().handle(url) {
        return true
    } else if ApplicationDelegate.shared.application(application, open: url, sourceApplication: sourceApplication, annotation: annotation) {
        return true
    }
    
    return false
}

@available(iOS 9.0, *)
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any]) -> Bool {
    if GIDSignIn.sharedInstance().handle(url) {
        return true
    } else if ApplicationDelegate.shared.application(app, open: url, sourceApplication: options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String, annotation: options[UIApplication.OpenURLOptionsKey.annotation]
        ) {
        return true
    }
    return false
}

canOpenURL
首先,允许您判断设备上安装了哪些应用程序。您可以检查URL的前缀以确定它来自哪个服务。Facebook应用程序的URL将以
fb:
@Idles开头请记住,这是回调方法。如果您的应用程序同时支持Facebook和google URL,
canOpenURL
总是为这两个返回
YES
。您可以检查url,这是对的,但通常库有一个handleURL:方法可以为您返回布尔值。除非您想自己变魔术,否则您不必自找麻烦。您可以交替测试url的方案是否以“fb”开头,这将使代码应用程序ID独立。天才,我一辈子都不明白为什么只有FB或G+在工作,尽管它给出了答案的解决方案,但从来都不能同时工作。最好解释一下我认为错误的代码,因为谷歌和Facebook在所有情况下都处理url…这应该是条件al,就像在接受回答中为facebook URL添加前缀检查一样
import FacebookCore

[...]

    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        if (GIDSignIn.sharedInstance().handle(url)) {
            return true
        } else if (ApplicationDelegate.shared.application(app, open: url, options: options)) {
            return true
        }

        return false
    }
import GoogleSignIn
import FBSDKCoreKit

    func application(_ application: UIApplication,
                 open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
    if GIDSignIn.sharedInstance().handle(url) {
        return true
    } else if ApplicationDelegate.shared.application(application, open: url, sourceApplication: sourceApplication, annotation: annotation) {
        return true
    }
    
    return false
}

@available(iOS 9.0, *)
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any]) -> Bool {
    if GIDSignIn.sharedInstance().handle(url) {
        return true
    } else if ApplicationDelegate.shared.application(app, open: url, sourceApplication: options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String, annotation: options[UIApplication.OpenURLOptionsKey.annotation]
        ) {
        return true
    }
    return false
}