Login Review

Wenn deine App mehr als public_profile und email anfordert, muss sie vor dem Release erst durch Facebook geprüft werden. Erfahre mehr über den Überprüfungsvorgang und die Anforderungen, um ihn zu bestehen.

Leitfaden zum Login Review

Benutzerdefinierter Login-Button

An Stelle des Login-Buttons im Facebook-Design (erläutert unter Facebook Login für iOS – Schnellstart) möchtest du womöglich einen Button mit deinem eigenen Layout und einem benutzerdefinierten Verhalten erstellen. Im folgenden Code-Beispiel rufen wir den Login-Dialog mit der Login-Manager-Klasse (LoginManager) und einem benutzerdefinierten Button (UIButton) auf. Du kannst jede andere angepasste Benutzeroberfläche oder Event-Bearbeitung verwenden, um den Login-Dialog aufzurufen.

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        // Add a custom login button to your app
        let loginButton = UIButton(type: .custom)
        loginButton.backgroundColor = .darkGray
        loginButton.frame = CGRect(x: 0, y: 0, width: 180, height: 40)
        loginButton.center = view.center
        loginButton.setTitle("My Login Button", for: .normal)

        // Handle clicks on the button
        loginButton.addTarget(self, action: #selector(loginButtonClicked), for: .touchUpInside)

        view.addSubview(loginButton)
    }
  
  
    // Once the button is clicked, show the login dialog
    func loginButtonClicked() {
        let loginManager = LoginManager()
        loginManager.logIn(permissions: ["public_profile"], from: self) { result, error in
            if let error = error {
                print("Encountered Erorr: \(error)")
            } else if let result = result, result.isCancelled {
                print("Cancelled")
            } else {
                print("Logged In")
            }
        }
    }
}

    

Verwendung des Benutzeroberflächen-Builders

Diese Schritte sind für Version 12.0.0 und höher des Facebook-SDK für iOS erforderlich. Apps, die den Interface Builder verwenden, stürzen möglicherweise ab, wenn du diesen Schritt nicht ausgeführt hast.

So fügst du den Login-Button grafisch im Interface Builder hinzu:

  1. Füge ein UIButton-Objekt zu deinem Layout hinzu. Lege Begrenzungen fest, um ihn es zu positionieren.
  2. Ändere unter Identity inspector die Class zu FBSDKLoginButton.

Dein Layout sieht jetzt so aus:

Hinweis: Lege für die FBSDKLoginButton-Klasse kein Modul fest. Hier sollte Keins angezeigt werden:

Hinweis: Aufgrund eines bekannten Problems in XCFrameworks erscheint in Xcode-Protokollen möglicherweise der folgende Fehler:

[Storyboard] Unknown class FBSDKLoginButton in Interface Builder file.

Diesen Fehler kannst du beheben, indem du die FBSDKLoginButton-Klasse „vorlädst“ bevor das Storyboard geladen wird. Füge hierzu Folgendes zu deiner application:didFinishLaunchingWithOptions:-Methode hinzu:

// For Swift
_ = FBLoginButton.self

// For Objective-C
[FBSDKLoginButton class];

Zugriffsschlüssel

Benachrichtigungen

Du kannst Änderungen an AccessToken.currentüber die .AccessTokenDidChange-Benachrichtigung im NotificationCenter nachverfolgen. So kannst du auf Änderungen am Anmeldestatus eines Nutzers reagieren:

NotificationCenter.default.addObserver(
    forName: .AccessTokenDidChange,
    object: nil,
    queue: .main
) { notification in
    if notification.userInfo?[AccessTokenDidChangeUserIDKey] != nil {
        // Handle user change
    }
}

Das iOS SDK kann AccessToken.current im Laufe der Zeit aktualisieren, z. B. wenn das SDK ein Token mit einem längeren Ablaufdatum aktualisiert. Daher solltest du das userInfo-Wörterbuch in der Benachrichtigung zu AccessTokenDidChangeUserIDKey überprüfen, um festzustellen, ob sich der Nutzer geändert hat.

Profile

Profile enthält öffentliche Profilinformationen, anhand derer du deine App mit dem Namen und dem Profilbild des Nutzers personalisieren kannst. Du kannst das Profil des angemeldeten Nutzers mit loadCurrentProfile(completion:) laden.

Profile.loadCurrentProfile { profile, error in
    if let firstName = profile?.firstName {
        print("Hello, \(firstName)")
    }
}

Lege für die enableUpdatesOnAccessTokenChange-Eigenschaft true fest, sodass das Profil automatisch in Profile.current geladen wird. So kannst du außerdem die .ProfileDidChange-Benachrichtigung beobachten, um auf Profiländerungen zu reagieren:

Profile.enableUpdatesOnAccessTokenChange(true)
NotificationCenter.default.addObserver(
    forName: .ProfileDidChange,
    object: nil,
    queue: .main
) { notification in
    if let currentProfile = Profile.current {
        // Update for new user profile
    }
}

Profilbilder anzeigen

Mit der FBProfilePictureView-Klasse kannst du ganz einfach das Facebook-Profilbild eines Nutzers anzeigen. Lege dazu die profileID-Eigenschaft auf der Instanz fest. Du kannst hierfür einen Wert von AccessToken.current.userID eingeben, sodass das Profilbild des aktuell angemeldeten Nutzers angezeigt wird.

let profilePictureView = FBProfilePictureView()
profilePictureView.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
profilePictureView.profileID = AccessToken.current!.userID
view.addSubview(profilePictureView)

Festlegen des Autorisierungstyps

Der standardmäßige auth_type für Facebook Login-Buttons im Facebook-SDK für iOS ist erneut anfordern. Um zu verhindern, dass zuvor abgelehnte Berechtigungen erneut angefordert werden, lege für auth_typenil fest. Du kannst auch erneut autorisieren festlegen, sodass der Dialog zur erneuten Autorisierung von Daten angezeigt wird, wenn der Datenzugriff eines Nutzers abgelaufen ist.

Dieses Beispiel zeigt, wie du den auth_type in Swift festlegst.

let loginButton = FBLoginButton()

// Set to nil for no auth_type
button.authType = nil

// Or set to reauthorize
button.authType = .reauthorize

Im folgenden Beispiel siehst du, wie der auth_type in einem Login-Manager mit einer Login-Konfiguration festgelegt wird.

let config = LoginConfiguration(
    permissions: [],
    tracking: .enabled,
    messengerPageId: nil,
    authType: nil
)

let loginManager = LoginManager()
loginManager.logIn(viewController: self, configuration: config!) { loginResult in
    // Do something with loginResult
}