如何使用 xmpp 框架仅在 facebook 上列出在线用户 [英] How to list only online users on facebook with xmpp framework

查看:19
本文介绍了如何使用 xmpp 框架仅在 facebook 上列出在线用户的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在我的应用程序中集成了 xmpp 并能够在表格视图中列出所有用户,但我只想显示在线用户,然后想要实现向我的在线朋友发送和接收消息的功能......

I have integrated xmpp in my app and able to list all the users in a table view, but I only want to display the online users and then want to implement the feature to send and recieve messages to my online friends...

请给我推荐一些有用的代码...

Please suggest me some helpful code...

这是我的代码,在 facebook 登录后执行.

Here is my code, executed after facebook login.

    - (void)fbDidLogin
{
    NSLog(@"logged in.....................");
    [appDelegate.facebook requestWithGraphPath:@"me" andDelegate:self]; 

    DDLogVerbose(@"%s accessToken: %@ expirationDate: %@",__PRETTY_FUNCTION__,appDelegate.facebook.accessToken,appDelegate.facebook.expirationDate);
    self.accessToken = appDelegate.facebook.accessToken;

    if (xmppStreamFB) {  
        [xmppStreamFB release];  
        xmppStreamFB = nil;  
    }
    xmppStreamFB = [[XMPPStreamFacebook alloc] init];
    xmpReconnect = [[XMPPReconnect alloc] initWithStream:xmppStreamFB];  

    if (xmppRosterStorage) {  
        [xmppRosterStorage release];  
        xmppRosterStorage = nil;  
    }
    xmppRosterStorage = [[XMPPRosterCoreDataStorage alloc] init];

    if (xmppRoster) {  
        [xmppRoster release];  
        xmppRoster = nil;  
    } 
    xmppRoster = [[XMPPRoster alloc] initWithStream:xmppStreamFB rosterStorage:xmppRosterStorage];

    [xmppStreamFB addDelegate:self];
    [xmppRoster addDelegate:self];
    [xmppRoster setAutoRoster:YES];

    xmppStreamFB.myJID = [XMPPJID jidWithString:[NSString stringWithFormat:@"%@@chat.facebook.com", uid]];

    // You may need to alter these settings depending on the server you're connecting to
    allowSelfSignedCertificates = NO;
    allowSSLHostNameMismatch = YES;

    // Uncomment me when the proper information has been entered above.
    NSError *error = nil;
    if (![xmppStreamFB connect:&error]) 
        NSLog(@"Error connecting: %@", error);

    if(!tableView)
    {
        tableView = [[UITableView alloc]initWithFrame:CGRectMake(0,0, 480, 320) style:UITableViewStylePlain];
    }
    [tableView setFrame:CGRectMake(0,0, 480, 320)];
    [tableView setTag:2];
    [tableView setDelegate:self];
    [tableView setDataSource:self];
    [tableView setHidden:NO];
    [tableView setBackgroundColor:[UIColor clearColor]];
    [tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];
    [tableView setAlpha:1.0];

    [self.view addSubview:tableView];

    [self.tableView reloadData];
    [self showTopBar];

}

我不知道用于在线显示用户和实现聊天功能的 xmpp 框架的实际流程...

I don't know the actual flow of the xmpp framework for showing users online and to implement chat feature...

i have the following delegate methods as well..

    - (void)xmppStreamDidSecure:(XMPPStreamFacebook *)sender
{
    NSLog(@"---------- xmppStreamDidSecure: ----------");
}

- (void)xmppStreamDidConnect:(XMPPStreamFacebook *)sender
{
    NSLog(@"---------- xmppStreamDidConnect: ----------");

    isOpen = YES;

    NSError *error = nil;

    if (![self.xmppStreamFB authenticateWithAppId:_APP_ID accessToken:self.accessToken error:&error])
    {
        NSLog(@"Error authenticating: %@", error);
    }
    else {
        NSLog(@"NO Error authenticating:");
        /*
        ChatViewController *cvc = [[ChatViewController alloc] init];
        [self.view addSubview:cvc.view];*/
    }

}
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender
{
    NSLog(@"---------- xmppStreamDidAuthenticate: ----------");

    [self goOnline];
}

