7

アプリにxmppを統合し、すべてのユーザーをテーブルビューに一覧表示できるようにしましたが、オンラインユーザーのみを表示してから、オンラインの友達にメッセージを送受信する機能を実装したいと考えています...

役立つコードを教えてください...

これが私のコードで、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];

}

ユーザーをオンラインで表示し、チャット機能を実装するためのxmppフレームワークの実際のフローがわかりません...

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

そして、オンラインとオフラインのユーザープレゼンスのための2つの方法ですが、私のタスクのためにそれらを変更する方法がわかりません。

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

1 に答える 1

7

たくさんの努力の末、ついにオンライン/オフライン/アウェイユーザーを表示する方法を見つけました。

経験の浅いユーザーにも役立つように、私がどのようにそれを行ったかを段階的に説明します。

ステップ1-チャットボタンをクリックすると、次のメソッドを呼び出します-

-(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が呼び出されます。ここに、含める必要のあるデリゲートメソッドを示します-

#pragma mark FBLoginDialogDelegate

/***ユーザーが正常にログインしたときに呼び出されます。*/

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

}

/***ユーザーがログインせずにダイアログを閉じたときに呼び出されます。*/

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

/***ユーザーがログアウトしたときに呼び出されます。* /

  - (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メソッドの2行目はFBRequestDelegateメソッドを呼び出すため、このプロトコルを.hクラスに含めて、ユーザー(ログインしている、現在のユーザーを意味する)のuidを取得する必要があります。以下を実装する必要があります。メソッド-

プラグママーク

プラグママークFBRequestDelegate

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

/ ** *リクエストが返され、そのレスポンスがオブジェクトに解析されたときに呼び出されます。*結果のオブジェクトは、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);

 } 

ステップ4-テーブルビューのDataSourceメソッドとDelegateメソッドが表示されます。これらを実装する必要があります。ここに、メソッドがあります-

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

//NSFetchedResultsControllerDelegateを実装する必要があります}

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

{NSArray * sections=[[自己fetchedResultsController]セクション];

    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;

}

ステップ5-最後に、NSFetchedResultsControllerデリゲートメソッドも実装する必要があります。これにより、チャットユーザーでテーブルを埋めることができます。ここに、メソッドがあります-

- (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-コードをコンパイルして実行すると、ユーザーリストがテーブルビューに表示されます

何か問題が発生した場合は、共有してください、私はいつもあなたを助けるためにここにいます。そして、この答えを投稿している間にいくつかの間違いがあったとしても気にしないでください、cz私は3回目だけ投稿しています

ありがとう。

于 2011-03-25T11:39:30.757 に答える