简体   繁体   中英

iOS XMPP not able to send message

i am working on XMPP based ios project. i am tring to send message but i am not able to send message. means receiver will not receive the message. here is my code.

- (IBAction)sendMessageNow:(id)sender
{

 NSString *messageStr =messageField.text;

if([messageStr length] > 0)
{
    NSLog(@"Message sending fron Gmail");
    NSXMLElement *body = [NSXMLElement elementWithName:@"body"];
    [body setStringValue:messageStr];
    NSXMLElement *message = [NSXMLElement elementWithName:@"message"];
    [message addAttributeWithName:@"type" stringValue:@"chat"];
    [message addAttributeWithName:@"to" stringValue:@"destination address"];
    [message addChild:body];
    NSLog(@"message1%@",message);

    [[self appDelegate].xmppStream sendElement:message];
}

  NSDate *date = [NSDate date];
  NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
 [formatter setDateFormat:@"hh:mm a"];
//[self sendMessage];

if ([self.messageField.text length]>0) {

    if (isfromMe)
    {
        NSString *rowNum=[NSString stringWithFormat:@"%d",(int)sphBubbledata.count];
        [self adddMediaBubbledata:kTextByme mediaPath:self.messageField.text mtime:[formatter stringFromDate:date] thumb:@"" downloadstatus:@"" sendingStatus:kSending msg_ID:[self genRandStringLength:7]];
        [self performSelector:@selector(messageSent:) withObject:rowNum afterDelay:1];

        isfromMe=NO;
    }
    else
    {
        [self adddMediaBubbledata:kTextByOther mediaPath:self.messageField.text mtime:[formatter stringFromDate:date] thumb:@"" downloadstatus:@"" sendingStatus:kSent msg_ID:[self genRandStringLength:7]];
        isfromMe=YES;
    }
    self.messageField.text=@"";
    [self.chattable reloadData];
    [self scrollTableview];
  }
  }

and here is my senderdidreceivemessage method from appdelegate.m

- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message
 {
   DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD);


 [[self xmppStream] sendElement:message];

        UILocalNotification *localNotification = [[UILocalNotification alloc] init];
    localNotification.alertAction = @"OK";
   localNotification.fireDate = [NSDate date];
  //  localNotification.alertBody = xmppmessage;
 localNotification.soundName = UILocalNotificationDefaultSoundName;
   [[UIApplication sharedApplication] presentLocalNotificationNow:localNotification];




   // A simple example of inbound message handling.

if ([message isChatMessageWithBody])
 {
    XMPPUserCoreDataStorageObject *user = [xmppRosterStorage userForJID:[message from]
                                                             xmppStream:xmppStream
                                                   managedObjectContext:[self managedObjectContext_roster]];

    NSString *body = [[message elementForName:@"body"] stringValue];
    NSString *displayName = [user displayName];

    if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateActive)
    {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:displayName
                                                            message:body
                                                            delegate:nil
                                                  cancelButtonTitle:@"Ok"
                                                  otherButtonTitles:nil];
        [alertView show];
    }
    else
    {
        // We are not active, so use a local notification instead
          UILocalNotification *localNotification =     [[UILocalNotification alloc] init];
        localNotification.alertAction = @"Ok";
        localNotification.alertBody = [NSString stringWithFormat:@"From: %@\n\n%@",displayName,body];

        [[UIApplication sharedApplication] presentLocalNotificationNow:localNotification];
    }
  }
}

