当应用程序在平板电脑上运行时(原生UIWebview和Web应用程序),它可以完美地加载第一页.
当用户点击“与Facebook连接”按钮时,该应用程序会加载Facebook登录页面.
在用户登录后(再次在Native UIWebview和web-app中),视图在URL上变为白色:’https://www.facebook.com/dialog/permissions.request?_path=permissions.request\u0026amp ; app_id = [APP_ID] ……’ – 这似乎不应该发生……
如果我重新启动app / web-app,用户将自动登录,并重定向到成功页面.
我认为是导致问题的原因
当您在Firefox / Chrome / Safari浏览器中运行网页时,Facebook登录对话框会弹出一个弹出窗口或另一个选项卡(后者在本机Safari浏览器上).
我相信这是这个弹出页面的一个问题,以及当成功登录时Javascript如何与自身通信. window.close的东西没有返回的根页面(因为web-app和UIWebview只有一个webview实例)…也许?
失败的解决方法(UIWebview)
由于应用程序挂在前面提到的URL上,我决定在shouldStartLoadWithRequest(…)中添加if语句以强制UIWebview转到成功URL.
它加载了URL,但之后Facebook的Javascript SDK函数FB.getLoginStatus函数返回’Connected'(每次我看到它确实返回’Connected’)函数FB.Event.subscribe(‘auth.logout’function() {…});被解雇了.
我不明白为什么它会记录用户,然后告诉我用户已连接(登录) – 按此顺序.
在我开始尝试构建这个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]',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”>
解决方法
auth.logout – fired when the user logs out. The response object passed into the callback function looks like:
{
status: “”,/* Current status of the session */
}
如果仅在response.status确实为“”时执行注销处理,您可能会发现在登录期间,它在调用auth.logout侦听器后立即调用auth.login侦听器.您当前的auth.logout处理阻止您注意到这一点,因为页面重新加载会停止JS和ajax执行.