使用Swift 3的FBlogin不会返回任何值,并且在成功login后不会返回用户到应用程序

我正在使用iOS 10 Swift 3来集成FB Login 。 我遵循了Facebook文档中的所有步骤。 现在的问题是,成功login后,它不会返回任何值,也不会让用户回到应用程序。

注意:在Swift 2完全一样。

嗨,我提出这个问题的Facebook开发人员的支持,问题是,我没有实现iOS10的正确的委托方法。 你可以在这里find正确的委托实现

 import UIKit import CoreData @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? public func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool { // Override point for customization after application launch. return FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions) } public func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { return FBSDKApplicationDelegate.sharedInstance().application( app, open: url as URL!, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String, annotation: options[UIApplicationOpenURLOptionsKey.annotation] ) } public func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool { return FBSDKApplicationDelegate.sharedInstance().application( application, open: url as URL!, sourceApplication: sourceApplication, annotation: annotation) } } 

对于我来说,“FBSDKApplicationDelegate”不适用于最新的Facebook Swift SDK版本v0.2.0

你可以在这里find我的v0.2.2的实现: https ://gist.github.com/mbecker/bdbd28cd11394085c01cf442aaa42c72

 // // AppDelegate.swift // // Created by Mats Becker on 9/25/16. // Copyright © 2016 safari.digital. All rights reserved. // import UIKit import FacebookCore @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. return SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions) } func applicationWillResignActive(_ application: UIApplication) { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. } func applicationDidEnterBackground(_ application: UIApplication) { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. } func applicationWillEnterForeground(_ application: UIApplication) { // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. } func applicationDidBecomeActive(_ application: UIApplication) { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. // Call the 'activate' method to log an app event for use // in analytics and advertising reporting. AppEventsLogger.activate(application) } func applicationWillTerminate(_ application: UIApplication) { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. } public func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { return SDKApplicationDelegate.shared.application( app, open: url as URL!, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String, annotation: options[UIApplicationOpenURLOptionsKey.annotation] ) } public func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool { return SDKApplicationDelegate.shared.application( application, open: url as URL!, sourceApplication: sourceApplication, annotation: annotation ) } } 

不要忘记设置钥匙串共享项目目标 – >function – >钥匙串共享 – >切换开关

钥匙串共享状态

你可以按照这个http://ashishkakkad.com/2015/05/facebook-login-swift-language-ios/

Evn:iOS 10,XCode 8.3.2,Swift 3,facebook-sdk-swift-0.2.0testing和工作。

由于上面的答案被指定为不推荐的代码,所以我改变了语法。

https://gist.github.com/jgchoi/097b59d85d6b378a81925be93a62fef9

 import UIKit import FacebookCore @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? public func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool { // Override point for customization after application launch. return SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions) } public func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { return SDKApplicationDelegate.shared.application(app, open: url, options: options) } public func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool { return SDKApplicationDelegate.shared.application(application, open: url) } } } 

我经历了与Facebook和Twitter整合相同的问题。我已经解决了如下。

 func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { let appname:String = options.first?.value as! String print(appname) if appname == "com.facebook.Facebook" { return FBSDKApplicationDelegate.sharedInstance().application( app, open: url as URL!, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String, annotation: options[UIApplicationOpenURLOptionsKey.annotation] ) } return Twitter.sharedInstance().application(app, open: url, options: options) }