Подтвердить что ты не робот

Вход в систему Google с помощью входа в Facebook

Я использую Вход в Google и Facebook Login для входа в Google и Facebook в моем приложении.

Проблема заключается в том, что когда я использую их оба - Экран входа в Facebook (на основе Safari View Controller) не удаляется после входа пользователя в систему.

После долгих мучительных отладок я обнаружил, что проблема возникает только в том случае, если я инициализирую вход в систему Google перед тем, как показывать приглашение для входа в Facebook.

В принципе, это одна строка.

GGLContext.sharedInstance().configureWithError(&configureError)

Если я прокомментирую эту строку - Facebook-аккаунт работает нормально.

EDIT: Это то, что у меня есть в приложении AppDelegate.swift:

 func application(application: UIApplication, openURL url: NSURL, options: [String: AnyObject]) -> Bool {
        return FBSDKApplicationDelegate.sharedInstance().application(application,
                                                                openURL: url,
                                                                sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as! String,
                                                                annotation: options [UIApplicationOpenURLOptionsAnnotationKey])

И грустно то, что этот метод вообще не вызывается. Но если я отключу Google Login - он отлично работает.

Дополнительная информация: Я использую Facebook SDK v4.12.0 и Google Sign-In SDK v4.0.0

Версия Xcode 7.3.1 (7D1014), протестированная на iOS 9.3

Любые идеи приветствуются.

4b9b3361

Ответ 1

Хорошо, в конце концов, я понял это. Трюк, который работал у меня, заключается в том, чтобы инициализировать SDK для входа в Google до SDK для Facebook.

теперь мой AppDelegate выглядит следующим образом:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    // Initialize google sign-in
    var configureError: NSError?
    GGLContext.sharedInstance().configureWithError(&configureError)
    assert(configureError == nil, "Error configuring Google services: \(configureError)")

    // init FB SDK
    FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)

  return true
  }

Ответ 2

Я также использую оба входа в google и facebook, и он работает нормально. Вы должны использовать метод ниже   func application(application: UIApplication, openURL url: NSURL, sourceApplication: String, annotation: AnyObject) -> Bool как

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String, annotation: AnyObject) -> Bool {

       if url.absoluteString().containsString("FACEBOOK_ID") {
             return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
       }
       else {
           return GIDSignIn.sharedInstance().handleURL(url, sourceApplication: sourceApplication, annotation: annotation)
       }
}

Ответ 3

Если вы используете документацию Google для интеграции своей системы auth, не используйте этот метод:

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    var returnVal = false
    if #available(iOS 9.0, *) {
        returnVal = GIDSignIn.sharedInstance().handle(url,sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String,annotation: options[UIApplicationOpenURLOptionsKey.annotation])
    } else {
        returnVal = false
    }
    return returnVal
}

Это должно работать, чтобы избежать конфликтов с iOS 9, но как только я удалил это, журнал fb работал, и журнал google работал на устройстве iOS 9.

Надеюсь, что это поможет любому.

Ответ 4

В Swift 3 (iOs 10) просто делайте так: (он отлично работал у меня)

        func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {

// FACEBOOK            
let handled = FBSDKApplicationDelegate.sharedInstance().application(app, open: url, options: options)

// GOOGLE
GIDSignIn.sharedInstance().handle(url,
                                                     sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String,
                                                     annotation: options[UIApplicationOpenURLOptionsKey.annotation])
        return handled
    }

Ответ 5

Это работало на Swift 3: у меня был Facebook и Google Login на той же странице.

 @available(iOS 9.0, *)
    func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
        print( " open URL : \(url.absoluteURL.absoluteString)")

        if url.absoluteURL.absoluteString.contains("fb728991920603705") //Facebook ID from Plist
        {
            print("contain FB ID")
            return FBSDKApplicationDelegate.sharedInstance().application(app, open: url, options: options)

        }
        else {
            let result = GIDSignIn.sharedInstance().handle(url,
                                                           //added exclamation mark
                sourceApplication: String(describing: options[UIApplicationOpenURLOptionsKey.sourceApplication]!),
                annotation: options[UIApplicationOpenURLOptionsKey.annotation])
            return result
        }
    }

Ответ 6

Я только что реализовал этот код, используя последние версии флешек Facebook и Google и Swift 3.1, и он отлично поработает!

    func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {

    if url.absoluteString.contains("facebook") {
        return FBSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String, annotation: [:])
    } else {
        return GIDSignIn.sharedInstance().handle(url,
                                                 sourceApplication:options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String,
                                                 annotation: [:])
    }
}

Ответ 7

У меня также была та же проблема. Так что на самом деле google и facebook login используют тот же метод для входа в систему. Таким образом, вы можете открывать по одному за раз.

Шаг 1: Возьмите одну переменную bool на appdelegate.h

@property (nonatomic, assign) BOOL isFacebook;

Шаг 2: Appdelegate.m

- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary *)options {
    if(self.isFacebook == NO)
    return [[GIDSignIn sharedInstance] handleURL:url
                               sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
                                      annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
    else
        return [[FBSDKApplicationDelegate sharedInstance] application:app
                                                              openURL:url
                                                    sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
                                                           annotation:options[UIApplicationOpenURLOptionsAnnotationKey]
                ];
}

Шаг 3:

Наконец, установите bool yes или no.

//when click on google button set facebook no
- (IBAction)googleBtnAction:(UIButton *)sender {

    [APPDELEGATE setIsFacebook:NO];
//your own code
}

//when click on facebook set Yes to bool
-(void)fbButtonClicked {

    [APPDELEGATE setIsFacebook:YES];
//your own code
}