- (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(NSXMLElement *)error
{
    NSLog(@"---------- xmppStream:didNotAuthenticate: ----------");
}

- (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq
{
    NSLog(@"---------- xmppStream:didReceiveIQ: ----------");
    /*
    ChatViewController *cvc = [[ChatViewController alloc] init];
    [self.view addSubview:cvc.view];*/

    return NO;
}

- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message
{
    NSLog(@"---------- xmppStream:didReceiveMessage: ----------");
}

- (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence
{
    NSLog(@"---------- xmppStream:didReceivePresence: ----------");

}

- (void)xmppStream:(XMPPStream *)sender didReceiveError:(id)error
{
    NSLog(@"---------- xmppStream:didReceiveError: ----------");
}

- (void)xmppStreamDidDisconnect:(XMPPStream *)sender
{
    NSLog(@"---------- xmppStreamDidDisconnect: ----------");

    if (!isOpen)
    {
        NSLog(@"Unable to connect to server. Check xmppStream.hostName");
    }
}

还有在线和离线用户状态的两种方法,但不知道如何为我的任务修改它们:

And the two methods for online and offline user presence, but don't know how to modify them for my task:

    - (void)goOnline
{
    NSXMLElement *presence = [NSXMLElement elementWithName:@"presence"];

    [[self xmppStream] sendElement:presence];
}

- (void)goOffline
{
    NSXMLElement *presence = [NSXMLElement elementWithName:@"presence"];
    [presence addAttributeWithName:@"type" stringValue:@"unavailable"];

    [[self xmppStream] sendElement:presence];
}

推荐答案

经过大量努力,我终于找到了如何显示在线/离线/离开的用户.

finally after lots of efforts i found out how to show online/offline/away users.

我将逐步告诉您我是如何做到的,这样我也可以对经验不足的用户有用..

i'm going to tell you step by step how i did it, so that i can be useful for the less experienced users too..

步骤 1- 点击聊天按钮,我调用以下方法-

Step 1- on click of chat button i'm calling the following method-

-(void) chatFacebook
{
   if (appDelegate.facebook == nil)
   {
     appDelegate.facebook = [[[Facebook alloc] initWithAppId:_APP_ID] autorelease];
   }

if (!accessToken)
{
    [appDelegate.facebook authorize:[XMPPStreamFacebook permissions] delegate:self appAuth:NO safariAuth:NO]; 
}
else
{
    [self fbDidLogin];
}

}

第 2 步 - 现在是登录对话框委托方法进来的时候了,如果登录成功,则调用 fbDidLogin,这里是您应该包含的委托方法-

step 2- Now its time for login dialog delegate methods to come in , if the login is successfull the fbDidLogin is called, here are the delegate methods you should include-

#pragma mark FBLoginDialogDelegate

/*** 当用户成功登录时调用.*/

/** * Called when the user successfully logged in. */

- (void)fbDidLogin
{
NSLog(@"logged in.....................");
[appDelegate.facebook requestWithGraphPath:@"me" andDelegate:self]; 

DDLogVerbose(@"%s accessToken: %@ expirationDate: %@",__PRETTY_FUNCTION__,appDelegate.facebook.accessToken,appDelegate.facebook.expirationDate);
self.accessToken = appDelegate.facebook.accessToken;

if (xmppStream) {  
    [xmppStream release];  
    xmppStream = nil;  
}
xmppStream = [[XMPPStreamFacebook alloc] init];
xmpReconnect = [[XMPPReconnect alloc] initWithStream:xmppStream];  

if (xmppRosterStorage) {  
    [xmppRosterStorage release];  
    xmppRosterStorage = nil;  
}
xmppRosterStorage = [[XMPPRosterCoreDataStorage alloc] init];

if (xmppRoster) {  
    [xmppRoster release];  
    xmppRoster = nil;  
} 
xmppRoster = [[XMPPRoster alloc] initWithStream:xmppStream rosterStorage:xmppRosterStorage];

[xmppStream addDelegate:self];
[xmppRoster addDelegate:self];
[xmppRoster setAutoRoster:YES];

xmppStream.myJID = [XMPPJID jidWithString:[NSString stringWithFormat:@"%@@chat.facebook.com", uid]];

// You may need to alter these settings depending on the server you're connecting to
allowSelfSignedCertificates = NO;
allowSSLHostNameMismatch = YES;

// Uncomment me when the proper information has been entered above.
NSError *error = nil;
if (![xmppStream connect:&error]) 
    NSLog(@"Error connecting: %@", error);

if(!tableView)
{
    tableView = [[UITableView alloc]initWithFrame:CGRectMake(0,0, 480, 320) style:UITableViewStylePlain];
}
[tableView setFrame:CGRectMake(0,0, 480, 320)];
[tableView setTag:2];
[tableView setDelegate:self];
[tableView setDataSource:self];
[tableView setHidden:NO];
[tableView setBackgroundColor:[UIColor clearColor]];
[tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];
[tableView setAlpha:1.0];

[self.view addSubview:tableView];

[self.tableView reloadData];
[self showTopBar];

}

/*** 当用户在没有登录的情况下关闭对话框时调用.*/

/** * Called when the user dismissed the dialog without logging in. */

  - (void)fbDidNotLogin:(BOOL)cancelled
  {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Canceled" message:@"Login cancled" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
[alert release];
}

/*** 当用户登出时调用.*/

/** * Called when the user logged out. */

  - (void)fbDidLogout
 {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Logged out" message:@"Logged out" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
[alert release];
  }

第 3 步 - fbDidLogin 方法的第二行调用 FBRequestDelegate 方法,因此您应该在 .h 类中包含此协议,以获取您需要的用户的 uid(已登录,表示当前用户)实现以下方法-

Step 3- The second line of the fbDidLogin method calls the FBRequestDelegate methods so you should include this protocol in your .h class, to get the uid of the user(which is logged in , means the current user) you need to implement the following methods-

  - (void)request:(FBRequest*)request didFailWithError:(NSError*)error{ 
     DDLogError(@"%s %@",__PRETTY_FUNCTION__,error); 
     //[appDelegate.facebook logout:self]; 
 } 

/*** 当请求返回并且其响应已被解析为对象时调用.* 结果对象可能是字典、数组、字符串或数字,具体取决于* 关于 API 响应的格式.*/

/** * Called when a request returns and its response has been parsed into an object. * The resulting object may be a dictionary, an array, a string, or a number, depending * on thee format of the API response. */

  - (void)request:(FBRequest*)request didLoad:(id)result { 
    DDLogVerbose(@"%s............DDLOG................... %@",__PRETTY_FUNCTION__,result); 

NSLog(@" Result>>>>-------%@", result);

NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:(NSMutableDictionary *)result];

uid = [dict objectForKey:@"id"];
NSLog(@"iddddddddddddd---%@", uid);

 } 

第 4 步- 现在来了表视图的 DataSource 和 Delegate 方法,您需要实现这些,这里是方法-

Step 4- Now comes the table view DataSource and Delegate methods, you need to implement these, here are the methods-

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView1
{
    return [[[self fetchedResultsController] sections] count];

//需要实现 NSFetchedResultsControllerDelegate}

// need to implement NSFetchedResultsControllerDelegate }

- (NSString *)tableView:(UITableView *)sender titleForHeaderInSection:(NSInteger)sectionIndex

{NSArray *sections = [[self fetchedResultsController] 部分];

{ NSArray *sections = [[self fetchedResultsController] sections];

    if (sectionIndex < [sections count])
    {
        id <NSFetchedResultsSectionInfo> sectionInfo = [sections objectAtIndex:sectionIndex];

        int section = [sectionInfo.name intValue];
        switch (section)
        {
            case 0  : return @"Available";
            case 1  : return @"Away";
            default : return @"Offline";
        }
    }


}
return @"";
 }


 - (NSInteger)tableView:(UITableView *)tableView1 numberOfRowsInSection:(NSInteger)sectionIndex
 {
    NSArray *sections = [[self fetchedResultsController] sections];

    if (sectionIndex < [sections count])
    {
        id <NSFetchedResultsSectionInfo> sectionInfo = [sections objectAtIndex:sectionIndex];
        return sectionInfo.numberOfObjects;
        NSLog(@"section ifnfo ===========%@", sectionInfo);
    }   
}
return 0;
  }

- (UITableViewCell *)tableView:(UITableView *)tableView1 cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                       reuseIdentifier:CellIdentifier] autorelease];
    }

    tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    [cell setSelectionStyle:UITableViewCellSelectionStyleGray];

    user = [[self fetchedResultsController] objectAtIndexPath:indexPath];

    cell.textLabel.text = user.displayName;

    cell.textLabel.textColor = [UIColor whiteColor];


    cell1 = cell;

}

