2014-09-25 3 views
0

Кнопка входа в мое приложение facebook полностью перестала работать в iOS 8. Я думал, что это было что-то, что я сделал, но когда я беру пример html с вашим сайтом и применяю его к своей странице, он все еще не работает (мой идентификатор приложения был заменен на xxxxx). В основном всплывающее окно открывается для facebook auth, но никогда не закрывается и не возвращается в мое приложение. Им просто остается пустой, какая вкладка открыта:JS Facebook login iOS8

<!DOCTYPE html> 
<html> 
<head> 
    <title>Facebook Login JavaScript Example</title> 
    <meta charset="UTF-8"> 
</head> 
<body> 
    <script> 
     // This is called with the results from from FB.getLoginStatus(). 
     function statusChangeCallback(response) { 
      console.log('statusChangeCallback'); 
      console.log(response); 
      // The response object is returned with a status field that lets the 
      // app know the current login status of the person. 
      // Full docs on the response object can be found in the documentation 
      // for FB.getLoginStatus(). 
      if (response.status === 'connected') { 
       // Logged into your app and Facebook. 
       testAPI(); 
      } else if (response.status === 'not_authorized') { 
       // The person is logged into Facebook, but not your app. 
       document.getElementById('status').innerHTML = 'Please log ' + 
        'into this app.'; 
      } else { 
       // The person is not logged into Facebook, so we're not sure if 
       // they are logged into this app or not. 
       document.getElementById('status').innerHTML = 'Please log ' + 
        'into Facebook.'; 
      } 
     } 

     // This function is called when someone finishes with the Login 
     // Button. See the onlogin handler attached to it in the sample 
     // code below. 
     function checkLoginState() { 
      FB.getLoginStatus(function (response) { 
       statusChangeCallback(response); 
      }); 
     } 

     window.fbAsyncInit = function() { 
      FB.init({ 
       appId: 'xxxxxxxxxxxxx', 
       cookie: true, // enable cookies to allow the server to access 
       // the session 
       xfbml: true, // parse social plugins on this page 
       version: 'v2.1' // use version 2.1 
      }); 

      // Now that we've initialized the JavaScript SDK, we call 
      // FB.getLoginStatus(). This function gets the state of the 
      // person visiting this page and can return one of three states to 
      // the callback you provide. They can be: 
      // 
      // 1. Logged into your app ('connected') 
      // 2. Logged into Facebook, but not your app ('not_authorized') 
      // 3. Not logged into Facebook and can't tell if they are logged into 
      // your app or not. 
      // 
      // These three cases are handled in the callback function. 

      FB.getLoginStatus(function (response) { 
       statusChangeCallback(response); 
      }); 

     }; 

     // Load the SDK asynchronously 
     (function (d, s, id) { 
      var js, fjs = d.getElementsByTagName(s)[0]; 
      if (d.getElementById(id)) return; 
      js = d.createElement(s); js.id = id; 
      js.src = "//connect.facebook.net/en_US/sdk.js"; 
      fjs.parentNode.insertBefore(js, fjs); 
     }(document, 'script', 'facebook-jssdk')); 

     // Here we run a very simple test of the Graph API after login is 
     // successful. See statusChangeCallback() for when this call is made. 
     function testAPI() { 
      console.log('Welcome! Fetching your information.... '); 
      FB.api('/me', function (response) { 
       console.log('Successful login for: ' + response.name); 
       document.getElementById('status').innerHTML = 
        'Thanks for logging in, ' + response.name + '!'; 
      }); 
     } 
    </script> 
    <!-- 
     Below we include the Login Button social plugin. This button uses 
     the JavaScript SDK to present a graphical Login button that triggers 
     the FB.login() function when clicked. 
    --> 

    <fb:login-button scope="public_profile,email" onlogin="checkLoginState();"> 
    </fb:login-button> 

    <div id="status"> 
    </div> 

</body> 
</html> 
+0

Дополнительная информация: страница обыкновение перенаправлять назад из этого URL https://www.facebook.com/dialog/возврат/арбитр? – user987723

+0

Похоже на ошибку facebook https://developers.facebook.com/bugs/295178237341368/ – user987723

ответ

1

Единственное решение, которое я придумал, чтобы деградировать обратно в поток аутентификации на стороне сервера, когда на прошивкой с использованием полного на переадресовывает. В основном ваше приложение должно ударить URL вроде этого:

https://www.facebook.com/dialog/oauth? 
    client_id={app-id} 
    &redirect_uri={redirect-uri} 

Который является резким опытом на рабочем столе, но, возможно, более приятный опыт на мобильном телефоне, при условии, что пользователь не принимаются через переключение вкладок странно (что корень новой проблемы в первую очередь). Чтобы деградировать этот поток ТОЛЬКО на iOS, убедитесь, что ваша входная ссылка на самом деле является href для диалогового окна проверки подлинности facebook (например, ссылка выше или для пользователей omniauth на рельсах - «auth/facebook»). Затем заверните javascript, где вы вызываете поток клиентской стороны в коде, который не позволяет ему запускаться на iOS (или все мобильные устройства, если хотите).

if(!/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) { 
[Facebook client side flow code here] 
} 

(пожалуйста, дайте мне знать в комментариях, если у кого-то есть более элегантный способ сделать это)

+0

приятный рабочий марк! Не могу поверить, что количество вещей, которые я нашел в iOS8 на этой неделе. Вы могли бы подумать о своей бета-версии! – user987723