2011-03-14 2 views
7

J'ai intégré xmpp dans mon application et je peux lister tous les utilisateurs dans une vue de table, mais je veux seulement afficher les utilisateurs en ligne et ensuite vouloir mettre en envoyer des messages à maintenant et recevez mes amis en ligne ...Comment lister uniquement les utilisateurs en ligne sur facebook avec xmpp framework

S'il vous plaît me suggérer un code utile ...

Voici mon code, exécuté après la connexion facebook.

- (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]; 

} 

Je ne sais pas le débit réel du cadre XMPP pour montrer les utilisateurs en ligne et à mettre en œuvre fonctionnalité de chat ...

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"); 
    } 
} 

Et les deux méthodes de présence d'un utilisateur en ligne et hors ligne, mais ne savent pas comment les modifier pour ma tâche:

- (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]; 
} 
+0

Très utile en effet: http://msmvps.com/blogs/jon_skeet/archive/2010/08/29/writing-the-perfect-question.aspx –

+0

Bonjour Rakesh, C'est une excellente suggestion mais qu'est ce que 'managedObjectContext'. Pouvez-vous s'il vous plaît nous donner un exemple de code afin que nous puissions le comprendre. Merci d'avance. – Apekshit

+0

Salut Rakesh, Pouvez-vous me suggérer un lien tutoriel ou une démo pour Xmppframework ou de toute aide. Dans la méthode authenticateWithPassword, j'obtiens cette erreur messase- "résumé de l'erreur d'analyse de chaîne"? Merci – Yogendra

Répondre

7

enfin, après beaucoup d'efforts, j'ai découvert comment montrer en ligne/hors ligne Partielle/utilisateurs.

je vais vous dire étape par étape, comment je l'ai fait, afin que je puisse être utile pour les utilisateurs moins expérimentés aussi ..

Étape 1 sur clic de bouton de chat j'appelle la suivant méthodolo-

-(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]; 
} 

}

étape 2 maintenant il est temps pour les méthodes de délégué de dialogue de connexion pour entrer, si la connexion est successfull le fbDidLogin est appelé, voici les méthodes de délégués vous devriez comprennent-

#pragma mark FBLoginDialogDelegate 

/** * Appelé lorsque l'utilisateur connecté avec succès. */

- (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]; 

}

/** * Appelé lorsque l'utilisateur a rejeté la boîte de dialogue sans vous connecter. */

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

/** * appelé WHE n l'utilisateur s'est déconnecté. */

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

Étape 3 La deuxième ligne de la méthode fbDidLogin appelle les méthodes FBRequestDelegate de sorte que vous devez inclure ce protocole dans votre classe .h, pour obtenir le uid de l'utilisateur (qui est connecté, des moyens l'utilisateur actuel) vous devez mettre en œuvre la méthodes- suivante

marque pragma

marque pragma FBRequestDelegate

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

/** * Appelé lorsqu'une requête est renvoyée et que sa réponse a été analysée dans un objet. * L'objet résultant peut être un dictionnaire, un tableau, une chaîne ou un nombre, selon * sur le format de la réponse API. */

- (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); 

} 

Étape 4 est maintenant le point de vue de la table DataSource et les méthodes délégué, vous devez les mettre en œuvre, voici le méthodes-

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

// doivent mettre en œuvre NSFetchedResultsControllerDelegate }

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

{ 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; 

}

Étape 5 Enfin, vous devez également mettre en œuvre des méthodes de délégués NSFetchedResultsController, de sorte que vous pouvez remplir le tableau avec les utilisateurs de chat, voici le méthodes-

- (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]; 
} 

Étape 6 - compiler et exécuter votre code, la liste des utilisateurs doit apparaître dans la vue tableau

si un problème apparaît, s'il vous plaît partager, je suis toujours là pour vous aider .Et s'il vous plaît ne vous dérange pas si t voici quelques erreurs tout en affichant cette réponse, cz je poste juste pour la troisième fois

Merci.

+0

merci Pugal pour modifier .... – Rakesh

+0

uid = [dict objectForKey: @ "id"]; devrait être remplacé par uid = [dict objectForKey: @ "uid"]; – manutd

+0

@Rakesh Je suis familier avec l'API Facebook, mais très nouveau pour la norme XMPP, et j'ai récemment posté cette question (http://stackoverflow.com/questions/27222641/fetch-online-presence-for-thousands-of-facebook- utilisateurs de l'application). La méthode ci-dessus offre-t-elle un moyen de rendre le statut en ligne efficace pour les utilisateurs d'applications Facebook qui ne sont pas amis entre eux? J'adorerais vos conseils de toute façon, et merci. – user1544138

Questions connexes