XMPP Отправка / получение файла в iphone SDK ...? - PullRequest
3 голосов
/ 13 июня 2011

Как отправить / получить файл в iphone SDK с помощью фреймворка xmpp? В настоящее время я использую XEP-0065 классы и использую следующий код:

ObjTURNSocket = [[TURNSocket alloc] initWithStream:((TestAppDelegate*)[[UIApplication sharedApplication] delegate]).xmppStream 
                                                 toJID:chatuser.jid];
    [ObjTURNSocket start:self];

И я получаю следующий ответ от сервера:

<iq type="error" id="AB2ED567-B97F-4DFE-B789-7731A617C239" to="kapil@testweb/6df6dc96" from="jabber.org">
   <query xmlns="http://jabber.org/protocol/disco#items"/>
   <error code="404" type="cancel">
      <remote-server-not-found xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
   </error>
 </iq>`

Любая помощь или предложение будут оценены по достоинству.

Ответы [ 3 ]

4 голосов
/ 14 июня 2011

Сначала вызовите setProxyCandidates с массивом возможных серверов, которые вы могли бы использовать для прокси. По умолчанию используется «jabber.org», а ваш сервер не объединен с jabber.org, поэтому вы получаете сообщение об ошибке диско.

Далее, в вашем делегате, реализуйте следующие методы:

- (void)turnSocket:(TURNSocket *)sender didSucceed:(GCDAsyncSocket *)socket;
- (void)turnSocketDidFail:(TURNSocket *)sender;

Затем, в вашей реализации didSucceed, отправьте данные в переданный сокет, используя:

- (void)writeData:(NSData *)data 
      withTimeout:(NSTimeInterval)timeout 
              tag:(long)tag;

Наконец, закройте розетку:

- (void)disconnectAfterWriting;

Я понял это, посмотрев источник TURNSocket.m , отыскивая жестко закодированный "jabber.org", затем поискав [delegate, чтобы найти места, которые вызывал делегат. Это вернуло меня к TURNSocket.h , в котором был задокументирован протокол для реализации делегатом.

1 голос
/ 15 ноября 2011

В итоге мне пришлось настроить класс TURNSocket, чтобы он отвечал моим конкретным потребностям, чтобы иметь возможность передавать файл с моего устройства iOS на другое устройство. Если доступен прокси-сервер, то класс TURNSocket может работать для своих нужд. Но если это прямое соединение, при котором прокси-сервер может быть недоступен, необходимо выполнить дополнительную работу, чтобы настроить ваше устройство для подключения к другому устройству и прямой передачи файла.

Мне удалось получить файл с использованием TURNSocket в его текущем виде только с одной незначительной модификацией. Поскольку код в настоящее время стоит, идентификатору и sid присваивается одно и то же значение, что не может гарантировать, что полученный раздел будет иметь одинаковое значение уникального идентификатора для идентификатора и sid.

0 голосов
/ 20 сентября 2014

Вы должны использовать xep-96, чтобы иметь возможность обмениваться и получать файлы. после этого просто запустите xmppSifiletranfer с соответствующими данными. как

-(void)sendToOtherDevice:(NSData *)fileData receiverJid:(XmPPJId *)senderFullID file:(NSString *)fileName{

            myFileTransferID=[xmppStream generateUUID];
            XMPPJID *jid =senderFullID;
            sifiletransfer=[[XMPPSIFileTransfer alloc]init];
            [sifiletransfer initiateFileTransferTo:jid withData:fileData file:fileName passedsid:myFileTransferID];

            if ([jid.domain isEqualToString:[xmppStream myJID].domain]) {
                [TURNSocket setProxyCandidates:[NSArray arrayWithObjects:jid.domain, nil]];
            } else {
                [TURNSocket setProxyCandidates:[NSArray arrayWithObjects:jid.domain,[xmppStream myJID].domain, nil]];
            }
             TURNSocket *socket = [[TURNSocket alloc] initWithStream:xmppStream toJID:jid sid:myFileTransferID];
           // [socket setDataToSend:fileData];

            [socket startWithDelegate:self delegateQueue:dispatch_get_main_queue()];
    }
    # delegater of turnsocket
    - (void)turnSocket:(TURNSocket *)sender didSucceed:(GCDAsyncSocket *)socket
    {
        NSLog(@"Socket Suceeed Port For File Transfer: %d",socket.localPort);
        DDLogInfo(@"TURN Connection succeeded!");
        DDLogInfo(@"You now have a socket that you can use to send/receive data to/from the other person.");
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Hurray!!"
         message:@"Conection Established"
         delegate:nil
         cancelButtonTitle:@"Ok"
         otherButtonTitles:nil];
         [alertView show];
    }

if you guys have any other issue regarding file transfer comment below.I will surely help you.
...