it-swarm.com.de

Das Facebook-Login wird immer als abgebrochen angezeigt. (iOS Swift)

Ich versuche gerade, Facebook-Login mit der 4.0-Version des SDK zu implementieren. Dies geschieht auch mit der 3. + -Version. Wenn ich logInWithReadPermissions (Version 4.0) oder openActiveSessionWithReadPermissions (3. + Version) anrufe. Der Abschluss/Block wird sofort mit isCancelled (Version 4.0) und ClosedFailedLogin (3. + Version) aufgerufen, bevor der Benutzer eine Auswahl treffen kann ( cancel oder ok ). Ich dachte, es könnte ein Problem mit dem URL-Schema in meinen Plist-Einstellungen sein, aber ich habe es immer wieder geprüft und alles scheint richtig zu sein. Ich frage mich nur, ob jemand Ideen zur Lösung dieses Problems hat. Meine Bundle-ID ist richtig, die einmalige Anmeldung ist aktiviert, die native App ist in der Facebook-Dev-Konsole aktiviert. Nachfolgend finden Sie einige Beispielcodes und Konfigurationen (Version 4.0).

Login-Aufruf: Login Call

AppDelegate: AppDelegate

Plist: Plist

18
Earl Ferguson

Ich hatte ein Problem, fand aber eine Problemumgehung. Sie können das Anmeldeverhalten des Login Managers so einstellen, dass die Facebook-Details auf dem Telefon verwendet werden. Das Standardverhalten ist FBSDKLoginBehaviorSystemNative. Hierbei wird zunächst versucht, die Facebook-App zu verwenden. Andernfalls wird ein Web-Modal verwendet.

Anstatt dies so zu tun und URLs weiterzugeben, die scheinbar nicht funktionieren, können Sie das Anmeldeverhalten als FBSDKLoginBehaviorSystemAccount festlegen. 

Lange Geschichte kurz, versuchen Sie:

let fbLoginManager = FBSDLoginManager();
fbLoginManager.loginBehavior = FBSDKLoginBehaviorSystemAccount;
// call login method of choice here
8
SasukeIsCool

Mit Facebook SDK Version 4 musste ich dies nur zu meinem Anwendungsdelegierten unter iOS 10 und Swift 3 hinzufügen, damit die Authentifizierung funktioniert. Vorher hatte ich auch nur Logins abgesagt.

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    return SDKApplicationDelegate.shared.application(app, open: url, options: options)
}
13
Philipp Otto

Ich habe das gleiche Problem Login-Methode immer zurück canacelled dann füge ich unten Dinge in 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>

und in AppDelegate update didFinishLaunching und fügen Sie eine neue Methode hinzu (siehe unten)

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)
}   

Die Anmeldemethode ist unten angegeben: 

@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...
        }
    }
}

es funktioniert für mich in Swift 3.0 und SDK 4.17.0 , ich hoffe es klappt für dich Danke.

6

Haben Sie AppDelegate um eine Funktion erweitert?

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {
        return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
}
5
Ivan

Ich habe auch diese Ausgabe bekommen. Es stellte sich heraus, dass die App-Bundle-ID (in der Projektkonfiguration) nicht mit der im Facebook-App-Dashboard konfigurierten App-Bundle-ID übereinstimmt. Nachdem die Bundle-ID korrigiert wurde, funktionierte das Login einwandfrei. 

Hoffe das hilft jemandem.

3
Med Hajlaoui

Ich hatte ein sehr ähnliches Problem beim Hinzufügen von LoginButton in meiner App durch Befolgen dieses Tutorials → https://developers.facebook.com/docs/Swift/login .

Nachdem Sie auf die Facebook Connect-Schaltfläche geklickt und die Autorisierung abgeschlossen haben, wird der Status "Abgebrochen" angezeigt. Ich habe viele Lösungen ausprobiert, und schließlich funktionierte Folgendes:

Fügen Sie in AppDelegate.Swift die folgenden 2 Funktionen hinzu:

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)
}
3
Kai-jie Ke

Ich habe festgestellt, dass die falsche AppDelegate-Methode aufgerufen wurde. Es hat gerufen

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

anstatt 

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {...

Also musste ich dies der ersten AppDelegate-Methode hinzufügen (der Methode, die aufgerufen wurde):

return FBSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication: "com.Apple.mobilesafari", annotation: nil)

Beachten Sie, dass ich die Safaribündel-ID explizit übergeben musste, andernfalls würde der FB-Kontodelegierte isCancelled = true erhalten.

2
johnnyclem

Ich habe dieses Problem auch in den letzten 1 Monat gesehen. Ich habe Facebook Login mit Firebase in ios 10 Swift 3 integriert. Zum Schluss kann ich es erfolgreich implementieren. Ich habe es korrigiert, indem ich folgende Änderungen in der AppDelegate-Datei vorgenommen habe.

 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
    }

Ich hoffe es hilft anderen 

getestet am ios 10.2 Emulator, iPhone 6 Plus mit 10.2

1
twister_void

Mein Problem wurde dadurch verursacht, dass ich modisch einen Lade-View-Controller präsentierte, den ich jedoch entlassen hatte, als die Ansicht verschwand. Da FBSDK beim Wechseln zu Safari oder der App die viewWillDisappear-Methode aufruft, wurden die Ansicht und der FB-Anmeldebildschirm geschlossen. Dasselbe kann passieren, wenn Sie den Login über einen UIAlertController präsentieren.

1
Zach

In meinem Fall, dass React-Native, FacebookSDK und Deeplink zusammen verwendet werden, brauche ich nur eine openUrl in AppDelegate.m. Weitere Details finden Sie in https://github.com/facebook/react-native-fbsdk/blob/master/README.md#32-ios-project

0
Phan Hai Quang

Ich hatte das gleiche Problem. Nicht mischen FBSDKApplicationDelegate und SDKApplicationDelegate

Mit dem nächsten Swift 4-Code in AppDelegate gelöst:

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
}
0
Nadzeya