如何使用 Facebook iOS SDK 4.0 获取包含用户名和 ID 的用户好友列表

Posted

技术标签:

【中文标题】如何使用 Facebook iOS SDK 4.0 获取包含用户名和 ID 的用户好友列表【英文标题】:How get User's Friends list that contain Username and ids using Facebook iOS SDK 4.0 【发布时间】:2015-03-30 09:18:37 【问题描述】:

我正在尝试获取用户的好友列表。 我在 FacebookSDK 3.12 中实现的最后一个工作代码现在没用了,因为 facebook 已经更改了他们所有的类,甚至删除了旧的类,下面是我的旧代码:

#pragma mark - Facebook Methods -
-(void)initiateFacebookSessionIfNot

    if (FBSession.activeSession.isOpen)
    
        [self getUserFriendsIds];
     else
    
        NSArray *permissions = [[NSArray alloc] initWithObjects:
                                @"user_birthday",@"friends_hometown",
                                @"friends_birthday",@"friends_location",
                                nil];
        [FBSession openActiveSessionWithReadPermissions:permissions allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState status,NSError *error)
         
             if (error) 
                 NSString *alertMessage, *alertTitle;

                 if (error.fberrorShouldNotifyUser) 
                     alertTitle = @"Something Went Wrong";
                     alertMessage = error.fberrorUserMessage;
                  else if (error.fberrorCategory == FBErrorCategoryUserCancelled) 
                     NSLog(@"user cancelled login");
                  else 
                     // For simplicity, this sample treats other errors blindly.
                     alertTitle  = @"Unknown Error";
                     alertMessage = @"Error. Please try again later.";
                     NSLog(@"Unexpected error:%@", error);
                 

                 if (alertMessage)
                 
                     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:alertTitle
                                                                     message:error.fberrorUserMessage
                                                                    delegate:nil
                                                           cancelButtonTitle:@"OK"
                                                           otherButtonTitles:nil];
                     [alert show];
                 
              else if (FB_ISSESSIONOPENWITHSTATE(status)) 
                 [self getUserFriendsIds];
             
         ];
    

-(void)getUserFriendsIds

    FBRequest *friendRequest = [FBRequest requestForGraphpath:@"me/friends?fields=name,username"];
    [ friendRequest startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) 
        NSMutableArray *fbFriendIDs;
        NSMutableArray *fbFriendsName;
        NSMutableArray *fbFriendsUserName;

        NSMutableArray *data = [[NSMutableArray alloc]initWithArray:[result objectForKey:@"data"]];
        [data enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) 
            if (!(NSDictionary*)obj[@"username"]) 

                NSDictionary *newDictionary =@@"id": (NSDictionary*)obj[@"id"],
                                               @"name": (NSDictionary*)obj[@"name"],
                                               @"username": @"0"
                                               ;
                [data replaceObjectAtIndex:idx withObject:newDictionary];
            
        ];

        fbFriendsUserName = [[NSMutableArray alloc]initWithArray:[data valueForKeyPath:@"@unionOfObjects.username"]];
        fbFriendsName = [[NSMutableArray alloc]initWithArray:[data valueForKeyPath:@"@unionOfObjects.name"]];
        fbFriendIDs = [[NSMutableArray alloc]initWithArray:[data valueForKeyPath:@"@unionOfObjects.id"]];

        NSDictionary *queryDictionary =
        @@"user_id": userObj.user_id,
          @"friend_ids":[fbFriendIDs componentsJoinedByString:@","],
          @"names":[fbFriendsName componentsJoinedByString:@","],
          @"usernames":[fbFriendsUserName componentsJoinedByString:@","]
          ;

        [[RequestHandler sharedClient] CheckFBFriendsWithDictionary:queryDictionary WithCompletionBlock:^(NSArray *TUNFriendsArray, NSArray *FBFriendsArray, NSString *errorMessage) 
            if (!errorMessage) 

                tunFriendsArray = [[NSMutableArray alloc]initWithArray:TUNFriendsArray];
//                fbFriendsArray = [[NSMutableArray alloc]initWithArray:FBFriendsArray];

                [_facebookTableView reloadData];
            
            else
                [ApplicationUtilities ShowAlertViewWithTitle:APP_NAME Message:errorMessage];
            
        ];
    ];
    [SVProgressHUD dismiss];

【问题讨论】:

【参考方案1】:

Facebook 在其新版本(即 V2.0)中更改了很多实现,其中 Tag-gable Friends API、Invitable Friend API、Social Context API、Business Mapping API 和 Tagged Places API 是新功能。 他们还进行了许多权限更改,以提高安全性,请从以下链接阅读更多内容

https://developers.facebook.com/docs/apps/changelog#v2_0_permissions

希望您能从以上链接中找到所需的实施更改。

【讨论】:

【参考方案2】:

不再可能接收username字段,以及除了public_profile之外的用户朋友的所有信息,因为从v2.0开始,所有friends_*权限都被删除了。

此外,您不会收到完整的朋友列表,而只会收到那些也使用您的应用的朋友。

https://developers.facebook.com/docs/apps/changelog#v2_0_graph_api https://developers.facebook.com/docs/apps/changelog#v2_0_permissions

行情:

/me/username 不再可用。

/me/friends 端点不再包含一个人的朋友的完整列表。相反,它现在会返回该人也在使用您的应用的朋友列表。

所有friends_* 权限已被删除。

【讨论】:

snap,我正要发送我的答案。会赞成你的:) 我们知道用户 ID 是 public_profile 上显示的对象,所以这也不能只获取用户 ID 它已经在我的回答中了。第二个报价。我建议您阅读我链接的文档。都在里面!我猜这是人们可以期待的最小努力。 是的,很遗憾人们懒得在 google 或 *** 上搜索,或者只是看看官方文档和更新日志...... “为什么人们发布问题?” – 那么,人们为什么发布这个特定的问题?显然,因为他们懒得事先自己阅读内容……您在这里被告知的所有内容都在 FB API 更改日志和文档中明确提及,并且之前已经讨论过一千次。跨度>

以上是关于如何使用 Facebook iOS SDK 4.0 获取包含用户名和 ID 的用户好友列表的主要内容,如果未能解决你的问题,请参考以下文章

Facebook iOS SDK > 4.0 替代 initWithAppId?

iOS Facebook sdk 4.0 分享图片

适用于 iOS 4.0 的 Facebook sdk

Facebook SDK 4.0 iOS 不再快速切换到设备上安装的 Facebook APP

Facebook SDK 4.0 IOS Swift 以编程方式注销用户

Facebook iOS SDK 4.0“App Invites”在没有 iOS 通知的情况下发送