私はここで同様のトピックでいくつかの回答を見てきましたが、この動作の原因を見つけることができませんでした。ここでFacebookのJavascript SDKとSafari - 原因不明の動作
は私のスクリプトです:
$("html").on("click",".fb",function(){
var my_picture=$("#image_link_holder").attr('data-link');
var file_id=$("#image_link_holder").attr('fileid');
FB.getLoginStatus(function(response) {
FB.login(function(apiResponse){
my_share="http://www.example.com/gallery.php-Q-event_id=<?php echo $event_id;?>";
my_share=encodeURI(my_share+"-A-fb_cover-E-"+my_picture);
FB.ui(
{
method:'feed',
link: my_share,
display: 'touch',
message: 'message',
caption:'caption',
name:"Name"
})
}, {scope: ['publish_actions','email']});
これはクローム、FireFoxの、エッジ、アンドロイド、Internet Explorerで完璧に動作しますが、Safariで、それだけで、ウィンドウが点滅し、他に何も起こりません。
コンソールエラーや何かについてはSafariで見ていますが、それは絶対に空です。私がボタンを押すと、Facebookからの3つの画像のネットワーク要求が表示されますが、それはそれです。それ以外のすべてのブラウザでは https://www.facebook.com/impression.php/
へのリクエストも表示されません。
誰かが私が行方不明になっていることにいくつかの光を当てることができますか?それは私を精神的に運転しています。もちろん、常に「完璧な」製品で愛されたAppleでなければなりません。
経験は、MacとiOSデバイスの両方で再現されています。 ! Safariのバージョン:10.0.3 のiOS:シミュレータは10.1
これは私がページ上のSDKをロードする方法である:T $ @の
window.fbAsyncInit = function() {
FB.init({
appId : 'XXXXXXXXXXXX',
xfbml : false,
version : 'v2.5'
});
FB.getLoginStatus(function (response) {});
};
(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/sdk.js";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
これは、ポップアップを作成して作成するときに起こりますが、クリックなどのユーザーのやりとりには直接関係しません。また、非同期呼び出しのコールバックにネストすることで、それはもはや直接的なものではありません。これはSafariに限らず、他のブラウザでも同様に起こります。 FB.loginの場合、FBドキュメントはその事実を明示的に警告します。 _ "ユーザーに警告するようになりました。" - いいえ、FB.loginコールバックから単純に取り出して、代わりに直接呼び出す必要があります。 (ダイアログはパーミッションを必要とせず、ユーザーがあなたのアプリケーションに全くログインしません) – CBroe
Ish ... FB.getLoginStatusはキャッシュされている必要があります。ページがロードされたときに呼び出すのでサーバーへの別のラウンドトリップを行う必要はありません。 _ "FB.getLoginStatusを呼び出すと、このキャッシュされた応答からデータが返されます。" _ユーザーがログインしていない場合、ログインウィンドウが開きます。私はコードの残りの部分を含めていないので、私はいくつかのデータ(電子メールアドレス+ post_id)を取得し、ユーザーをログインさせる必要があることを把握しているので、ログインセクションにあります。 1つはポップアップブロッカーによってブロックされます。 –
はい - これを非同期呼び出しにネストしたためです。 getLoginStatusが要求を出すかキャッシュされた結果を使用するかは関係ありません。次のコードがコールバック関数内でのみ呼び出され、イベントから「切り離される」という事実は変わりません。 – CBroe