10

アプリケーションと統合するための Facebook のようなボタンを開発しています。developers.facebook.com からコピーした html コードを次に示します。

<html>
<body>                   
    <div id="fb-root"></div>
    <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=my_app_id";
            fjs.parentNode.insertBefore(js, fjs);
        }(document, 'script', 'facebook-jssdk'));
    </script>
    <fb:like data-href="http://www.facebook.com/facintegra" data-send="true" data-width="450" data-show-faces="false" data-font="tahoma"/>
</body>

私のアンドロイド活動コード

mWebView = (WebView) findViewById(R.id.webview);
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.getSettings().setAppCacheEnabled(true);
    mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
    mWebView.loadUrl("file:///android_asset/FacebookLikeView.html");

    m_cObjFacebook = new Facebook("Your_id");

    authorizefacebook();

}

private void authorizefacebook(){
    m_cObjFacebook.authorize(this, m_cPermissions, new DialogListener() {
        @Override
        public void onComplete(Bundle values) {
            m_cAccessToken = values.getString(Facebook.TOKEN);

        }

        @Override
        public void onFacebookError(FacebookError error) {
            System.out.println(error.toString());
        }

        @Override
        public void onError(DialogError e) {
            System.out.println(e.toString());
        }

        @Override
        public void onCancel() {
            System.out.println("Cancel");
        }
    });
}
}

アプリケーションが起動すると、Facebook にログインしているかどうかがチェックされます。そうでない場合は、Facebook のログイン画面を表示してログインし、ログインに成功すると、Android アプリのページではなく Facebook のページに移動します。

ログインしていることがわかると、次のような画面が表示されます。

私が間違っているところを助けてください

アプリの最初の画面

私の最初の画面

OKボタンを押した後の画面

2 番目の画面

私のWebビューでいいねボタンをクリックすると、リンクfacebook.com/connect/connect_to_external_page_reload.htmlにリダイレクトされます。どうすればいいですか?

ありがとう

4

2 に答える 2

6

私の推測では、fb js sdk をロードする webview には Cookie がないため、ユーザーは認証されていません。

どのようにユーザーを認証していますか? SSO を使用していますか (つまり、fb アプリがインストールされていますか?) その場合、ブラウザー (webview) はユーザーが認証されていることを認識せず、クリックすると認証のためにリダイレクトしようとします。

新しい公式ブログ投稿を読んでください:モバイルに好感をもたらす.


編集

うーん、これは私が推測したとおりに見えます。「Sign up to see...」と表示されているのは、ユーザーがログインして認証されていることを js sdk が認識していないことを意味します。

私が考えることができる 2 つのオプションがあり
ますLike
2. Android から取得したものを使用しFB.initてパラメーターを渡すと、次のauthResponseようになります。

Java部分

m_cObjFacebook = new Facebook("Your_id");
m_cObjFacebook.authorize(this, m_cPermissions, new DialogListener() {
    @Override
    public void onComplete(Bundle values) {
        String response = m_cObjFacebook.request("me");
        JSONObject json = Util.parseJson(response);
        showWebView(json.getString("id"));
    }

    ....
});

private void showWebView(String userid) {
    mWebView = (WebView) findViewById(R.id.webview);
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.getSettings().setAppCacheEnabled(true);
    mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);

    StringBuilder url = new StringBuilder("file:///android_asset/FacebookLikeView.html?");
    url.append("token=").append(cObjFacebook.getAccessToken());
    url.append("&expires=").append(cObjFacebook.getAccessExpires());
    url.append("&user=").append(userid);

    mWebView.loadUrl(url.toString());
}

Html / Javascript 部分:

<script type="text/javascript">
    window.fbAsyncInit = function() {   
        var data = {},
            query = window.location.search.substring(1);

        query = query.split("&");
        for (var i = 0; i < query.length; i++) {
            var pair = query[i].split("=");
            data[pair[0]] = pair[1];
        }

        FB.init({
            appId: "YOUR_APP_ID",
            xfbml: true,
            authResponse: data
        });
    };

    // Load the SDK Asynchronously
    (function(d){
        var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
        if (d.getElementById(id)) {return;}
        js = d.createElement('script'); js.id = id; js.async = true;
        js.src = "//connect.facebook.net/en_US/all.js";
        ref.parentNode.insertBefore(js, ref);
    }(document));
</script>
<div class="fb-like" data-href="http://www.facebook.com/FacIntegra" data-send="false" data-width="450" data-show-faces="false" data-font="tahoma"></div>

のパラメータの 1 つが存在しないため、このトリックが機能するかどうかは 100% 確信が持てませんが、試してみる価値はありますauthResponsesignedRequest


2回目の編集

Facebook アプリケーション (katana) がデバイスに存在する場合、認証はそれを使用して行われます。つまり、デフォルトのブラウザーの Cookie は作成されないため、いいねボタンで webview を開いたときに、js SDK はあなたが認識していません。 Firefox で facebook にログインし、chrome で facebook を開くと、ログインしていないことがわかります。

fb アプリがインストールされていない場合、sdk は webview のダイアログを使用してユーザーを認証します。これにより、後で js sdk で使用できる Cookie が作成されます。これが、このシナリオで「期待どおり」に機能する理由です。

最初の編集で提供した回避策では、初期化時に認証データを SDK に渡そうとします。
私が書いたように、うまくいくかどうかはわかりません。署名付きのリクエストも渡す必要があるかもしれませんが、それを持っていないので、作成する必要があります。試してみたい場合は、ここで説明されていることとは正反対です: Singed RequestFB.initを使用して、アクセス トークンと有効期限パラメーターと共に に渡します。

あなたが持っている別のオプションは、認証のために常にダイアログを使用することです.
モバイル デバイスで電子メールとパスワードを入力するのは楽しいことではないため、ユーザー エクスペリエンスが低下するため、この方法は使用しないことをお勧めします。

于 2012-06-26T13:45:33.373 に答える
1

最初のオプションを試しましたが、Androidアプリで空白のWebビューしか表示されません

于 2012-10-11T06:42:52.707 に答える