2016-06-19 12 views
6

Ho creato un'app di esempio in cui l'utente accede utilizzando il pulsante di accesso di Facebook.Login Facebook non torna all'app quando è stata eseguita la migrazione a Swift 3

Una volta effettuato l'accesso, viene visualizzata la schermata Nome utente e Email sulla schermata di accesso. Stava lavorando con Swift 2.3. Una volta migrato a Swift 3, ha smesso di funzionare.

  • Step1: Login con Facebook Login Button
  • Step2: Consenti autorizzazioni per e-mail e il profilo
  • Fase 3: Qui si dovrebbe tornare alla schermata 1. Ma non è così. Allegare il registro Ottengo quando clicco sul pulsante "Ok".

Aggiornamento 1: l'app funziona correttamente su iOS 9.3. Il problema si verifica solo su dispositivi iOS 10.

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 

Ecco il mio codice.

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

Permission Screen

Here didCompleteWith should be called but nothing happens.

+0

Basta passare attraverso rapida documento 3.0 migrazione. – Tuple

+0

Sì, l'ho verificato ma non sono riuscito a trovare nulla. Oggi ho provato ad eseguirlo su iOS 9.3 e funziona bene. Il problema è con l'esecuzione su dispositivi iOS 10 – Gaurav

+0

Stiamo vedendo anche questo problema, ci sta facendo impazzire! –

risposta

2

I documenti di Facebook devono essere aggiornati.

Per iOS 9+, piuttosto che utilizzare:

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

Si deve usare:

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]) 
} 
+1

Buona scoperta. Questo però non ha cambiato questo comportamento per me. – keyboardsamurai

0

La funzione di cui sopra doveva essere cambiato un po '. Ho avuto lo stesso problema e ha funzionato per me. Vedere la funzione qui sotto:

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

Sembra come opzioni [UIApplicationOpenURLOptionsAnnotationKey] non funziona più. Ora quello che devi fare in questo modo: le opzioni [UIApplicationOpenURLOptionsKey.sourceApplication]

Questo è ciò che funziona per 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]) 
} 
Problemi correlati