Вход в Facebook всегда возвращается как отмененный. (iOS Swift)
В настоящее время я пытаюсь выполнить вход в Facebook, используя версию SDK 4.0, это также происходит с версией 3.+. Когда я вызываю logInWithReadPermissions (версия 4.0) или openActiveSessionWithReadPermissions (3. + версия). Закрытие/блок немедленно вызывается с isCancelled (версия 4.0) и ClosedFailedLogin (3. + версия), прежде чем пользователь сможет сделать выбор (отменить или ok). Я думал, что это может быть проблема с URL-схемой в моих настройках plist, но я проверял ее снова и снова, и все кажется правильным. Просто интересно, есть ли у кого-нибудь идеи по решению этой проблемы. Мой идентификатор Bundle прав, один сингл включен, встроенное приложение включено, в консоли Facebook dev. См. Пример кода и конфигурации ниже (версия 4.0).
Вход в систему:
![Login Call]()
AppDelegate:
![AppDelegate]()
Plist:
![Plist]()
Ответы
Ответ 1
У меня была какая-то проблема, но я нашел обходной путь. Вы можете настроить поведение входа в систему диспетчера входа, чтобы использовать данные Facebook на телефоне. Поведение по умолчанию - FBSDKLoginBehaviorSystemNative, которое сначала пытается использовать приложение Facebook, а затем, если его там нет, использует веб-модал.
Вместо того, чтобы делать это таким образом и передавать URL-адреса, которые, кажется, не работают, вы можете установить поведение входа в систему как FBSDKLoginBehaviorSystemAccount.
Короче говоря, попробуйте:
let fbLoginManager = FBSDKLoginManager();
fbLoginManager.loginBehavior = FBSDKLoginBehaviorSystemAccount;
// call login method of choice here
Ответ 2
С версией 4 SDK для Facebook мне пришлось добавить это в свой делегат приложения на iOS 10 и Swift 3, чтобы сделать работу по аутентификации. До этого я также только отменил логины.
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
return SDKApplicationDelegate.shared.application(app, open: url, options: options)
}
Ответ 3
У меня тот же метод входа в систему всегда возвращает canacelled, тогда я добавляю ниже вещи в info.plist
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>akamaihd.net</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
<key>facebook.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
<key>fbcdn.net</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
</dict>
</dict>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>fbapi</string>
<string>fb-messenger-api</string>
<string>fbauth2</string>
<string>fbshareextension</string>
</array>
и в AppDelegate обновить метод didFinishLaunching и добавить новый метод, как показано ниже
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
return SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions)
}
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool
{
return SDKApplicationDelegate.shared.application(app, open: url, options: options)
}
Метод входа приведен ниже:
@objc func loginButtonClicked() {
let loginManager = LoginManager()
loginManager.loginBehavior = .systemAccount
loginManager.logIn([ .publicProfile,.userFriends,.email ], viewController: self) { loginResult in
switch loginResult {
case .failed(let error):
print(error)
case .cancelled:
print("User cancelled login.")
case .success(let grantedPermissions, let declinedPermissions, let accessToken):
print("Logged in!")
//Do further code...
}
}
}
он работает для меня в Swift 3.0 и SDK 4.17.0, я надеюсь, что он сработает для вас. Спасибо.
Ответ 4
Вы добавили функцию в AppDelegate?
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {
return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
}
Ответ 5
У меня тоже есть эта проблема. Оказалось, что идентификатор пакета приложения (в конфигурации проекта) несовместим с идентификатором пакета приложений, настроенным на панели инструментов приложения facebook. После исправления идентификатора пакета логин работал просто отлично.
Надеюсь, это поможет кому-то.
Ответ 6
У меня была очень схожая проблема при добавлении LoginButton в мое приложение, следуя этому руководству: https://developers.facebook.com/docs/swift/login.
После нажатия кнопки Facebook Connect и завершения авторизации он всегда возвращается со статусом "отменен".
Я пробовал много решений и, наконец, работал:
В AppDelegate.swift добавьте следующие 2 функции:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
return SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions)
}
func application(_ application: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
return SDKApplicationDelegate.shared.application(application, open: url, options: options)
}
Ответ 7
Я обнаружил, что был вызван неправильный метод AppDelegate. Он звонил
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {...
вместо
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {...
Поэтому мне пришлось добавить это в первый метод AppDelegate (тот, который вызывается):
return FBSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication: "com.apple.mobilesafari", annotation: nil)
Обратите внимание, что я должен был передать идентификатор пакета сафари явно, иначе делегат учетной записи FB получит isCancelled = true
Ответ 8
Я также столкнулся с этой проблемой за последние 1 месяц. Я интегрировал логин facebook с firebase в ios 10 swift 3. Наконец, я могу успешно его реализовать. Я исправил его, внеся следующие изменения в файл AppDelegate.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
FIRApp.configure()
FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
return true
}
@available(iOS 9.0, *)
func application(_ application: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any])
-> Bool {
var shouldOpen :Bool = FBSDKApplicationDelegate.sharedInstance().application(application, open: url, sourceApplication:options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String!,annotation: options[UIApplicationOpenURLOptionsKey.annotation])
return shouldOpen
}
// for iOS below 9.0
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
var shouldOpen :Bool = FBSDKApplicationDelegate.sharedInstance().application(application,open: url as URL!,sourceApplication: sourceApplication,annotation: annotation)
return shouldOpen
}
Я надеюсь, что это может помочь другим
тестируется на ios 10.2 Emulator, iPhone 6 Plus работает с 10.2
Ответ 9
Моя проблема была вызвана тем, что я представил текстовый контроллер загрузки, который меня уволил, когда представление исчезло. Поскольку FBSDK вызывает метод viewWillDisappear при переходе на Safari или в приложение, он закрывает экран просмотра и FB. То же самое может произойти, если вы представите логин через UIAlertController.
Ответ 10
Я была такая же проблема. Не смешивайте FBSDKApplicationDelegate и SDKApplicationDelegate
Решено с помощью следующего кода Swift 4 в AppDelegate:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions)
return true
}
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
let appId = SDKSettings.appId
if url.scheme != nil && url.scheme!.hasPrefix("fb\(appId)") && url.host == "authorize" { // facebook
return SDKApplicationDelegate.shared.application(app, open: url, options: options)
}
return false
}
Ответ 11
В моем случае, когда используются React-Native, FacebookSDK и Deeplink вместе, мне нужно иметь только один openUrl внутри AppDelegate.m. Более подробное объяснение в https://github.com/facebook/react-native-fbsdk/blob/master/README.md#32-ios-project