最終的にFBがそれを行う方法を見つけました:)
- page_proxy.php#frameName - フォームをロードし、POST メソッドを使用して署名付きリクエストで iframe をロードします。
アプリでiframeをロードするための直接呼び出しがないのはなぜですか? サードパーティのスクリプトが署名付きリクエスト (すべてのユーザー情報を含む) を取得するのを防ぐため。
fbのやり方(私が採用したコード):
<form method="post" id="proxy_form"><input type="hidden" autocomplete="off" id="signed_request" name="signed_request" /></form>
<script>
var frameName = window.location.href.split('#')[1];
function submitForm(appTabUrl, signedRequest) {
var proxyForm = document.getElementById("proxy_form");
proxyForm.setAttribute("action", appTabUrl);
proxyForm.setAttribute("target", frameName);
var input = document.getElementById("signed_request");
input.setAttribute("value", signedRequest);
proxyForm.submit();
}
function waitForParams() {
submitForm('$url_with_app', 'signed_request_goes_here');
}
waitForParams();</script>
iFrame のアプリは正常に読み込まれますが、POST 要求を使用して読み込まれるため、DOM ブラウザーにアプリの iframe が表示されません。
アプリで facebook を初期化し、アプリを Autogrow に指示します。
Facebook の初期化が完了し、DOM の準備が整うまで待って、アプリの高さを計算します。
ここで、iframe を拡張します。そして、これが彼らが行うトリックです:
FBからのソース
_sendMessageToFacebook: function(message) {
var url = FB._domain.staticfb + 'connect/canvas_proxy.php#' +
FB.QS.encode({method: message.method,
params: FB.JSON.stringify(message.params)});
var root = FB.Content.appendHidden('');
FB.Content.insertIframe({
url: url,
root: root,
width: 1,
height: 1,
onload: function() {
setTimeout(function() {
root.parentNode.removeChild(root);
}, 10);
}
});
}
アプリケーション内に別の iframe をロードしますが、その iframe は既に facebook に属しており、FB の親 (上部ウィンドウ) とやり取りして、必要なすべての情報を親に送信できます!