Facebook Graph API v2.0 +-/ me / friends返回空,或仅返回也使用我的应用程序的朋友

问题描述 投票:366回答:7

我正在尝试通过Graph API v2.0获取我的朋友的名字和ID,但是数据返回空:

{
  "data": [
  ]
}

当我使用v1.0时,通过以下请求一切正常:

FBRequest* friendsRequest = [FBRequest requestForMyFriends];
[friendsRequest startWithCompletionHandler: ^(FBRequestConnection *connection,
                                              NSDictionary* result,
                                              NSError *error) {
    NSArray* friends = [result objectForKey:@"data"];
    NSLog(@"Found: %i friends", friends.count);
    for (NSDictionary<FBGraphUser>* friend in friends) {
        NSLog(@"I have a friend named %@ with id %@", friend.name, friend.id);
    }
}];

但是现在我无法交朋友!

facebook facebook-graph-api facebook-ios-sdk facebook-graph-api-v2.0
7个回答
626
投票

在Graph API的v2.0中,调用/me/friends将返回也使用该应用程序的人的朋友。

此外,在v2.0中,您必须向每个用户请求user_friends权限。默认情况下,不再在每个登录名中都包含user_friends。每个用户必须授予user_friends权限才能出现在对/me/friends的响应中。有关更多详细信息,请参见the Facebook upgrade guide,或查看下面的摘要。