Step 5- 最后你还需要实现 NSFetchedResultsController 委托方法,这样你就可以用聊天用户填充表格,这里是方法-

Step 5- Finally you also need to implement NSFetchedResultsController delegate methods , so that you can fill table with the chat users, here are the methods-

- (NSFetchedResultsController *)fetchedResultsController
{
if (fetchedResultsController == nil)
{
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"XMPPUserCoreDataStorage"
                                              inManagedObjectContext:[self managedObjectContext]];

    NSSortDescriptor *sd1 = [[NSSortDescriptor alloc] initWithKey:@"sectionNum" ascending:YES];
    NSSortDescriptor *sd2 = [[NSSortDescriptor alloc] initWithKey:@"displayName" ascending:YES];

    NSArray *sortDescriptors = [NSArray arrayWithObjects:sd1, sd2, nil];

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [fetchRequest setEntity:entity];
    [fetchRequest setSortDescriptors:sortDescriptors];
    [fetchRequest setFetchBatchSize:10];

    fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                                                   managedObjectContext:[self managedObjectContext]
                                                                     sectionNameKeyPath:@"sectionNum"
                                                                              cacheName:nil];
    [fetchedResultsController setDelegate:self];

    [sd1 release];
    [sd2 release];
    [fetchRequest release];

    NSError *error = nil;
    if (![fetchedResultsController performFetch:&error])
    {
        NSLog(@"Error performing fetch: %@", error);
    }
}

return fetchedResultsController;
 }

  - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
 {
[[self tableView] reloadData];
 }

第 6 步 - 编译并运行您的代码,用户列表应出现在表格视图中

Step 6 - Compile and run your code ,user list should appear in table view

如果出现任何问题,请分享,我总是在这里为您提供帮助.请不要介意发布此答案时是否有错误,因为我是第三次发布

if any problems appears, please share , i'm always here to help you .And please dont mind if there are some mistakes while posting this answer, cz i'm posting just for the third time

谢谢.

这篇关于如何使用 xmpp 框架仅在 facebook 上列出在线用户的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