iOS:使用Facebook和Google,Google Plus登录

iOS:使用Facebook和Google,Google Plus登录,ios,swift,facebook,google-plus,google-signin,Ios,Swift,Facebook,Google Plus,Google Signin,早上好 我正在尝试在同一视图中实现Facebook登录(工作正常)和google plus登录。我遵循官方网站(Google)的指南,但Facebook按钮和Google plus按钮之间存在一个问题: Facebook让我输入以下代码: -(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(i

早上好

我正在尝试在同一视图中实现Facebook登录(工作正常)和google plus登录。我遵循官方网站(Google)的指南,但Facebook按钮和Google plus按钮之间存在一个问题:

Facebook让我输入以下代码:

-(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];
}
我不能用同一个名字拥有相同的函数,也不能将一个函数集成到另一个函数中。这就是为什么我需要你的帮助,因为我不知道如何在这些指南之间处理这个问题


提前感谢。

在这里,您必须在返回之前检查[url方案]。下面是示例代码

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 
{ 
    NSLog("%@", [url scheme]); 

    if([[url scheme] isEqualToString:FACEBOOK_SCHEME]) 
    {  

        return [FBAppCall handleOpenURL:url sourceApplication:sourceApplication];

    }
    else if([[url scheme] isEqualToString:GOOGLE_PLUS_SCHEME]) 
    {  

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

    }
}

希望它能解决您的问题。

这是Swift中的版本

首先,您应该了解如何看待Google和Facebook返回url之间的差异。检测算法为:

  • Facebook URL模式:
    fb1106884526040279://authorize/…
    with
    fb1106884526040279
    是您的应用程序id。因此您只需检查此URL是否以您的应用程序id开头,主机是否等于
    authorize
    (在
    /
    之后的字符串和第一个
    //code>)

  • 谷歌URL模式:
    com.googleusercontent.apps.803921065829-m34o26vcj57oirk1oa8pqve5o22qdihn
    ,因此您只需检查此URL是否以
    com.googleusercontent.apps
    开头

  • 基于以上的解释,我将其归纳为
    GoogleAuth
    FacebookAuth
    utils类,并使用了一些小方法,如注销、检查登录

    这里是
    Google认证Utils

    import Google
    
    class GoogleAuth {
    
        static func getInstance() -> GIDSignIn {
            return GIDSignIn.sharedInstance()
        }
    
        static func isLogin() -> Bool {
            return getInstance().hasAuthInKeychain()
        }
    
        static func signOut() {
            getInstance().signOut()
        }
    
        static func isValidatedWithUrl(url: NSURL) -> Bool {
            return url.scheme.hasPrefix(NSBundle.mainBundle().bundleIdentifier!) || url.scheme.hasPrefix("com.googleusercontent.apps.")
        }
    }
    
    import FBSDKLoginKit
    
    class FacebookAuth {
        static func isLogin() -> Bool {
           return FBSDKAccessToken.currentAccessToken() != nil
        }
    
        static func signOut() {
           FBSDKLoginManager().logOut()
        }
    
        static func isValidatedWithUrl(url: NSURL) -> Bool {
            return url.scheme.hasPrefix("fb\(FBSDKSettings.appID())") && url.host == "authorize"
        }
    }
    
    其次是
    Facebook身份验证Utils

    import Google
    
    class GoogleAuth {
    
        static func getInstance() -> GIDSignIn {
            return GIDSignIn.sharedInstance()
        }
    
        static func isLogin() -> Bool {
            return getInstance().hasAuthInKeychain()
        }
    
        static func signOut() {
            getInstance().signOut()
        }
    
        static func isValidatedWithUrl(url: NSURL) -> Bool {
            return url.scheme.hasPrefix(NSBundle.mainBundle().bundleIdentifier!) || url.scheme.hasPrefix("com.googleusercontent.apps.")
        }
    }
    
    import FBSDKLoginKit
    
    class FacebookAuth {
        static func isLogin() -> Bool {
           return FBSDKAccessToken.currentAccessToken() != nil
        }
    
        static func signOut() {
           FBSDKLoginManager().logOut()
        }
    
        static func isValidatedWithUrl(url: NSURL) -> Bool {
            return url.scheme.hasPrefix("fb\(FBSDKSettings.appID())") && url.host == "authorize"
        }
    }
    
    这里是主要部分。在
    AppDelegate
    中,调用
    isvalidatewithur
    方法检查此url是否来自Google或Facebook

    func application(application: UIApplication, openURL url: NSURL, options: [String: AnyObject]) -> Bool {
            print("step 2 of OAuth2. Url: \(url)")
    
            // url from google
            if GoogleAuth.isValidatedWithUrl(url) {
                return GIDSignIn.sharedInstance().handleURL(
                        url,
                        sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as? String,
                        annotation: options[UIApplicationOpenURLOptionsAnnotationKey])
            }
            // url from facebook
             else if FacebookAuth.isValidatedWithUrl(url) {
                 return FBSDKApplicationDelegate.sharedInstance().application(application,
                        openURL: url,
                        sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as! String,
                        annotation: options [UIApplicationOpenURLOptionsAnnotationKey])
            }
            // application hasn't supported this url yet
            else {
                  return false
            }
        }
    

    希望能帮上忙:)

    谢谢你的帮助。你能解释一下你的代码吗?因为这是我的第一个应用,我有点迷路了。。。非常感谢。如果您在执行facebook登录或google登录后,只在
    -(BOOL)应用程序:(UIApplication*)应用程序openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation
    ,请登录NSLog url方案或url。你将能够检查后,facebook登录和谷歌登录将是不同的url方案。希望你明白我的意思。如果您有疑问,请回复。再次感谢您。我必须在“FACEBOOK\u方案”中添加什么?这里FACEBOOK\u方案和GOOGLE\u PLUS\u方案是常量。FACEBOOK\u方案将像fb一样附加您的FACEBOOK api密钥,GOOGLE\u PLUS\u方案将是您的捆绑包id。希望您在登录时显示。