Вход в 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
}