如何在聊天中使用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服务器。我不知道怎么发送图片。请帮助我,我使用sqlite存储和抓取

附件元素用于在XMPP中发送图像。您可以使用以下函数:

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

对于发送小图像给朋友你可以使用下面的功能,但是对于发送大图像/视频/音频文件,建议通过"带外"流共享大文件,并使用XMPP作为信令协议-你应该只发送http://或rtp://link,你的朋友的客户端将下载它,或者开始播放给定流的音频/视频。

您可以使用XEP-0066: Out Of Band Data -简单扩展,您只需将URL附加到标准元素。

<<p> 发送图像/strong>
//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];
}

接收端

XMPPStream Delegate method .

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

最新更新