Веб-приложение iOS / родное приложение Facebook Всплывающее окно для входа — НЕУДАЧИВАЕТСЯ?

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

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

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

После того, как пользователь входит в систему (опять же, как в Native 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-адрес, но затем, прежде чем функция FB.getLoginStatus функции Javascript SDK Facebook возвращает «Подключено» (она возвращает «Подключено» каждый раз, когда я видел) Функция 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">


person Wallter    schedule 08.05.2012    source источник
comment
Покажите, пожалуйста, ваш код инициализации и входа в Facebook.   -  person Maxim Mikheev    schedule 09.05.2012
comment
Это происходит потому, что Facebook OAuth происходит в окне с вкладками, как вы правильно сказали, и, таким образом, не работает в одном окне браузера, таком как UINativeWebView.   -  person Shireesh Asthana    schedule 23.01.2013
comment
Когда вы говорите «Нативный UIWebview и веб-приложение», вы имеете в виду конкретное встроенное приложение или приложение из магазина на устройстве или что-то специально созданное? Кроме того, когда вы говорите о планшете, вы имеете в виду iPad?   -  person Spathi Wankenstein    schedule 02.02.2013


Ответы (1)


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

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

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

person Spathi Wankenstein    schedule 02.02.2013