Revisión del inicio de sesión

Si la app solicita más que el public_profile y el email, Facebook debe revisarla antes de lanzarla. Obtén más información sobre el proceso de revisión y los requisitos para obtener un resultado positivo.

Guía de revisión del inicio de sesión

Botón "Iniciar sesión" personalizado

En vez de usar el botón "Iniciar sesión" de marca de Facebook (cómo se explica en Inicio de sesión con Facebook para iOS: Inicio rápido), es posible que prefieras crear una diseño y un comportamiento personalizados. En el siguiente ejemplo de código, invocamos el cuadro de diálogo de inicio de sesión mediante la clase de administrador de inicio de sesión (LoginManager) y un botón personalizado (UIButton). Puedes utilizar cualquier otra interfaz de usuario o administrador de eventos personalizados para invocar el cuadro de diálogo de inicio de sesión.

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")
            }
        }
    }
}

    

Usar Interface Builder

Debes seguir estos pasos para la versión 12.0.0 y posteriores del SDK de Facebook para iOS. Es posible que las apps que usan Interface Builder se bloqueen si no completaste este paso.

Para agregar el botón "Iniciar sesión" de manera gráfica en Interface Builder:

  1. Agrega un objeto UIButton a tu diseño. Configura las restricciones para posicionarlo.
  2. En Identity inspector, cambia la propiedad Class a FBSDKLoginButton.

Tu diseño tendrá este aspecto:

Nota: No configures un módulo para la clase FBSDKLoginButton. Debe mostrar Ninguno:

Nota: Es posible que veas el siguiente error en los registros Xcode debido a un problema conocido con XCFrameworks:

[Storyboard] Unknown class FBSDKLoginButton in Interface Builder file.

Puedes solucionarlo "precargando" la clase FBSDKLoginButton antes de que se cargue el guion gráfico si agregas a tu application:didFinishLaunchingWithOptions: lo siguiente:

// For Swift
_ = FBLoginButton.self

// For Objective-C
[FBSDKLoginButton class];

Tokens de acceso

Notificaciones

Puedes hacer seguimiento de los cambios AccessToken.current con la notificación .AccessTokenDidChange en NotificationCenter. Esto te permite responder a los cambios en el estado de inicio de sesión del usuario:

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

El SDK para iOS puede actualizar AccessToken.current a lo largo del tiempo si el SDK actualiza un token con una fecha de caducidad mayor. Por ese motivo, debes verificar el diccionario userInfo en la notificación de AccessTokenDidChangeUserIDKey con el fin de determinar si cambió el usuario.

Perfiles

Profile contiene información de tu perfil público, lo que te permite personalizar tu app con el nombre y la imagen de perfil del usuario. Puedes cargar el perfil del usuario que inició sesión mediante loadCurrentProfile(completion:).

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

Puedes configurar la propiedad enableUpdatesOnAccessTokenChange en true para que el perfil se cargue en Profile.current de manera automática. También te permite observar la notificación .ProfileDidChange para responder a los cambios de perfil:

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

Mostrar imágenes de perfil

La clase FBProfilePictureView proporciona una forma simple de mostrar la imagen de perfil de Facebook de alguna persona. Configura simplemente la propiedad profileID en la instancia. Puedes configurarla en un valor de AccessToken.current.userID para mostrar la imagen de perfil de la persona cuya sesión está actualmente iniciada.

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

Configurar el tipo de autorización

Se vuelve a solicitar el auth_type predeterminado de los botones de inicio de sesión con Facebook en el SDK de Facebook para iOS. Si deseas evitar tener que solicitar permisos que se negaron anteriormente, configura auth_type en nil. También puedes configurarlo para que se vuelva a autorizar que se muestre el cuadro de diálogo de reautorización de datos si caducó el acceso por parte del usuario a los datos.

El siguiente ejemplo muestra cómo configurar el auth_type en Swift.

let loginButton = FBLoginButton()

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

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

El siguiente ejemplo muestra cómo configurar el auth_type mediante la configuración del inicio de sesión con un administrador de inicio de sesión.

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
}