我正在尝试构建一个允许用户登录Facebook的网络应用。一切都适用于Firefox / Chrome / Safari(在手机/平板电脑和OSX上)。
当应用程序在平板电脑上运行时(原生UIWebview和Web应用程序),它会完美地加载第一页。
当用户点击“与Facebook连接”按钮时,该应用会加载Facebook登录页面。
用户登录后(再次在Native UIWebview和web-app中)视图在URL上变为白色:'https://www.facebook.com/dialog/permissions.request?_path= permissions.request& app_id = [APP_ID] ......' - 这似乎不应该发生......
如果我重新启动app / web-app,则用户会自动登录,并重定向到成功页面。
当您在Firefox / Chrome / Safari浏览器中运行网页时,Facebook登录对话框会弹出一个弹出窗口或另一个标签(后者在本机Safari浏览器上)。
我认为这是此弹出页面的问题以及Javascript在成功登录时如何与自身通信。有window.close
的东西没有要返回的根页面(因为web-app和UIWebview只有一个webview实例)...也许?
由于应用程序挂在前面提到的URL上,我决定在shouldStartLoadWithRequest(...)
中添加if语句以强制UIWebview转到成功URL。
它加载了URL,但之后Facebook的Javascript SDK函数FB.getLoginStatus
函数返回'已连接'(每次我看到它确实返回'已连接')函数FB.Event.subscribe('auth.logout' function() {...});
被触发。< / p>
我不明白为什么它会记录用户,然后按顺序告诉我用户已连接(已登录)。
在我开始尝试构建这个100%原生(并且必须忍受苹果的开发帐户并提交应用程序)之前的任何想法?
<script>(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/all.js#xfbml=1&appId=APP_ID";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>
<script>
var seccond_page = false;
window.fbAsyncInit = function() {
FB.init({
appId : '[APP_ID]',
status : true,
cookie : true,
xfbml : true,
oauth : true
});
FB.Event.subscribe('auth.login', function(response) {
window.location.href = '<?= $success ?>';
});
FB.Event.subscribe('auth.logout', function(response) {
window.location.reload();
});
FB.login(function(response) {
alert(response.status);
if (response.status) {
if (response.status == 'connected') {
window.location.href = '<?= $success ?>';
}
}
}, {scope: 'email, user_likes, user_status, user_birthday, user_location, publish_checkins'});
$(document).on('click', '#fb_login_button', function() {
FB.login();
});
};
</script>
<script>
var fb_user_id = '';
var fb_access_token = '';
var user_location = '';
window.fbAsyncInit = function() {
FB.init({
appId : '[APP_ID]',
status : true,
cookie : true,
xfbml : true,
oauth : true
});
FB.getLoginStatus(function(response) {
alert('Response - ' + response.status);
// the auth.logout is fired before the return of this in the failed fix
if (response.status === 'connected') {
if (response.authResponse) {
fb_user_id = response.authResponse.userID
fb_access_token = response.authResponse.accessToken;
}
}
});
FB.Event.subscribe('auth.logout', function(response) {
alert('logout - auth.logout');
// This event is fired before the above function in the failed fix
window.location.href = '<?= site_url('fb_login'); ?>';
});
FB.Event.subscribe('edge.create', function(response){
if (response == '<?= $like_url ?>') {
//action
}
});
};
</script>
所有网页都有元标记:<meta name="apple-mobile-web-app-capable" content="yes">
答案 0 :(得分:0)
Facebook在auth.login之前调用auth.logout,原因我不清楚。在假定用户确实已经注销之前,您应该检查响应参数。 Facebook docs州:
auth.logout - 在用户注销时触发。传递给回调函数的响应对象如下所示: { 状态:“”,/ *会话的当前状态* / }
如果仅在response.status
确实为""
时执行注销处理,您可能会发现在登录期间,它在调用auth.login
侦听器后立即调用auth.logout
个侦听器。您当前的auth.logout
处理会阻止您注意到这一点,因为页面重新加载会停止JS和ajax执行。