7

ユーザーが Facebook にログインできるようにする Web アプリを構築しようとしています。すべてが Firefox/Chrome/Safari (電話/タブレットおよび OSX) で動作します。

アプリがタブレット (ネイティブ UIWebview および Web アプリ) で実行されると、最初のページが完全に読み込まれます。

ユーザーが [Facebook に接続] ボタンをクリックすると、アプリは Facebook のログオン ページを読み込みます。

ユーザーがログインすると (ネイティブ UIWebview と Web アプリの両方で)、ビューが白くなり、URL にぶら下がります: 'https://www.facebook.com/dialog/permissions.request?_path=permissions.request&app_id =[APP_ID]...' - これはあってはならないことのようです...

app/web-app を再起動すると、ユーザーは自動的にログインし、成功ページにリダイレクトされます。

私が考える問題の原因

Firefox/Chrome/Safari ブラウザーで Web ページを実行すると、Facebook ログイン ダイアログがポップアップまたは別のタブとして表示されます (ネイティブ Safari ブラウザーでは後者)。

これは、このポップアップ ページの問題と、ログインが成功したときに Javascript がそれ自体と通信する方法に問題があると思います。window.close戻るルートページがない場所にあるもの(Web アプリと UIWebview には webview のインスタンスが 1 つしかないため)...多分?

回避策の失敗 (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">

4

1 に答える 1

0

Facebook は、理由がはっきりしないため、auth.login の直前に auth.logout を呼び出します。ユーザーが本当にログアウトしたと仮定する前に、応答パラメーターを検査する必要があります。Facebook ドキュメントの状態:

auth.logout - ユーザーがログアウトしたときに発生します。コールバック関数に渡される応答オブジェクトは次のようになります: { status: "", /* セッションの現在のステータス */ }

response.statusが本当にの場合にのみログアウト処理を実行する""と、ログイン中に、リスナーauth.loginを呼び出した直後にリスナーが呼び出されることがありauth.logoutます。auth.logoutページのリロードによって JS と ajax の実行が停止するため、現在の処理ではこれに気付かないことがあります。

于 2013-02-02T17:32:41.047 に答える