Facebook Login does not return to application when migrating to Swift 3

I created an example application in which a user logs in using the Facebook login button.

After logging in, I display the User Name and Email on Login screen. He worked with Swift 2.3. As soon as I switched to Swift 3, it stopped working.

  • Step1: Log in with Facebook Login Button
  • Step 2. Allow permissions for email and profile
  • Step 3: Here it should return to screen 1. But it is not. The attachment of the log I receive when I click the "OK" button.

Update 1: The app works fine on iOS 9.3. The problem only occurs on iOS 10 devices.

2016-06-19 08:30:09.300070 MyApp[13942:1214112] [] nw_endpoint_handler_start [4 graph.facebook.com:443 initial path (null)] 2016-06-19 08:30:09.300484 MyApp[13942:1214112] [] nw_connection_endpoint_report [4 graph.facebook.com:443 initial path (null)] reported event path:start 2016-06-19 08:30:09.301255 MyApp[13942:1214112] [] nw_connection_endpoint_report [4 graph.facebook.com:443 waiting path (satisfied)] reported event path:satisfied 2016-06-19 08:30:09.302664 MyApp[13942:1214112] [] nw_connection_endpoint_report [4 graph.facebook.com:443 in_progress resolver (satisfied)] reported event resolver:start_dns 2016-06-19 08:30:09.348956 MyApp[13942:1214130] [] nw_endpoint_resolver_update [4 graph.facebook.com:443 in_progress resolver (satisfied)] Adding endpoint handler for 31.13.79.246:443 2016-06-19 08:30:09.349570 MyApp[13942:1214130] [] nw_connection_endpoint_report [4 graph.facebook.com:443 in_progress resolver (satisfied)] reported event resolver:receive_dns 2016-06-19 08:30:09.350027 MyApp[13942:1214130] [] nw_endpoint_resolver_start_next_child [4 graph.facebook.com:443 in_progress resolver (satisfied)] starting child endpoint 31.13.79.246:443 2016-06-19 08:30:09.350564 MyApp[13942:1214130] [] nw_host_stats_add_src recv too small, received 24, expected 28 2016-06-19 08:30:09.351022 MyApp[13942:1214130] [] nw_endpoint_resolver_start_next_child [4 graph.facebook.com:443 in_progress resolver (satisfied)] starting next child endpoint in 250ms 2016-06-19 08:30:09.351479 MyApp[13942:1214130] [] nw_endpoint_handler_start [4.1 31.13.79.246:443 initial path (null)] 2016-06-19 08:30:09.351862 MyApp[13942:1214130] [] nw_connection_endpoint_report [4.1 31.13.79.246:443 initial path (null)] reported event path:start 2016-06-19 08:30:09.352596 MyApp[13942:1214130] [] nw_connection_endpoint_report [4.1 31.13.79.246:443 waiting path (satisfied)] reported event path:satisfied 2016-06-19 08:30:09.352915 MyApp[13942:1214130] [] __nwlog_err_simulate_crash_libsystem libsystem simulate crash unavailable, [libsystem_network.dylib: nw_endpoint_get_hostname :: incorrect endpoint type 1] 2016-06-19 08:30:09.353524 MyApp[13942:1214130] [] nw_endpoint_get_hostname incorrect endpoint type 1, dumping backtrace: [x86_64] libnetcore-805.0.0.2.2 0 libsystem_network.dylib 0x000000011186037f __nw_create_backtrace_string + 123 1 libsystem_network.dylib 0x000000011186246e nw_endpoint_get_hostname + 75 2 libnetwork.dylib 0x0000000112bc4be7 nw_endpoint_proxy_handler_should_use_proxy + 125 3 libnetwork.dylib 0x0000000112bd204f nw_endpoint_handler_path_change + 1509 4 libnetwork.dylib 0x0000000112bd18a2 nw_endpoint_handler_start + 570 5 libnetwork.dylib 0x0000000112be8026 nw_endpoint_resolver_start_next_child + 2050 6 libdispatch.dylib 0x00000001115b91e8 _dispatch_call_block_and_release + 12 7 libdispatch.dylib 0x00000001115e5dee _dispatch_client_callout + 8 8 libdispatch.dylib 0x00000001115c0a1d _dispatch_queue_serial_drain + 239 9 libdi 2016-06-19 08:30:09.357989 MyApp[13942:1214130] [] nw_connection_endpoint_report [4.1 31.13.79.246:443 in_progress socket-flow (satisfied)] reported event flow:start_connect 2016-06-19 08:30:09.468327 MyApp[13942:1214130] [] nw_endpoint_flow_protocol_connected [4.1 31.13.79.246:443 in_progress socket-flow (satisfied)] Output protocol connected 2016-06-19 08:30:09.469541 MyApp[13942:1214130] [] nw_endpoint_flow_connected_path_change [4.1 31.13.79.246:443 ready socket-flow (satisfied)] Connected path is satisfied 2016-06-19 08:30:09.470103 MyApp[13942:1214130] [] nw_connection_endpoint_report [4.1 31.13.79.246:443 ready socket-flow (satisfied)] reported event flow:finish_connect 2016-06-19 08:30:09.470858 MyApp[13942:1214130] [] nw_connection_endpoint_report [4 graph.facebook.com:443 ready resolver (satisfied)] reported event flow:finish_connect 2016-06-19 08:30:09.471427 MyApp[13942:1214130] [] nw_connection_endpoint_report [4.1 31.13.79.246:443 ready socket-flow (satisfied)] reported event flow:changed_viability 2016-06-19 08:30:09.471870 MyApp[13942:1214130] [] nw_connection_endpoint_report [4 graph.facebook.com:443 ready resolver (satisfied)] reported event flow:changed_viability 2016-06-19 08:30:09.472479 MyApp[13942:1214112] [] nw_endpoint_start_tls_while_connected [4.1 31.13.79.246:443 ready socket-flow (satisfied)] 2016-06-19 08:30:09.473243 MyApp[13942:1214112] [] nw_connection_endpoint_report [4.1 31.13.79.246:443 in_progress socket-flow (satisfied)] reported event flow:start_secondary_connect 2016-06-19 08:30:09.473685 MyApp[13942:1214112] [] nw_connection_endpoint_report [4 graph.facebook.com:443 in_progress resolver (satisfied)] reported event flow:start_secondary_connect 2016-06-19 08:30:09.474206 MyApp[13942:1214112] [] nw_connection_endpoint_report [4.1 31.13.79.246:443 in_progress socket-flow (satisfied)] reported event flow:start_connect 2016-06-19 08:30:09.474740 MyApp[13942:1214112] [] nw_connection_endpoint_report [4 graph.facebook.com:443 in_progress resolver (satisfied)] reported event flow:start_connect 2016-06-19 08:30:09.475123 MyApp[13942:1214112] [] nw_endpoint_flow_protocol_connected [4.1 31.13.79.246:443 in_progress socket-flow (satisfied)] Transport protocol connected 2016-06-19 08:30:09.475502 MyApp[13942:1214112] [] nw_connection_endpoint_report [4.1 31.13.79.246:443 in_progress socket-flow (satisfied)] reported event flow:finish_transport 2016-06-19 08:30:09.475834 MyApp[13942:1214112] [] nw_connection_endpoint_report [4 graph.facebook.com:443 in_progress resolver (satisfied)] reported event flow:finish_transport 2016-06-19 08:30:09.586843 MyApp[13942:1214130] [] nw_endpoint_flow_protocol_connected [4.1 31.13.79.246:443 in_progress socket-flow (satisfied)] Output protocol connected 2016-06-19 08:30:09.588117 MyApp[13942:1214130] [] nw_endpoint_flow_connected_path_change [4.1 31.13.79.246:443 ready socket-flow (satisfied)] Connected path is satisfied 2016-06-19 08:30:09.588724 MyApp[13942:1214130] [] nw_connection_endpoint_report [4.1 31.13.79.246:443 ready socket-flow (satisfied)] reported event flow:finish_connect 2016-06-19 08:30:09.589299 MyApp[13942:1214130] [] nw_connection_endpoint_report [4 graph.facebook.com:443 ready resolver (satisfied)] reported event flow:finish_connect 

