2014-09-22 18 views
12

Dal spec -persistente XMPP MUC (XEP-45), come WhatsApp chat di gruppo

7,14 Uscita da una camera

Al fine di uscire da una chat room multi-utente, un occupante invia una presenza strofa di tipo "non disponibile" al < camera di servizio @/nick > è attualmente in uso nella stanza.

Esempio 80. uscite dell'occupante una camera

<presence 
    from='[email protected]/pda' 
    to='[email protected]/thirdwitch' 
    type='unavailable'/> 

Ciò implica che, non appena l'utente si disconnette dal server XMPP, viene rimosso dal gruppo sul lato server. Il problema è semplice: non voglio questo comportamento; Voglio un comportamento che è simile a quello che fa WhatsApp, vale a dire anche se l'utente è in linea, è ancora parte della stanza MUC (che è configurato per essere persistente sul lato server) e riceverà i messaggi provenienti da altri occupanti.

Data la specifica e la documentazione per XEP-0045 e XMPPFramework per iOS, non ho idea di come eseguire questa operazione o se è possibile farlo nel tradizionale server ejabberd.

+0

ora c'è anche un XEP più recente (0369), che soddisfa il vostro requisito: http://xmpp.org/extensions/xep -0369.html –

risposta

5

Si potrebbe emulare qualcosa di abbastanza come questo in base alla cronologia sul lato server del MUC (Message Archive Management, XEP-0313), in modo che quando un client accede a sono in grado di richiedere la storia della MUC mentre non ci siamo dentro

Se anche voi volete essere in grado di mostrare i non in linea pseudo-occupanti di una stanza, il modo più semplice per farlo è probabilmente quello di mappare un nodo PubSub per camera per memorizzare l'elenco di questi pseudo-occupanti che i clienti potevano leggere per integrare la solita lista di occupazione. Ci sono probabilmente altre soluzioni qui, ma quelle che vengono subito in mente per me riguardano la modifica del comportamento del server in modi non standard, come ad esempio consentire agli occupanti normali di interrogare un elenco di appartenenze, che normalmente solo gli amministratori possono fare .

+0

Grazie Kev. Ci sono ulteriori problemi con l'implementazione di soluzioni personalizzate. L'archiviazione dei messaggi è buona ma per quanto riguarda le notifiche? Gli utenti offline non riceveranno mai notifiche di alcun messaggio dal server a meno che non aprano effettivamente l'app. Inoltre, se penso di più su questo, posso semplicemente usare PubSub come modello invece del tradizionale MUC? – p0lAris

+0

È possibile ricostruire MUC sopra pubsub, sì, anche se è un mucchio di lavoro. È anche possibile mantenere viva la sessione e ricevere notifiche dal server. Sfortunatamente, nulla è ancora standardizzato, ma c'è stata una grande discussione su un meccanismo per fare esattamente questo al summit XMPP di febbraio di quest'anno, e una specifica è in lavorazione. – Kev

+0

Ok. Quindi è fuori dalla finestra dato che non abbiamo troppo tempo a disposizione. Ma andando con il suggerimento attuale - come si fa a mantenere la sessione xmpp viva indefinitamente in iOS? So che le persone hanno risposto in modo simile a questo, ma non sono sicuro di aver capito bene. – p0lAris

5

Il modello Whatsapp è molto più semplice di quanto si immagina - hanno appena mantengono sessione utente on-line, anche se l'utente si disconnette, e ri-invia messaggi quando "riattaccare" sessione. XEP-0198 introduce un concetto simile alle sessioni XMPP tradizionali. Hai solo bisogno di configurare periodo di inattività più lungo (in genere XEP-0198 assumere 300 secondi, ma messaggeri WhatsApp come tiene sessione 24+ ore)

+0

Grazie vitalyster. "Il modello di Whatsapp è molto più semplice di quello che immagini: mantengono la sessione utente online anche se l'utente si disconnette e re-invia i messaggi quando riattacca la sessione." È sul lato server? In tal caso, potrebbero sovrascrivere la presenza "non disponibile" con la presenza "disponibile". Per quanto riguarda XEP-0198, non sono sicuro di come possa essere implementato nel contesto di un'app iOS. – p0lAris

+0

, ad esempio, se si termina in pratica l'app iOS, lo stream verrebbe disconnesso. – p0lAris

+0

Se si termina l'app iOS, lo streaming verrà disconnesso, ma la sessione rimarrà attiva, ignorando semplicemente i disconnessioni TCP, non le presenze. Perché sei ancora in grado di andare offline dal menu di stato e lasciare anche groupchat. E con XEP-0198 hai ottenuto lo stesso. – vitalyster

8

XEP-45 è stato progettato più di 10 anni fa. A quei tempi, i progettisti avevano in mente qualcosa come i canali IRC. Tutto di XEP-45 è progettato sulla base dell'assunto che un utente entra e lascia una stanza quando inizia/termina il suo client.

WhatsApp chat di gruppo sono diversi: un utente si unisce ad una chat di gruppo è in grado di visualizzare la cronologia (completa), di tale chat. Anche se il client dell'utente è offline/non disponibile, è ancora considerato parte della chat di gruppo.

comunità Il XMPP attualmente lavora su un nuovo XEP che fornisce tale funzionalità. Si chiama XEP-0369: Mediated Information eXchange. È il successore spirituale di XEP-0045, fornendo le funzionalità che ci si aspetterebbe dai moderni groupchats.

1

Sì, è possibile rendere il vostro gruppo persistente impostando le sue configurazioni in questo modo:

NSString *var = [field attributeStringValueForName:@"var"]; 
if ([var isEqualToString:@"muc#roomconfig_persistentroom"]) 
{ 
    [field removeChildAtIndex:0]; 
    [field addChild:[NSXMLElement elementWithName:@"value" stringValue:@"1"]]; 
} 
+1

puoi condividere la demo? –