就是下面这个函数
- (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence{}
目前网上的demo都是用这个函数来获取好友列表的,但是此方法并不是用来获取好友列表的,他只能拿到线上好友的信息,如果这个好友没上线,你就无法取得这个好友的信息,一旦这个好友上线了,你就能取到,如果他下线了,这个时候你能获得他下线的信息。
//取得好友状态
doctorFriend.presenceType = [presence type];
//当前用户
NSString *userId = [[sender myJID] user];
userId = [NSString stringWithFormat:@"%@@%@",userId,HOSTNAME];
//在线用户
doctorFriend.name = [[presence from] user];
doctorFriend.name = [NSString stringWithFormat:@"%@@%@",doctorFriend.name,HOSTNAME];
NSLog(@"在线好友为:%@",doctorFriend.name);
//防止自己被加入到好友列表
if (![doctorFriend.name isEqualToString:userId]) {
//在线状态
if ([doctorFriend.presenceType isEqualToString:@"available"]) {
//把好友加入到好友列表中
[self newFriendsOnline:doctorFriend];
//这个函数是我用来reload好友列表页面的tableview的。
[self.friendsListDelegate passValue];
}else if ([doctorFriend.presenceType isEqualToString:@"unavailable"]) {
[self newFriendsOnline:doctorFriend];
[self.friendsListDelegate passValue];
}
}
}
下面是加入好友到自己的列表中的函数
-(void)newFriendsOnline:(Friend *)doctorFriend{
BOOL flag = NO;
for (int i=0; i<self.friends.count; i++) {
Friend * dFriend = [self.friends objectAtIndex:i];
if([dFriend.name isEqualToString:doctorFriend.name]){
if (!doctorFriend.first) {
//如果好友的状态改变了,也改变一下本地好友的状态(在线不在线)
[self.friends replaceObjectAtIndex:i withObject:doctorFriend];
}
flag = YES;
}
}
if(!flag){
[self.friends addObject:doctorFriend];
}
}
上面就可以获取到好友列表了(上面的网上demo的做法,我做了一些改进);
如何用tableview列出好友我就不写了。
之后我会写如果用花名册来获取好友列表,不管上线与否都能获取到,另外添加好友请求之类的都是要用这个实现的。