Here is my code.

ViewController

 import UIKit import FBSDKCoreKit import FBSDKLoginKit import Firebase class ViewController: UIViewController, FBSDKLoginButtonDelegate{ // Properties @IBOutlet weak var usernameTextField: UITextField! @IBOutlet weak var usernameLabel: UILabel! @IBOutlet weak var submitButton: UIButton! @IBOutlet weak var fbLoginBtn: FBSDKLoginButton! var ref:FIRDatabaseReference! private let dataurl = "https://project-URL/" override func viewDidLoad() { super.viewDidLoad() self.ref = FIRDatabase.database().reference() fbLoginBtn.delegate = self fbLoginBtn.readPermissions = ["email"] // Do any additional setup after loading the view, typically from a nib. } //Actions @IBAction func onSubmitBtnPressed(_ sender: UIButton) { usernameLabel.text = usernameTextField.text; } func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: NSError!) { print("User Logged In") if ((error) != nil) { // Process error print("error") } else if result.isCancelled { // Handle cancellations print("cancelled") } else { // If you ask for multiple permissions at once, you // should check if specific permissions missing if result.grantedPermissions.contains("email") { let credential = FIRFacebookAuthProvider.credential(withAccessToken: FBSDKAccessToken.current().tokenString) // Do work print("logged in ") FIRAuth.auth()?.signIn(with: credential, completion: { (user, error) in if (user != nil) { let uid = user?.uid as String! self.fetchProfile(uid!); } }) } } } func loginButtonDidLogOut(_ loginButton: FBSDKLoginButton!) { print("User Logged Out") } func fetchProfile(_ uid: String) { let parameters = ["fields": "email, first_name, last_name, picture.type(large)"] var userinfo: [String:String] = [:] FBSDKGraphRequest(graphPath: "me", parameters: parameters).start(completionHandler: { (connection, user, requestError) -> Void in if requestError != nil { print(requestError) } userinfo["email"] = user?["email"] as? String userinfo["firstname"] = user?["first_name"] as? String userinfo["lastname"] = user?["last_name"] as? String self.ref.child("users").child(uid).setValue(userinfo) }) } } 

Appdelegate

 import UIKit import Firebase import FirebaseDatabase import FBSDKCoreKit import FBSDKLoginKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Override point for customization after application launch. // Use Firebase library to configure APIs FIRApp.configure() FIRDatabase.database().persistenceEnabled = true return FBSDKApplicationDelegate.sharedInstance() .application(application, didFinishLaunchingWithOptions: launchOptions) } func application(_ application: UIApplication, open url:URL,sourceApplication: String?, annotation: AnyObject) -> Bool { return FBSDKApplicationDelegate.sharedInstance() .application(application, open: url, sourceApplication: sourceApplication, annotation: annotation) } 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. FBSDKAppEvents.activateApp() } } 

Login screen

Resolution screen

Here doCompleteWith should be called, but nothing happens.

+6
source share
3 answers

Facebook needs to update documents.

For iOS 9+ instead of using:

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

You should use:

 func application(_ app: UIApplication, open url: URL, options: [String : AnyObject] = [:]) -> Bool { return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as! String, annotation: options [UIApplicationOpenURLOptionsAnnotationKey]) } 
+2
source

It seems that the [UIApplicationOpenURLOptionsAnnotationKey] options no longer work. you should now do it like this: options [UIApplicationOpenURLOptionsKey.sourceApplication]

This is what works for me

 func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { return FBSDKApplicationDelegate.sharedInstance() .application(app, open: url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String, annotation: options[UIApplicationOpenURLOptionsKey.annotation]) } 
+1
source

The above function had to be slightly modified. I had the same problem and it worked for me. See Function below:

 func application(_ app: UIApplication, open url: URL, options: [String : AnyObject] = [:]) -> Bool { return FBSDKApplicationDelegate.sharedInstance().application(app,open: url,sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as! String,annotation: options [UIApplicationOpenURLOptionsAnnotationKey]) } 
0
source

All Articles