【问题标题】:How to send image in chat usig xmpp framework如何在聊天使用 xmpp 框架中发送图像
【发布时间】:2016-01-01 23:06:34
【问题描述】:

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

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 进行存储和获取 提前致谢。

【问题讨论】:

标签: ios objective-c iphone xmpp chat


【解决方案1】:

attachment 元素用于在 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];}

【讨论】:

  • 嗨 Ankit,我尝试了您的代码,但图像未发送到聊天室,我从 pikerview 中选择图像,它正在分配给 SendImage 但未附加到消息,我不知道我错过了哪里。
  • 它是否抛出某种错误。如果没有,请尝试使用项目中存在的一些虚拟图像,然后尝试。并在接收端检查消息正文 - (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message
  • 感谢@Ankit Saini,但它也没有显示任何错误和图像,我实施了一些代码检查一次,如果你知道任何事情请告诉我,我正在使用 sqlite 存储数据跨度>
  • @Ankit Saini:我试过你的代码……它适用于小尺寸图像……但是当我尝试发送 1MB 大小的图像时它不起作用。有什么建议吗?
  • @bittu,UIImageJPEGRepresentation(sendImage,1.0) 应该像 UIImageJPEGRepresentation(sendImage,0.5),1.0 表示你想要原始大小。如果有帮助,请投票。
【解决方案2】:

在 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

【讨论】:

    【解决方案3】:

    发送小图给朋友可以使用下面的函数,但是发送大图/视频/音频文件,建议通过“带外”流共享大文件,并使用XMPP作为信令协议-您只需发送 http:// 或 rtp:// 链接,您的好友的客户端就会下载它,或者从给定的流中开始播放音频/视频。

    您可以使用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];
    
    }
    

    在接收端

    XMPPStream 委托方法。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-13
      • 1970-01-01
      相关资源
      最近更新 更多