3

我正在开发一个 Facebook 应用程序,该应用程序在除 IE 之外的所有浏览器中都能正常工作,有时它会工作,有时会失败。我正在使用 ExternalInterface 来处理 Facebook Javascript API。似乎我的回调在 IE 中间歇性地设置为 null。例如,当我打开邀请朋友弹出窗口时:

function inviteFriends(messageText) {
  FB.ui({
        method : 'apprequests',
        message : messageText
        }, function(response) {
                console.log("onInviteFriendsComplete: " + getFlashObject().onInviteFriendsComplete);
               if (response && !response.error)
                   getFlashObject().onInviteFriendsComplete(true);
              else
                  getFlashObject().onInviteFriendsComplete(false);
       });
}

这有时很好用。控制台日志跟踪:

onInviteFriendsComplete: function () { 
     return eval(instance.CallFunction("<invoke name=\""+name+"\" returntype=\"javascript\">" + __flash__argumentsToXML(arguments,0) + "</invoke>"));
   }

当应用程序失败时,它会跟踪:

onInviteFriendsComplete: null

当回调为 null 时,调试器会引发对象预期错误。

其他请求也会间歇性地出现此问题:

function purchaseItem(packHTML) {
  FB.ui({
        method : 'pay',
        action : 'purchaseitem',
        product : packHTML
        }, function(response) {
               console.log("onPurchaseItemComplete: " + getFlashObject().onPurchaseItemComplete);
               try {
                    getFlashObject().onPurchaseItemComplete(response, packHTML);
              } catch(e) {
                    console.log("getFlashObject: " + getFlashObject());
                    console.log("Flash top: " + getFlashObject().style.top);
                    console.log("Flash visibility: " + getFlashObject().style.visibility);
             }
       });
}

当回调失败时,日志(来自 catch 语句)显示 Flash 对象已找到且不为空。该样式在 0px 处显示其顶部,并且可见性被隐藏。我正在拦截 hideFlashCallback:

window.fbAsyncInit = function() {
  // init the FB JS SDK
          FB.init({
         appId : facebookAppId, // App ID from the app dashboard
                    channelUrl : 'channel.html', // Channel file for x-domain comms
                    status : true, // Check Facebook Login status
                    cookie : true,
                    xfbml : true, // Look for social plugins on the page
                    hideFlashCallback : onFlashHide
          });
          isFacebookInitialized = true;
};



function onFlashHide(params) {
  console.log(getFlashObject() == params.elem);
  if (params.state == 'opened') {
  displayFlashScreenshot();
  } else {
  hideFlashScreenshot();
  }
}




function displayFlashScreenshot() {
  // Call the Flash ActionScript method to create the dynamic screenshot data
          var flashObject = getFlashObject();
          var screenshotData = flashObject.exportScreenshot();

          if (screenshotData != null) {
  // Set the screenshot image data as a base64 encoded data URI in the img src attribute
  document.getElementById('screenshotObject').src = 'data:image/jpeg;base64,' + screenshotData;

  // Set the screenshot img dimensions to match the Flash object tag.
                    document.getElementById('screenshotObject').width = flashObject.width;
                    document.getElementById('screenshotObject').height = flashObject.height;

document.getElementById('imageContent').style.visibility = 'visible';

          }
}



function hideFlashScreenshot() {
   document.getElementById('imageContent').style.visibility = 'hidden';
}

我正在使用 Starling,所以我将 wmode 设置为 direct。Facebook 正在隐藏和显示 Flash 对象,我只是将应用程序 UI 的当前状态绘制到“imageContent”元素中。

当回调显示为 null 时,Flash 对象保持隐藏状态。

我希望有人可以提供帮助,因为我在这个问题上已经整整三天了,但还没有看到任何解决方案。

4

0 回答 0