Отключение клиента XMPP при отправке большого размера изображения, видео и аудио

Я реализовал xmpp, используя пример robbiehanson xmpp. Я могу общаться, а также отправлять изображения. Изображения, которые я отправляю, преобразуются в nsdata и затем преобразуются в Base64String, а затем отправляют строку с

[self.xmppStream sendElement:message];

Таким образом, если размер изображения небольшой, я могу отправить его мгновенно, но если размер изображений больше, два пользователя xmpp будут отключены и файл не будет передан. То же самое происходит с видео и аудио. Хотя я могу сжимать изображения, используя

 UIImageJPEGRepresentation(image,0.005); 

Но как отправить видео и аудио, как размер, очевидно, будет большим. Я прочитал документы на XEP-0065 и XEP-0096, но не смог реализовать его надлежащим образом. Пожалуйста, дайте мне знать, почему пользователи отключены, почему я не могу передать тяжелые файлы с помощью base64, а также поделиться кодом, который поможет мне передавать видео и аудио.

Было бы очень признательно, что вы поможете.

Хотя XMPP позволяет передавать небольшое количество двоичных данных, рекомендуется обмениваться большими файлами или видео / аудиопотоками «вне диапазона» и использовать протокол XMPP в качестве протокола сигнализации – вам следует просто отправить ссылку http: // или rtp: //, и клиент вашего друга загрузит его или начнет воспроизводить аудио / видео из заданного потока. Вы можете отправить эту ссылку в любой форме, но есть некоторые «сквозные стандартные» расширения XMPP, которые позволяют получить совместимость с существующими клиентами:

  1. XEP-0066: Out Of Band Data – простое расширение, где вы просто прикрепляете URL к стандартному элементу <message /> .
  2. XEP-0095: инициирование потока и XEP-0166: Jingle – это «meta» -спецификации, описывающие, как клиенты «согласовывают» свои поддерживаемые функции, выбирают способ обмена данными, которые они предпочитают ( ibb , oob , bytestreams , jingle rtp , и т. д.), находит открытые порты TCP или посреднические прокси, обход NAT и т. д.

Итак, если вы просто хотите поделиться файлом – поделитесь им через любую существующую службу совместного доступа к файлам и отправьте URL-адрес, как описано в первом XEP. Если вы хотите создать большое обслуживание или приложение VOIP – используйте SI или Jingle. Но никто не мешает вам создать собственное расширение XMPP, которое может быть проще реализовать. Вот пользовательское расширение XMPP, которое было разработано не сообществом XMPP, но принятое XSF в качестве экспериментального, вы также можете проверить его.

Даже я не отправляю изображение прямо на xmpp, потому что это занимает много времени.

В моем проекте я сообщение может быть строкой, и это может быть изображение, и я обнаружил, что есть только один способ отправки сообщения, т. Е.

 [xmppRoom sendMessageWithBody:@"Your msg"]; 

Поэтому для отправки изображения Сначала я конвертирую его в base64, а затем загружаю его на свой сервер и получаю URL для этого изображения с сервера. Как только мы получим URL-адрес, просто передайте этот URL-адрес в методе выше.

Проблема, с которой я столкнулась, заключалась в том, как отделить обычные сообщения и URL (изображения)

Так что для отправки обычного текста я непосредственно отправляю его выше функции, но для отправки URL-адреса я отправляю nsdictionary, то есть я конвертирую nsdictionary в строку и отправляю ее в функцию выше

 NSDictionary *dict = @{@"type":@"image", @"url":@"Url of your image"}; NSString *newMessage = [NSString stringWithFormat:@"%@",dict]; [appDelegate.xmppRoom sendMessageWithBody:newMessage]; 

Для разделения нормального сообщения и изображения в –

 - (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message { messages *msg = [messages new]; NSDictionary *dictOfMedia = [NSPropertyListSerialization propertyListWithData:[[[message elementForName:@"body"] stringValue] dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions format:NULL error:NULL]; if ([dictOfMedia objectForKey:@"type"]) { msg.mediaType = [dictOfMedia objectForKey:@"type"]; msg.url = [dictOfMedia objectForKey:@"url"]; } else { msg.msg = [[message elementForName:@"body"] stringValue]; } } 

сообщения – это мой модельный класс, который вы можете использовать просто для использования с nsstring.

После этого просто используйте любой проект с открытым исходным кодом для загрузки изображения или выполнения ленивой загрузки самостоятельно.

Надеюсь, что это поможет вам 🙂

  • Передача файлов с использованием XMPPFrameWork в IOS
  • Как отправлять и получать сообщения с использованием XMPPFramework
  • iOS XMPP не может отправлять сообщения
  • - (void) chatDidReceiveMessage: (QBChatMessage *) сообщение не работает
  • iOS - Отправить push-уведомление в приложении XMPP chat, когда buddy отключен
  • Список участников чата
  • Отсутствует выход из протокола XMPPFramework, установленный через cocoapods
  • iOS - XMPPFramework - создание группового чата - Проблема
  • Неопределенные символы для архитектуры armv7 при добавлении CocoaAsyncSocket
  • Создайте приложение чата в ios с помощью XMPP
  • Максимальное ограничение пакетных данных XMPP с использованием сервера открытого огня в iOS
  • Давайте будем гением компьютера.