EDIT

   - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 {
  static NSString *L_CellIdentifier = @"SPHTextBubbleCell";
  static NSString *R_CellIdentifier = @"SPHMediaBubbleCell";



   SPH_PARAM_List *feed_data=[[SPH_PARAM_List alloc]init];
   feed_data=[sphBubbledata objectAtIndex:indexPath.row];

   if ([feed_data.chat_media_type isEqualToString:kTextByme]||[feed_data.chat_media_type isEqualToString:kTextByOther])
   {
     SPHTextBubbleCell *cell = (SPHTextBubbleCell *) [tableView dequeueReusableCellWithIdentifier:L_CellIdentifier];
      if (cell == nil)
     {
        cell = [[SPHTextBubbleCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:L_CellIdentifier];
    }
    XMPPUserCoreDataStorageObject *user = [[self fetchedResultsController] objectAtIndexPath:indexPath];
    //cell.textLabel.text = user.displayName;
    //[self configurePhotoForCell:cell user:user];


    cell.bubbletype=([feed_data.chat_media_type isEqualToString:kTextByme])?@"LEFT":@"RIGHT";
    cell.textLabel.text = user.displayName;
    cell.textLabel.tag=indexPath.row;

    cell.timestampLabel.text =  @"02:20 AM";
    cell.CustomDelegate=self;
    cell.AvatarImageView.image=([feed_data.chat_media_type isEqualToString:kTextByme])?[UIImage imageNamed:@"ProfilePic"]:[UIImage imageNamed:@"person"];
  //  cell.AvatarImageView.image=[
    [self configurePhotoForCell:cell user:user] ;
    return cell;

   }



 SPHMediaBubbleCell *cell = (SPHMediaBubbleCell *) [tableView dequeueReusableCellWithIdentifier:R_CellIdentifier];
if (cell == nil)
 {
    cell = [[SPHMediaBubbleCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:R_CellIdentifier];
 }
cell.bubbletype=([feed_data.chat_media_type isEqualToString:kImagebyme])?@"LEFT":@"RIGHT";
cell.textLabel.text = feed_data.chat_message;
cell.messageImageView.tag=indexPath.row;
cell.CustomDelegate=self;
cell.timestampLabel.text = @"02:20 AM";
cell.AvatarImageView.image=([feed_data.chat_media_type isEqualToString:kImagebyme])?[UIImage imageNamed:@"ProfilePic"]:[UIImage imageNamed:@"person"];

return cell;
}

and configure photo method

- (void)configurePhotoForCell:(UITableViewCell *)cell user:(XMPPUserCoreDataStorageObject *)user
 {
// Our xmppRosterStorage will cache photos as they arrive from the xmppvCardAvatarModule.
// We only need to ask the avatar module for a photo, if the roster doesn't have it.

if (user.photo != nil)
{
    cell.imageView.image = user.photo;
}
else
{
    NSData *photoData = [[[self appDelegate] xmppvCardAvatarModule] photoDataForJID:user.jid];

    if (photoData != nil)
        cell.imageView.image = [UIImage imageWithData:photoData];
    else
        cell.imageView.image = [UIImage imageNamed:@"user2"];
  }
 }

EDIT

Both are send by me but it looks in same window, when i click on one time send button it looks in sender message and second time looks in receiver message. and receiver will not receive message.

错误

EDIT

Here is response after i click on send button.

function:-[ChathistryViewController sendMessageNow:] line:414 content:Message sending fron Gmail function:-[ChathistryViewController sendMessageNow:] line:421 content:message1ghfhxfghh 2015-06-12 13:03:22:071 projectname[7556:2f03] SEND: ghfhxfghh 2015-06-12 13:03:22:389 projectname[7556:7347] RECV: ghfhxfghh 2015-06-12 13:03:22:390 CloseChat[7556:2f03] SEND: ghfhxfghh 2015-06-12 13:03:22.393 projectname[7556:49110] Attempting to schedule a local notification {fire date = (null), time zone = (null), repeat interval = 0, repeat count = UILocalNotificationInfiniteRepeatCount, next fire date = Friday, June 12, 2015 at 1:03:22 PM India Standard Time, user info = (null)} with a sound but haven't received permission from the user to play sounds 2015-06-12 13:03:22:697 CloseChat[7556:7347] RECV: 2015-06-12 13:03:23:004 projectname[7556:7347] SEND: 2015-06-12 13:03:23:004 projectname[7556:7347] SEND: http://etherx.jabber.org/streams' version='1.0' to='jwchat.org'> 2015-06-12 13:03:23:619 proje ctname[7556:7347] RECV: 2015-06-12 13:03:23:619 projectname[7556:7347] RECV: 2015-06-12 13:03:23:619 CloseChat[7556:7347] SEND: 2015-06-12 13:03:23:925 projectname[7556:7347] RECV: 2015-06-12 13:03:23:926 projectname[7556:7347] SEND: http://etherx.jabber.org/streams' version='1.0' to='jwchat.org'> 2015-06-12 13:03:25:063 projectname[7556:7627] RECV: 2015-06-12 13:03:25:064 projectname[7556:7347] RECV: PLAINDIGEST-MD5SCRAM-SHA-1 2015-06-12 13:03:25:065 CloseChat[7556:607] SEND: biwsbj1jaGlyYWcscj1EMjUxMEQ2NC05MzZFLTQxMkUtQjY1Ri0zM0VFQjE1ODcxRjc= 2015-06-12 13:03:25:306 projectname[7556:7347] RECV: cj1EMjUxMEQ2NC05MzZFLTQxMkUtQjY1Ri0zM0VFQjE1ODcxRjdXVnB5eEp3b2lCRC9rUThvRkdhbGdRPT0scz1DZVZpSFFXNW9XRDVVNU90WUNMWExnPT0saT00MDk2 2015-06-12 13:03:25:321 projectname[7556:7347] SEND: Yz1iaXdzLHI9RDI1MTBENjQtOTM2RS00MTJFLUI2NUYtMzNFRUIxNTg3MUY3V1ZweXhKd29pQkQva1E4b0ZHYWxnUT09LHA9TWlsaW5TczI4b2VBd1dtQ3pWY21TWXZQWEFnPQ== 2015-06-12 13:03:25:562 projectname[7556:7627] RECV: dj1WeVdSaWRTTHVxYzhkV0E2 aEg3OW9mU0FpYmc9 2015-06-12 13:03:25:562 projectname[7556:7627] SEND: http://etherx.jabber.org/streams' version='1.0' to='jwchat.org'> 2015-06-12 13:03:25:871 projectname[7556:7627] RECV: 2015-06-12 13:03:25:871 projectname[7556:7627] RECV: 2015-06-12 13:03:25:872 projectname[7556:7627] SEND: 2015-06-12 13:03:26:178 projectname[7556:7347] RECV: chirag@jwchat.org/341204969114349440629043 2015-06-12 13:03:26:179 projectname[7556:7347] SEND: 2015-06-12 13:03:26:485 projectname[7556:7347] RECV: 2015-06-12 13:03:26:486 projectname[7556:7627] SEND: 2015-06-12 13:03:26:487 projectname[7556:7347] SEND: 2015-06-12 13:03:26:488 projectname[7556:7627] SEND: 2015-06-12 13:03:26:714 projectname[7556:7347] RECV: 2015-06-12 13:03:26:946 projectname[7556:7347] RECV: 2015-06-12 13:03:26:947 projectname[7556:6e13] SEND: 2015-06-12 13:03:26:948 projectname[7556:6e13] RECV: 2015-06-12 13:03:27:180 projectname[7556:7627] RECV:

You must make sure first that your XMMP client is set up correctly. Then make sure that you are sending the message, and that you have the right sender.

For those who will now say that this is a comment, not an answer, I don't have enough reputation to comment!

The Control is just for UI purpose, I never wrote any code to send or receive a message from the server because I m not sure whether a user will use any third party SDK or XMPP or normal REST API.

So, you make the Server part & UI part separately.

Your question : Both are sent by me but it looks in the same window when I click on one-time send button it looks in sender message and second time looks in receiver message. and receiver will not receive a message.

Ans: Yes, I have done that for Demo purpose, based on the response you will get from server you have to make the changes in code.

How to use: 1. Declare an NsmutableArray & initialize it on viewdidload. 2. When you send an Message, image, create a Bubbledata & add it to the array & then reload the Tableview.

 [self adddMediaBubbledata:kTextByme mediaPath:@"Hi, check this new control!" 
mtime:@"8:30 AM" thumb:@"NA"  downloadstatus:@"" sendingStatus:kSent  msg_ID:@"AB4353GH"];

Use Below types for send and receive:

 kTextByme: if you sending a text
 kImageByme : if you are sending an Image
 kTextByOther : if you receiving an Text
 kImageByOther : if you are receiving an Image

Now update the send Status

    kSent      : you successfully sent an message
    kFailed    : message sendig failed
    kSending : your message is sending to server

So , based on the above information , make the changes and let me know if you require any other help

Please locate below delegate in XMPP Client(XMMPFramework), it will handle the received instant messages to you.

// XMPP Delegate method: xmpp client receives a message

- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message
{

  // some computation stuff

  return ;

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM