2016-04-23 7 views
1

Ich möchte Funktionalität mit FacebookSDK implementieren.Wie erhalte ich die Erlaubnis des Benutzers mit FacebookSDK erneut?

Als Beispielanwendung Sie die URL überprüfen:

https://developers.facebook.com/docs/facebook-login/handling-declined-permissions#reprompt

ich diesen Code geschrieben haben, aber es ist für mich funktioniert nicht wie erwartet.

//Callback function for default FBLogin Button 
func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) 
{ 
    print("User Logged In") 

    if (error != nil) 
    { 
     // Process error 
     print("Processing Error : \(error)") 
     FBSDKLoginManager().logOut() 
     self.dismissViewControllerAnimated(true, completion: nil) 
    } 
    else if result.isCancelled 
    { 
     // Handle cancellations 
     print("user is cancelled the login FB") 
     FBSDKLoginManager().logOut() 
     self.dismissViewControllerAnimated(true, completion: nil) 
    } 
    else 
    { 
     print("result : \(result)") 

     // If you ask for multiple permissions at once, you 
     // should check if specific permissions missing 
     if result.declinedPermissions.contains("email") 
     { 
      print("email is declined") 
      // Do work 
      loginManager = FBSDKLoginManager() 
      loginManager!.logInWithReadPermissions(["email"], fromViewController: self, handler:{ [unowned self](result, error) -> Void in 

        if error == nil 
        { 
         self.fetchUserData() 
        } 

       }) 
     } 
     else 
     { 
      var readPermissions : FBSDKLoginManagerLoginResult = result 
      Constants.isUserLoggedIn = true 
      fetchUserData() 
     } 
    } 
} 

Antwort

1

Ich lief in ein paar Probleme mit dem mitgelieferten Schnipsel, die ich zu Fuß durch würde. Überarbeiteter Code unten.

Compile Fehler

Wenn ich versuche, den Code auszuführen, wie angegeben, erhalte ich einen Compiler-Fehler

loginManager = FBSDKLoginManager() 
loginManager!.logInWithReadPermissions(["email"], fromViewController: self, handler:{ [unowned self](result, error) -> Void in 

Verwendung von ungelösten Kennung 'Loginmanager'

Aus Das Aussehen davon, Sie haben einen optionalen FBSDKLoginManager auf Ihrem View-Controller gespeichert, aber das ist nicht notwendig, und wi Ich vermassle deinen Versuch, den Benutzer erneut auf E-Mails hinzuweisen.

Anstatt eine zweite Chance zu erhalten, um Ihnen Zugriff auf E-Mails zu geben, wird nur der Dialog "Sie haben [hier Name der App autorisiert]" angezeigt.

(Die „rerequest“ ist heikel und implizit leider ... Ich lernte alles, was ich weiß, das ist nicht viel, von dieser post- How to “rerequest” email permission using Facebook iOS SDK 4.x?)

Zeit

Die andere große Frage scheint nur um das Timing Ihres Aufrufs zu sein, die Berechtigungen erneut anzufordern. Als ich Ihren Code ausgeführt und den E-Mail-Zugriff deaktiviert hatte, wurde mir ein leeres Facebook-Popup angezeigt.

Wenn jedoch, wie in der Beispiel-App, ich die erneute Eingabeaufforderung in einem Dialogfeld mit der Erläuterung, wofür ich die E-Mail benötige, verpackt habe, sah ich die erneute Aufforderung, die ich erwartet hatte.

Andere

  • hinzugefügt Fehler zu Ihrem reprompt Versuch Handling (sonst treffen Sie Kraft unwrap von null Fehler)
  • entfernt unnötige Anrufe zu

    self.dismissViewControllerAnimated (true, Fertigstellung: nil)

-Code

//Callback function for default FBLogin Button 
func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) 
{ 
    print("User Logged In") 

    if (error != nil) 
    { 
     // Process error 
     print("Processing Error : \(error)") 
     FBSDKLoginManager().logOut() 
    } 
    else if result.isCancelled 
    { 
     // Handle cancellations 
     print("user is cancelled the login FB") 
     FBSDKLoginManager().logOut() 
    } 
    else //permissions were granted, but still need to check which ones 
    { 
     if result.declinedPermissions.contains("email") 
     { 
      let alert = UIAlertController(title: "Alert", message: "We need your email address to proceed", preferredStyle: UIAlertControllerStyle.Alert) 
      let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: { action in 
       // Handle cancellations 
       print("user is cancelled the login FB") 
       FBSDKLoginManager().logOut() 

      }) 
      let reRequestAction = UIAlertAction(title: "Grant Access", style: UIAlertActionStyle.Default, handler: { action in 
       let fbsdklm = FBSDKLoginManager() 
       fbsdklm.logInWithReadPermissions(["email"], fromViewController: self) { (result, error) -> Void in 
        if (error != nil) 
        { 
         // Process error 
         print("Processing Error : \(error)") 
         FBSDKLoginManager().logOut() 
        } 
        else if result.isCancelled { 
         // Handle cancellations 
         print("user is cancelled the login FB") 
         FBSDKLoginManager().logOut() 
        } 
        else { 
         print("Got Email Permissions!") 
         //proceed 
        } 
       } 
      }) 

      alert.addAction(cancelAction) 
      alert.addAction(reRequestAction) 
      self.presentViewController(alert, animated: true, completion: nil) 

     } 
     else 
     { 
      print("Got Email Permissions!") 
      //proceed 
     } 
    } 
} 
Revised