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:
AppDelegate:
Plist:
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
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)
}
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.
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)
}
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.
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)
}
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.
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
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.
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
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
}