アプリケーションに iOS Facebook SDK を使用しています。私のアプリは、ユーザーの友達の写真にアクセスする必要があります。ただし、一部のユーザーは、アプリが写真にアクセスすることを拒否しています. 私がやりたいのは、アプリが写真にアクセスすることを許可しない友人をフィルタリングすることです. 私の現在のアプローチは、すべての友人に uid を配列に保存してもらい、その後、写真を共有していない友人を削除することです。このアプローチの問題は、非常に非効率的で遅いことです。
この特定のユーザーの友達のアクセス許可について、FQL または Graph API を使用してクエリを実行する方法があるかどうか知っていますか?
以下は私の現在の(非常に遅い)アプローチです。
- (void)retrieveFacebookFriends
{
if (FBSession.activeSession.isOpen)
{
FBRequestConnection *fbConnection = [[FBRequestConnection alloc] init];
NSMutableArray *arrayOfFriendIDS = [[NSMutableArray alloc] init];
NSMutableArray *arrayOfFriendsNames = [[NSMutableArray alloc] init];
[fbConnection addRequest:[FBRequest requestForMyFriends] completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
if (!error)
{
FBGraphObject *graphObject = (FBGraphObject *)result;
id content = [graphObject objectForKey:@"data"];
if ([content count] > 0)
{
//sort the friends by name
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"first_name" ascending:YES];
[content sortUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]];
id value;
for (value in content)
{
[arrayOfFriendIDS addObject:[value objectForKey:@"id"]];
[arrayOfFriendsNames addObject:[value objectForKey:@"name"]];
}
NSInteger size = [arrayOfFriendIDS count];
NSMutableArray *data = [[NSMutableArray alloc] initWithCapacity:size];
for (NSInteger i = 0; i < size; i++)
{
FriendRecord *record = [[FriendRecord alloc] init];
record.friendID = [arrayOfFriendIDS objectAtIndex:i];
record.name = [arrayOfFriendsNames objectAtIndex:i];
[data addObject:record];
}
self.friendRecords = [NSArray arrayWithArray:data];
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
__block NSMutableArray *tmpArray = [self.friendRecords mutableCopy];
__block int counter = 0;
for (value in content)
{
FBRequest *fql = [FBRequest requestForGraphPath:@"fql"];
[fql.parameters setObject:[NSString stringWithFormat:@"SELECT object_id FROM photo WHERE aid IN (SELECT aid FROM album WHERE owner=%@)",[value objectForKey:@"id"]]
forKey:@"q"];
[fql startWithCompletionHandler:^(FBRequestConnection *connection,
id result,
NSError *error)
{
counter++;
if (!error)
{
id permissionData = [result objectForKey:@"data"];
if ([permissionData count] == 0)
{
FriendRecord *record = [[FriendRecord alloc] init];
record.friendID = [value objectForKey:@"id"];
record.name = [value objectForKey:@"id"];
[tmpArray removeObject:record];
}
}
else
{
NSLog(@"error %@", error);
}
//check if it is the last record
if (counter == [self.friendRecords count])
{
self.friendRecords = [NSArray arrayWithArray:tmpArray];
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"filtering is finished");
[self.tableView reloadData];
});
}
}];
}
}
}
}];
[fbConnection start];
}
else
{
//open a facebook session
}
}
わかりました、非常に高速なこの FQL クエリを使用して問題を部分的に解決しました!
select uid, name from user where uid in (select owner from album where owner in (select uid2 from friend where uid1 = me())) order by name
ただし、アプリで写真を共有している友人の一部は、このクエリの回答に含まれていません! 最初は個人のアルバムがないからだと思っていたのですが、そうではないことを確認したところ、理由がわかりません。
この奇妙な問題を解決するのを手伝ってくれませんか? どうもありがとうございました!