【问题标题】:Actionscript 3 Facebook API limitationsActionscript 3 Facebook API 限制
【发布时间】:2011-03-09 03:15:05
【问题描述】:

我正在使用 Actionscript 3 API 创建一个基于 Flash (AS3) 的 Facebook Connect 站点,虽然我已经具备允许用户正确登录的基本 FB Connect 功能,但当我遇到困难时试图请求某些扩展权限。我并不肯定,但似乎 AS3 API 有两个相当大的限制:

  1. 您必须与初始登录调用分开提示扩展权限。换句话说,需要两个模式对话框,而不是一个。这似乎是因为连接是由 FacebookSessionUtil 的实例处理的,而扩展权限请求是由 FacebookSessionUtil.Facebook 的实例处理的。

  2. 似乎没有办法提示用户允许与您的应用程序共享他们的电子邮件地址。虽然我已经仔细阅读了http://facebook-actionscript-api.googlecode.com/svn/release/current/docs/index.html,但看起来那里的“EMAIL”权限只会提示用户允许您的应用通过 Facebook 向他们发送电子邮件,而不是直接分享他们的电子邮件地址。

我的假设是错误的吗?使用 JS 和 ExternalInterface 来完成这类工作会更好吗?我宁愿不重建现有的东西,但如果这些限制是真实的,我似乎别无选择。

任何反馈或帮助将不胜感激。谢谢!

【问题讨论】:

  • afaik facebook 永远不会让第三方访问电子邮件地址,因此另一个客户端库无法帮助您。
  • grapefrukt——Facebook 的扩展权限列表中提到的第一个“数据”项是用户的主要电子邮件地址:developers.facebook.com/docs/authentication/permissions

标签: flash actionscript-3 facebook externalinterface


【解决方案1】:

1)您必须覆盖DesktopSession 类中的onLogin 函数并添加您的扩展权限参数。

2)除非权限模型中的更改仅允许代理电子邮件,否则它应该可以工作。尝试从 facebook 用户实例中查询它,看看你得到了什么。

Developer console 中使用控制台块中的以下 api 调用对其进行测试

<button id="fb-login">Login &amp; Permissions</button>

<script>
document.getElementById('fb-login').onclick = function() {
  var cb = function(response) {
    Log.info('FB.login callback', response);
    if (response.session) {
      Log.info('User logged in');
      if (response.perms) {
        Log.info('User granted permissions');
      }
    } else {
      Log.info('User is logged out');
    }
  };
  FB.login(cb, { perms: 'email' });
};
</script>

【讨论】:

  • 谢谢,博士。您能否更具体地了解 1) 中的 onLogin 覆盖的性质?看起来 onLogin 只是点击了通常的 Facebook 登录 URL (facebook.com/login.php) 并在其上添加了一堆额外的 GET 变量。 URL 中是否需要另一个变量?
  • 是的,您的电子邮件扩展权限参数:email 我试图通过扩展它来覆盖该类,但 DesktopSession 在所有内容中。所以我做了一个快速搜索,发现我的想法已经被想到了:(。这个家伙Jozef Chúťka 有一个关于如何让它工作的完整教程。他基本上使用相同的目录模式将类复制到他的 src 中在该课程的 facebook swc 中。
  • 请记住,这仅在用户尚未登录时才有效。 FB Api(如果你问我,很愚蠢)只有在你实际登录时才会填写 response.perms。如果你已经登录,你的回调将被调用,但 perms 将为空。上周我一直在努力解决这个问题。有一个 getUserStatus 方法(或类似的方法)也不会返回权限。
  • (续)只有两种方法可以解决这个问题(我知道):1)如果用户已经登录,则强制注销,然后再登录(肯定是糟糕的用户体验)。 2)检查登录状态,如果用户已登录,则通过JS API使用FQL(有权限表)查询当前权限(开发人员体验不佳;)。我采用了第二种方法,但让它工作起来很痛苦(考虑到 FB 文档有多糟糕;通常,你最好的选择是反复试验和猜测)。 (咆哮结束)
  • +1 @Juan Pablo Califano 是的,不知道(*内容丰富的咆哮:D *)从未尝试过扩展权限,所以这对我来说是一个新难题。
【解决方案2】:

这是您可以直接在 AS3 中完成所有操作的另一种方法(非常方便)

这是我在 facebook 上构建的一个游戏的代码 sn-p,它需要在游戏中的某个时间点获得权限.. 它运行良好。 (请注意,您现在必须在 init 调用中指定 channel.html 和 oauth: true)

首先确保您拥有最新版本的 API(现在为 1.7)(http://code.google.com/p/facebook-actionscript-api)

private function facebookInit():void     // START THE SESSION…
{
    Facebook.init(APP_ID, facebookInitHandler,{
        appId: APP_ID,
        status: true,
        cookie: true,
        xfmbl: true,
        channelUrl: ‘http://yoursiteurl/channel.html',
        oauth: true,
        perms: “publish_stream,email”
    });
}

private function facebookInitHandler(response:Object, fail:Object):void
{
    if (response.accessToken)
    {
        userAccessToken = JSON.encode(response.accessToken);
        facebookLoggedInWithToken = true;
        loadProfileData();
    } else {
        facebookLoggedInWithToken = false;
    }
}

private function loadProfileData():void
{
    var request:String = ‘/me’;
    var requestType:String = ‘GET’;
    var params:Object = null;
    Facebook.api(request, loadProfileDataHandler, params, requestType);
}

private function loadProfileDataHandler(response:Object, fail:Object):void
{
    if (response) {
        userID = response.id;
        fullName = response.name;
        firstName = response.first_name;
        lastName = response.last_name;
        userEmail = response.email;
        userPicURL = ‘http://graph.facebook.com/‘ + userID + ‘/picture’;
    }
}

享受吧!

【讨论】:

  • 重要的部分是options.status = true
猜你喜欢
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多