Веб-приложение iOS / родное приложение Facebook Вход всплывающее окно - ОШИБКИ?

Я пытаюсь создать веб-приложение, которое позволит пользователю войти в Facebook. Все работает в Firefox/Chrome/Safari (на телефоне / планшете и на OSX).

Когда приложение работает на планшете (Native UIWebview и Web-приложение), оно отлично загружает первую страницу.

Когда пользователь нажимает кнопку "связаться с Facebook", приложение загружает страницу входа в Facebook.

После того, как пользователь войдет в систему (опять же, как в собственном UIWebview, так и в веб-приложении), представление станет белым и висит на URL: 'https://www.facebook.com/dialog/permissions.request?_path=permissions.request&app_id=[APP_ID]...' - похоже, этого не должно быть...

Если я перезагружаю приложение / веб-приложение, пользователь автоматически входит в систему и перенаправляется на страницу успеха.

Что я думаю вызывает проблему

Когда вы запускаете веб-страницу в браузерах Firefox / Chrome / Safari, диалог входа в Facebook появляется как всплывающая или другая вкладка (последняя в собственном браузере Safari).

Я считаю, что это проблема с этой всплывающей страницей и как Javascript связывается с самим собой при успешном входе в систему. Что-то с window.close где нет корневой страницы, к которой можно вернуться (поскольку веб-приложение и UIWebview имеют только один экземпляр веб-просмотра)... может быть?

Неудачный обходной путь (UIWebview)

Поскольку приложение зависало по ранее упомянутому URL, я решил добавить оператор if в shouldStartLoadWithRequest(...) заставить UIWebview перейти на URL успеха.

Он загружает URL, но затем перед функцией Facebook Javascript SDK FB.getLoginStatus функция возвращает "Подключено" (она возвращает "Подключено" каждый раз, когда я видел) Функция FB.Event.subscribe('auth.logout' function() {...}); уволен.

Я не понимаю, почему он выходит из системы, а потом говорит, что пользователь подключен (вошел в систему) - в таком порядке.

Какие-нибудь идеи, прежде чем я попытаюсь создать этот 100% нативный (и придется смириться с учетной записью Apple и отправки приложения)?

Скрипт входа

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

1 ответ

Facebook вызывает auth.logout непосредственно перед auth.login по непонятным мне причинам. Вы должны проверить параметр ответа, прежде чем предположить, что пользователь действительно вышел из системы. Документы в Facebook гласят:

auth.logout - срабатывает, когда пользователь выходит из системы. Объект ответа, переданный в функцию обратного вызова, выглядит следующим образом: { status: "", /* Текущее состояние сеанса */ }

Если вы выполняете обработку выхода только из response.status действительно ""Вы можете обнаружить, что во время входа в систему он вызывает auth.login слушатели сразу после вызова auth.logout слушатель. Ваш текущий auth.logout обработка не позволяет вам заметить это, потому что перезагрузка страницы останавливает выполнение JS и ajax.

Другие вопросы по тегам