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

Posted

技术标签:

【中文标题】iOS:同时使用 Facebook 和 Google,Google Plus 登录【英文标题】:iOS: Using both Facebook and Google, Google Plus sign in 【发布时间】:2014-10-12 06:05:11 【问题描述】:

早上好,

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

Facebook 告诉我输入以下代码:

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

    return [FBAppCall handleOpenURL:url
                  sourceApplication:sourceApplication];

Google 还告诉我输入以下内容:

- (BOOL)application: (UIApplication *)application
            openURL: (NSURL *)url
  sourceApplication: (NSString *)sourceApplication
         annotation: (id)annotation 
    return [GPPURLHandler handleURL:url
                  sourceApplication:sourceApplication
                         annotation:annotation];

而且我不能拥有相同名称的相同功能,也不能将一个功能集成到另一个内部。这就是为什么我需要你的帮助,因为我不知道如何处理这些准则之间的这个问题。

提前致谢。

【问题讨论】:

【参考方案1】:

在这里,您必须在返回之前检查 [url scheme]。示例代码如下。

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

    

希望它能解决你的问题..

【讨论】:

感谢您的帮助。你能解释一下你的代码吗?因为这是我的第一个应用程序,我有点迷茫......非常感谢。 嗨@WirajPS 如果你只是 NSLog url 方案或只是在执行 facebook 登录或 google 登录后-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 中的 url。您将能够在 facebook 登录后检查 url 方案,并且 google 登录会有所不同。希望你明白我的意思。如有疑问请回复.. 再次感谢 Sreejith。我必须在“FACEBOOK_SCHEME”中添加什么? 这里 FACEBOOK_SCHEME 和 GOOGLE_PLUS_SCHEME 是常量。FACEBOOK_SCHEME 就像 fb 附加了您的 facebook api 密钥,而 GOOGLE_PLUS_SCHEME 将是您的捆绑包 ID。希望您在 NSLog [url scheme] 时会显示出来。【参考方案2】:

这是 Swift 中的版本。

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

    Facebook URL 模式:fb1106884526040279://authorize/... fb1106884526040279 是您的应用程序 ID。所以你只需要检查这个url是否以你的应用ID开头,主机是否等于authorize//之后的字符串和第一个/

    Google URL Pattern: com.googleusercontent.apps.803921065829-m34o26vcj57oirk1oa8pqve5o22qdihn 所以你只需要检查这个 url 是否以 com.googleusercontent.apps 开头。

根据上面的解释,我已经泛化成GoogleAuthFacebookAuth utils类,并带有一些小方法,例如注销,检查登录...

这里是Google Authentication 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.")
    

其次是Facebook Authentication Utils

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 中,您调用isValidateWithUrl 方法来检查此网址是否来自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
        
    

希望得到帮助:)

【讨论】:

以上是关于iOS:同时使用 Facebook 和 Google,Google Plus 登录的主要内容,如果未能解决你的问题,请参考以下文章

装有 iOS 5 和 iOS 6 的 Facebook

使用 iOS9 重新编译时,Facebook 正在返回任何内容

同一应用中不同版本的 Facebook iOS SDK 和 Audience Network iOS SDK

用户登录后如何使用社交 API(如 facebook)将数据存储在数据库中

无法设置 Facebook 登录

适用于 iOS 的 Facebook SDK 不会随链接一起发布照片