如何在聊天usig xmpp框架中发送图像

您好我正在做一个基于聊天的应用程序,我可以发送聊天消息,但如果我添加图像附件的聊天消息,它不工作。我的消息代码

if (![[messageStr stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length] && imgURL==nil) { return; } NSString *MyString; NSDate *now = [NSDate date]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"HH:mm,yyyy/MM/dd"]; MyString = [dateFormatter stringFromDate:now]; NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults]; NSString *myJID=[defaults valueForKey:@"userNameJID"]; if ([imgURL length]==0) { chatMessageToSendAndPutInDB=[messageStr mutableCopy]; chatMessageToSendAndPutInDB=[[chatMessageToSendAndPutInDB stringByReplacingOccurrencesOfString:@"'" withString:@""] mutableCopy]; }else { receivedDataString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; chatMessageToSendAndPutInDB=[receivedDataString mutableCopy]; chatMessageToSendAndPutInDB=[[chatMessageToSendAndPutInDB stringByReplacingOccurrencesOfString:@"'" withString:@""] mutableCopy]; } [DBObject open]; [DBObject insertInTable:@"chatTable" withUserId:myJID withFriendID:[[ASNGlobalClass shareManager] chatToUserJID] withMessage:chatMessageToSendAndPutInDB withTimeDate:MyString withLeftOrRight:0]; NSXMLElement *body = [NSXMLElement elementWithName:@"body"]; [DBObject closeDatabase]; [self fetchDataFromDatabase]; if([messageStr length] > 0 ) { [body setStringValue:messageStr]; }else if ([imgURL length]>0){ [body setStringValue:receivedDataString]; } NSXMLElement *message = [NSXMLElement elementWithName:@"message"]; [message addAttributeWithName:@"type" stringValue:@"chat"]; [message addAttributeWithName:@"to" stringValue:chatWithUser]; NSXMLElement *chatStatus=[NSXMLElement elementWithName:@"composing" xmlns:UIApplicationStateActive]; [message addChild:chatStatus]; [message addChild:body]; [[[self appDelegate] xmppStream] sendElement:message]; 

我正在使用xmpp框架和openfire服务器。 我不知道如何发送images.please帮助我,我使用sqlite的存储和提取谢谢提前。

附件元素用于在XMPP中发送图像。 你可以使用以下function:

 -(void)sendMessage:(NSString *)strText img:(UIImage *)SendImage{ NSXMLElement *body = [NSXMLElement elementWithName:@"body"]; [body setStringValue:strText]; NSXMLElement *message = [NSXMLElement elementWithName:@"message"]; [message addAttributeWithName:@"type" stringValue:@"chat"]; [message addAttributeWithName:@"to" stringValue:userId]; [message addChild:body]; if (SendImage) { NSData *dataF = UIImagePNGRepresentation(SendImage); NSString *imgStr=[dataF base64EncodedStringWithOptions:0]; NSXMLElement *ImgAttachement = [NSXMLElement elementWithName:@"attachement"]; [ImgAttachement setStringValue:imgStr]; [message addChild:ImgAttachement]; } [self.xmppStream sendElement:message]; [self.view endEditing:YES];} 

在Swift3.0中

  let data = UIImageJPEGRepresentation(image, 0.1) let imageStr = data?.base64EncodedString() let body = DDXMLElement.element(withName: "body") as! DDXMLElement let messageID = XMPPManager.sharedInstance.xmppStream?.generateUUID() let imageAttachement = DDXMLElement.element(withName: "attachment", stringValue: imageStr!) as! DDXMLElement let message = DDXMLElement.element(withName: "message") as! DDXMLElement message.addAttribute(withName: "type", stringValue: "chat") message.addAttribute(withName: "id", stringValue: messageID!) message.addAttribute(withName: "to", stringValue: buddyJID.full()) message.addChild(body) message.addChild(imageAttachement) XMPPManager.sharedInstance.xmppStream?.send(message) 

但是,如果xml大小很大,服务器将返回大小错误。 所以首先上传图片到文件服务器,然后通过xmpp协议发送url

为了发送一个小图像给朋友,你可以使用下面的function,但是为了发送大的图像/video/audio文件,build议通过stream“带外”分享大文件,并使用XMPP作为信号协议 – 你应该发送http://或rtp://链接,然后您的好友的客户端将下载它,或者从给定的stream开始播放audio/video。

您可以使用XEP-0066 :带外数据 – 简单扩展,您只需将URL附加到标准元素即可。

发送图像

 //Send Image to friend with message. -(void)sendMessageWithImage:(NSString *)strText img:(UIImage *)SendImage { //Message string with image. NSString *messageStr = strText; NSXMLElement *body = [NSXMLElement elementWithName:@"body"]; [body setStringValue:messageStr]; NSXMLElement *message = [NSXMLElement elementWithName:@"message"]; [message addAttributeWithName:@"type"stringValue:@"chat"]; //set "to" string value to friend jid [message addAttributeWithName:@"to"stringValue:@"rohit@192.168.0.1"]; [message addChild:body]; NSData *dataPic = UIImagePNGRepresentation(SendImage); NSXMLElement *photo = [NSXMLElement elementWithName:@"PHOTO"]; NSXMLElement *binval = [NSXMLElement elementWithName:@"BINVAL"]; [photo addChild:binval]; //convert image to base64String NSString *base64String = [dataPic base64EncodedStringWithOptions:0]; [binval setStringValue:base64String]; [message addChild:photo]; [[[self appDelegate] xmppStream] sendElement:message]; } 

在Receiver结束

XMPPStream委托Methode。

 - (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message { [self MessageReceive:message]; } #pragma mark - Receive New Message Methode. -(void)MessageReceive:(XMPPMessage *)message { //Get friend XMPPUserCoreDataStorageObject object XMPPUserCoreDataStorageObject *user = [xmppRosterStorage userForJID:[message from] xmppStream:xmppStream managedObjectContext:[self managedObjectContext_roster]]; //Get Message if friend send with image. NSString *body = [[message elementForName:@"body"] stringValue]; //Get Display name of friend. NSString *displayName = [user jidStr]; //Check friend send image or only text message if ([message elementForName:@"PHOTO"]) { //Get Image from base64String NSString *photoHash = [[message elementForName:@"PHOTO"] stringValue]; NSData* data = [photoHash dataUsingEncoding:NSUTF8StringEncoding]; NSData *nsdataDecoded = [data initWithBase64EncodedData:data options:0]; //Here you can get image. UIImage *image = [UIImage imageWithData:nsdataDecoded]; } else { //Here you can get friend text message NSString *message = body; } }