如果您要访问不使用应用程序的朋友列表,有两个选项:

  1. [If you want to let your people tag their friends在使用您的应用发布到Facebook的故事中,您可以使用/me/taggable_friends API。 Use of this endpoint requires review by Facebook,并且仅用于呈现朋友列表以使用户在帖子中为他们添加标签的情况。

  2. [If your App is a Game AND your Game supports Facebook Canvas,您可以使用/me/invitable_friends端点以呈现a custom invite dialog,然后将此API返回的令牌传递给the standard Requests Dialog.

[在其他情况下,应用程序不再能够检索用户朋友的完整列表(仅那些使用user_friends权限专门授权了您应用程序的朋友)。 This has been confirmed by Facebook as 'by design'.

对于希望允许人们邀请朋友使用应用程序的应用程序,您仍然可以使用Send Dialog on Web或新的Message Dialog on iOSAndroid

更新:Facebook在此处发布了有关这些更改的常见问题解答:https://developers.facebook.com/docs/apps/faq,其中解释了开发人员可以用来邀请朋友等的所有选项。


17
投票

尽管Simon Cross的答案是正确的,但我认为我会举例说明(Android)需要完成的工作。我会尽可能保持一般性,只关注问题。就我个人而言,我忙于将事情存储在数据库中,这样加载就很顺利,但这需要CursorAdapter和ContentProvider,这在这里有点超出范围。

我自己来到这里,然后想到了,现在呢?!

问题

就像user3594351,我注意到朋友数据为空。我通过使用FriendPickerFragment找到了这一点。三个月前起作用的东西不再起作用。甚至Facebook的例子都破了。所以我的问题是“如何手动创建FriendPickerFragment?

什么不起作用

[Simon Cross中的选项#1不够强大,无法邀请朋友加入该应用程序。 Simon Cross还建议了“请求”对话框,但是一次只能允许五个请求。在任何给定的Facebook登录会话期间,请求对话框还显示了相同的朋友。没有用。

工作原理(摘要)

选项#2,有些辛苦。您必须确保满足Facebook的新规则:1.)您是游戏2.)您具有Canvas应用程序(网络存在)3.)您的应用程序已在Facebook中注册。全部在Facebook开发者网站上的[[设置
。]下完成。

为了在我的应用程序中手动模拟朋友选择器,我执行了以下操作:

创建一个显示两个片段的选项卡活动。每个片段都显示一个列表。一个片段用于可用的朋友(

    / me / friends),另一个片段用于受邀请的朋友(
  1. / me / invitable_friends
)。使用相同的片段代码呈现两个选项卡。创建一个AsyncTask,它将从Facebook获取朋友数据。加载完数据后,将其扔到适配器上,适配器会将值呈现到屏幕上。
  • 详细信息

    The AsynchTask

    private class DownloadFacebookFriendsTask extends AsyncTask<FacebookFriend.Type, Boolean, Boolean> { private final String TAG = DownloadFacebookFriendsTask.class.getSimpleName(); GraphObject graphObject; ArrayList<FacebookFriend> myList = new ArrayList<FacebookFriend>(); @Override protected Boolean doInBackground(FacebookFriend.Type... pickType) { // // Determine Type // String facebookRequest; if (pickType[0] == FacebookFriend.Type.AVAILABLE) { facebookRequest = "/me/friends"; } else { facebookRequest = "/me/invitable_friends"; } // // Launch Facebook request and WAIT. // new Request( Session.getActiveSession(), facebookRequest, null, HttpMethod.GET, new Request.Callback() { public void onCompleted(Response response) { FacebookRequestError error = response.getError(); if (error != null && response != null) { Log.e(TAG, error.toString()); } else { graphObject = response.getGraphObject(); } } } ).executeAndWait(); // // Process Facebook response // // if (graphObject == null) { return false; } int numberOfRecords = 0; JSONArray dataArray = (JSONArray) graphObject.getProperty("data"); if (dataArray.length() > 0) { // Ensure the user has at least one friend ... for (int i = 0; i < dataArray.length(); i++) { JSONObject jsonObject = dataArray.optJSONObject(i); FacebookFriend facebookFriend = new FacebookFriend(jsonObject, pickType[0]); if (facebookFriend.isValid()) { numberOfRecords++; myList.add(facebookFriend); } } } // Make sure there are records to process if (numberOfRecords > 0){ return true; } else { return false; } } @Override protected void onProgressUpdate(Boolean... booleans) { // No need to update this, wait until the whole thread finishes. } @Override protected void onPostExecute(Boolean result) { if (result) { /* User the array "myList" to create the adapter which will control showing items in the list. */ } else { Log.i(TAG, "Facebook Thread unable to Get/Parse friend data. Type = " + pickType); } } }

    我创建的FacebookFriend类

    public class FacebookFriend {
    
        String facebookId;
        String name;
        String pictureUrl;
        boolean invitable;
        boolean available;
        boolean isValid;
        public enum Type {AVAILABLE, INVITABLE};
    
        public FacebookFriend(JSONObject jsonObject, Type type) {
            //
            //Parse the Facebook Data from the JSON object.
            //
            try {
                if (type == Type.INVITABLE) {
                    //parse /me/invitable_friend
                    this.facebookId =  jsonObject.getString("id");
                    this.name = jsonObject.getString("name");
    
                    // Handle the picture data.
                    JSONObject pictureJsonObject = jsonObject.getJSONObject("picture").getJSONObject("data");
                    boolean isSilhouette = pictureJsonObject.getBoolean("is_silhouette");
                    if (!isSilhouette) {
                        this.pictureUrl = pictureJsonObject.getString("url");
    
                    } else {
                        this.pictureUrl = "";
                    }
    
                    this.invitable = true;
                } else {
                    // Parse /me/friends
                    this.facebookId =  jsonObject.getString("id");
                    this.name = jsonObject.getString("name");
                    this.available = true;
                    this.pictureUrl = "";
                }
    
                isValid = true;
            } catch (JSONException e) {
                Log.w("#", "Warnings - unable to process Facebook JSON: " + e.getLocalizedMessage());
            }
        }
    }
    

  • 12
    投票

    3
    投票
    [如果您想从Facebook获得朋友列表,则需要将您的应用提交到Facebook中进行审核。查看一些登录权限:

    2
    投票
    从技术上讲纯正可以通过浏览器自动化来完成。

    这违反了Facebook的政策,因此,根据您所居住的国家/地区,这可能不合法

      您将不得不使用您的凭据/要求用户提供凭据并可能存储它们(即使对称加密也存储密码不是一个好主意)
    • 当Facebook更改其API时,您还必须更新浏览器自动化代码(如果不能强制更新应用程序,则应将浏览器自动化片段作为Web服务发布)



    -1
    投票
    user_friends权限,因为默认情况下,每次登录均不再包含

    user_friends

    ;我们必须添加它。每个用户必须授予user_friends权限才能出现在对[[/ me / friends
    © www.soinside.com 2019 - 2024. All rights reserved.