php - usuario - no puedo abrir facebook en mi celular
La función de devolución de llamada de inicio de sesión de FB no responde si el usuario ya ha iniciado sesión en Facebook (6)
Cambie de "estado: verdadero" a "estado: falso" y creo que hará lo que quiera. El problema es el estado: verdadero hace que la verificación de estado ocurra en init, por lo que no hay nada que cambiar cuando el usuario haga clic en el botón.
Encontró la respuesta en el comentario más reciente aquí: http://www.bubblefoundry.com/blog/2011/03/the-facebook-login-button-and-logging-into-your-webapp/
Estoy usando fb connect usando js. Este es mi código:
<script>
window.fbAsyncInit = function() {
FB.init({
appId : ''xxxxxxxxxxxxxxxx'',
status : true,
cookie : true,
xfbml : true,
oauth : true
});
FB.Event.subscribe(''auth.login'', function(response) {
obj=response.authResponse;
token=obj.accessToken;
setCookie("access_token_fb", token, ''2'');
window.location.reload();
},true);
};
(function(d){
var js, id = ''facebook-jssdk''; if (d.getElementById(id)) {return;}
js = d.createElement(''script''); js.id = id; js.async = true;
js.src = "//connect.facebook.net/en_US/all.js";
d.getElementsByTagName(''head'')[0].appendChild(js);
}(document));
</script>
Para iniciar sesión estoy usando:
<div class="fb-login-button" scope="email,user_checkins" >Login with Facebook</div>
''auth.login'' en la función de suscripción tiene un controlador de respuesta al que solo se llama cuando el usuario hace clic en el botón fb y aún no ha iniciado sesión en FB, ingrese su dirección de correo electrónico y contraseña en la ventana de fb. Mientras que si un usuario ya ha iniciado sesión en Facebook, entonces el cuadro de diálogo fb se abre y se cierra. Entonces no pasa el control al manejador de respuesta. Leí en alguna parte que force = "true" le permite detectar el cambio de estado y llamar a la función de devolución de llamada. Pero no sé dónde agregar la fuerza. Creo que debería estar en el inicio de sesión div. ¿Es cierto o hay algún otro enfoque?
gracias por tu tiempo
Cuando intialice el FK SDK con status:true
, obtendrá el estado de inicio de sesión del usuario y lo almacenará. Desde ese momento, cuando realiza llamadas a FB.getLoginStatus()
, no está accediendo a buscar los datos más recientes de FB, sino que se refiere a las variables almacenadas localmente que se establecieron en el punto de FB.init()
. Creo que solo se actualizó una vez cada 20 minutos (consulte https://github.com/facebook/facebook-js-sdk/commit/5b15174c7c9b9ea669499804d4a4c7d80771b036 ) - sin embargo, puede forzar la actualización haciendo esto:
FB.getLoginStatus(function() {...}, /*FORCE*/ true);
Esto debería auth.login
su evento auth.login
o simplemente podría pasar el controlador que definió para ese evento a FB.getLoginStatus
también.
Incluso puede ir más lejos y sondear esta función como:
setTimeout(function() {
FB.getLoginStatus(function() {...}, /*FORCE*/ true);
}, 10000); // poll every 10 seconds
Esto funciona:
FB.getLoginStatus(function(response) {
//only works when page loads, use FB.Event.subscribe for status change
statusChangeCallback(response);
FB.Event.subscribe(''auth.statusChange'', function(response){
//yay! do whatever here, there was a status change
},true);
});
Necesitas reemplazar
FB.Event.subscribe(''auth.authResponseChange'', function(response){
con
FB.Event.subscribe(''auth.statusChange'', function(response){
Como activador del evento auth.authStatusChange en el cambio de estado, ya sea que haya iniciado sesión o inicie sesión mediante credenciales.
Gracias
Sugiero dejar que Facebook haga el trabajo pesado por ti. Tenga en cuenta algunos cambios: 1. canalUrl especificado, 2. uso de FB.getLoginStatus 3. eliminación de la configuración de una cookie. 4. cambio de evento para escuchar (en caso de que se desconecte en una ventana diferente, o muestre su aplicación en otro lugar, etc.)
<script>
window.fbAsyncInit = function() {
FB.init({
appId : ''xxxxxxxxxxxxxxxx'',
status : true,
cookie : true,
xfbml : true,
oauth : true,
channelUrl : ''//WWW.YOUR_DOMAIN.COM/channel.html'' // Channel File
});
FB.getLoginStatus(function(response) {
if (response.status === ''connected'') {
var uid = response.authResponse.userID;
var accessToken = response.authResponse.accessToken;
// Do something with the access token
} else {
// Subscribe to the event ''auth.authResponseChange'' and wait for the user to autenticate
FB.Event.subscribe(''auth.authResponseChange'', function(response) {
// nothing more needed than to reload the page
window.location.reload();
},true);
// now dynamically show the login plugin
$(''#mydiv'').show();
}
});
};
(function(d){
var js, id = ''facebook-jssdk''; if (d.getElementById(id)) {return;}
js = d.createElement(''script''); js.id = id; js.async = true;
js.src = "//connect.facebook.net/en_US/all.js";
d.getElementsByTagName(''head'')[0].appendChild(js);
}(document));
</script>
Método 1:
Aunque creo que DMCS ha dado una solución correcta al problema, aquí hay otra manera de abordar. Utilice el método FB.login con un enlace de inicio de sesión personalizado.
<script>
window.fbAsyncInit = function() {
FB.init({
appId: ''YOUR-APP-ID'',
status: true,
cookie: true,
xfbml: true,
oauth: true
});
};
function facebookLogin() {
FB.login(function(response) {
if (response.authResponse) {
console.log(''Authenticated!'');
// location.reload(); //or do whatever you want
} else {
console.log(''User cancelled login or did not fully authorize.'');
}
},
{
scope: ''email,user_checkins''
});
}
(function(d) {
var js,
id = ''facebook-jssdk'';
if (d.getElementById(id)) {
return;
}
js = d.createElement(''script'');
js.id = id;
js.async = true;
js.src = "//connect.facebook.net/en_US/all.js";
d.getElementsByTagName(''head'')[0].appendChild(js);
} (document));
</script>
Marcado del cuerpo:
<div id=''fb-root></div><!-- required for SDK initialization -->
<a id=''fb-login'' href=''#'' onclick=''facebookLogin()''>Login with Facebook</a>
Cuando haga clic en el botón, ejecutará la función de devolución de llamada dentro de FB.login.
Método 2:
Alternativamente, al usar el complemento botón de inicio de sesión de FB, puede suscribirse a auth.statusChange
y verificar el estado del usuario en respuesta.
FB.Event.subscribe(''auth.statusChange'', function(response) {
// check for status in the response
});
Tenga en cuenta que si está utilizando el complemento de botón de inicio de sesión de fb, y el usuario ya ha iniciado sesión y está conectado a la aplicación, no se muestra ningún botón de inicio de sesión (léalo en la documentación aquí )