Вход в систему 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
Любые идеи приветствуются.
Ответы
Ответ 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
}