iOS如何检查Facebook好友是否安装了应用程序?

12

是否已经有一种途径可以通过Facebook iOS API获取安装了您的应用程序的朋友列表?我基本上需要类似于“Words with Friends”的功能,在其中可以确定哪些FB好友正在玩游戏。我有一个解决方案,需要一些额外的数据库使用,但希望也许FB API已经内置了这种查询。


1
相关:如何在 iOS SDK 中使用 FQL - user244343
4个回答

10
创建一个 FBFriendPickerDelegate 代理类,重写此函数:
-(BOOL)friendPickerViewController:(FBFriendPickerViewController *)friendPicker shouldIncludeUser:(id<FBGraphUser>)user{
    BOOL installed = [user objectForKey:@"installed"] != nil;
    return installed;
}

对于没有安装你的应用程序的用户,installed 字段将为 nil,但在加载数据时你必须请求它:

self.friendsController = [[FBFriendPickerViewController alloc] initWithNibName:nil bundle:nil];
//...
NSSet *fields = [NSSet setWithObjects:@"installed", nil];
self.friendPickerController.fieldsForRequest = fields;
//...
[self.friendsController loadData];

我该如何测试它?我想在模拟器上测试它。但现在我的 Facebook 好友列表中没有任何一个朋友拥有该应用程序,因为它目前正在开发中。我正在得到空列表(参考:好友选择控制器示例)。我该如何创建一个虚拟用户(FB 好友),可以在应用程序用户列表中显示? - YogiAR
前往 Facebook 注册一个新用户,将他添加为好友并在他的帐户上安装应用程序。我认为这应该是显而易见的。 - pckill
是的,我明白了。谢谢您的回复。当用户使用iOS应用程序登录Facebook时,Facebook会自动存储引用。 - YogiAR

9

我觉得fql对我来说有点复杂,因此我使用FBRequest中的这个函数调用Graph API来解决Facebook SDK 3.5中的这个问题。

+ (FBRequest *)requestWithGraphPath:(NSString*)graphPath parameters:(NSDictionary*)parameters HTTPMethod:(NSString*)HTTPMethod;

代码如下:

FBRequest *request =  [FBRequest  requestWithGraphPath:@"me/friends"
                         parameters:@{@"fields":@"name,installed,first_name"}
                         HTTPMethod:@"GET"];

[request startWithCompletionHandler:^(FBRequestConnection *connection,
                                     id result,
                                      NSError *error){



}];

您可以将所有感兴趣的字段放入参数字典中。根据 SDK 参考文档,该对象包含类型(始终为“user”)、用户 ID(用户的 ID)和可选的已安装字段(如果返回,则始终为 true)。仅当用户已安装应用程序时,才会返回已安装字段;否则它不是返回对象的一部分。

使用您的代码,我们可以获取所有我的朋友,那么如何获取应用程序用户的好友? - kirti Chavda
@kirtimali,请检查返回对象中的“installed”字段。 - DeXter
谢谢,我找到了解决方案。 - kirti Chavda
@kirtimali 你的所有Facebook好友中没有包含已安装字段的返回对象吗?请确保你的好友已将他们的Facebook账号连接到你的应用程序。 - DeXter
使用invitable_friends,它将返回所有未使用此应用程序的朋友。但是它说“此方法仅适用于游戏”。如何解决这个问题? - Satyam

2

我曾经使用过这段代码从用户那里获取应用程序的好友。

facebook 是随 FB Connect 一起提供的 Facebook 类。

NSString *fql = [NSString stringWithFormat:@"SELECT name,uid, pic_small FROM user WHERE is_app_user = 1 AND uid IN (SELECT uid2 FROM friend WHERE uid1 = %@) order by concat(first_name,last_name) asc",userId,userId]];

NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:fql ,@"query", [facebook accessToken], @"access_token", nil];

[facebook requestWithMethodName:@"fql.query" andParams:params andHttpMethod:@"GET" andDelegate:self];

那看起来非常优雅,但我不熟悉FQL。你如何确定他们正在运行你的应用程序?我认为需要一个应用程序ID才行,或者说is_app_user是什么? - Firefly
如果您正在使用Facebook Connect for iOS,则在实例化时应设置您的应用程序ID。facebook = [[Facebook alloc] initWithAppId:yourAppId];。之后,所有请求都将使用您的appid进行标识。is_app_user是一个标志,表示某个用户是否安装了发送请求的应用程序。 - Ignacio Inglese
啊,太棒了。非常感谢您的澄清! - Firefly
你尝试过这个解决方案吗?如果它有效,请不要忘记打勾标记。 - zakdances
但是你怎么知道你的朋友正在使用特定的应用程序呢? - Abhinandan Sahgal
据我所知,你只能知道朋友是否正在使用你发起请求的应用程序。 - Ignacio Inglese

1
最简单的解决方案是使用HTML标记。
- (BOOL)friendPickerViewController: shouldIncludeUser: 

最新的3.5.1 Facebook SDK(2013年6月)中实现了FBFriendPickerDelegate协议的方法,根据在获取“me/friends”时的“installed”字段,询问代理是否将朋友包含在列表中。

如果朋友也是调用应用程序的用户,则“installed”字段存在(true)。

您可以像这样使用:

- (BOOL)friendPickerViewController:(FBFriendPickerViewController *)friendPicker
                 shouldIncludeUser:(id <FBGraphUser>)user {
        return [[user objectForKey:@"installed"] boolValue];     
}

重要提示!您需要包含以下内容来在请求中包含该字段,并通知friendPicker其委托:

    self.fieldsForRequest = [NSSet setWithObject:@"installed"];
    self.delegate = self;

您可以通过使用Graph API Explorer并输入查询语句me/friends?fields=installed来验证只有安装了应用程序的朋友才会显示。您可以像这样获取您的朋友列表,其中一个用户已安装您的应用程序(为true):
...
{
  "id": "100002656xxxxxx"
}, 
{
  "installed": true, 
  "id": "100004366xxxxxx"
},
...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接