ios - instalar - xmpp client
enviar notificaciones push a ios para chatear a usuarios sin conexión, openfire xmpp (2)
Tengo una solucion para ti.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.ary_UserStatus = [NSMutableArray array];
NSMutableArray *ary_TempFromUserDefaults = [NSMutableArray array];
ary_TempFromUserDefaults = [[NSUserDefaults standardUserDefaults] valueForKey:@"KejdoUserStatus"];
if ([ary_TempFromUserDefaults count]>0)
{
self.ary_UserStatus = [[NSUserDefaults standardUserDefaults] valueForKey:@"KejdoUserStatus"];
}
self.df_UserStatus = [[NSDateFormatter alloc] init];
[self.df_UserStatus setDateFormat: @"hh:mm a MM/dd/yyyy"];
}
- (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence
{
DDLogVerbose(@"%@: %@ - %@", THIS_FILE, THIS_METHOD, [presence fromStr]);
NSString *str_UserName = [[presence from] user];
NSString *str_LastSeenDate = [self.df_UserStatus stringFromDate:[NSDate date]];
NSMutableDictionary *mdic_UserPresence = [[NSMutableDictionary alloc] init];
[mdic_UserPresence setValue:str_UserName forKey:@"Name"];
[mdic_UserPresence setValue:str_LastSeenDate forKey:@"Date"];
[mdic_UserPresence setValue:[presence type] forKey:@"Type"];
if ([self.ary_UserStatus count]>0)
{
int index;
BOOL IS_exist=FALSE;
for (int i=0; i<[self.ary_UserStatus count]; i++)
{
NSString *str_UserFromArray = [[self.ary_UserStatus objectAtIndex:i] valueForKey:@"Name"];
if ([str_UserName isEqualToString:str_UserFromArray])
{
IS_exist = TRUE;
index = i;
[[NSUserDefaults standardUserDefaults] setObject:str_UserName forKey:@"Status"];
}
else
{
}
}
if (IS_exist) {
[self.ary_UserStatus replaceObjectAtIndex:index withObject:mdic_UserPresence];
}
else
{
[self.ary_UserStatus addObject:mdic_UserPresence];
}
}
else
{
[self.ary_UserStatus addObject:mdic_UserPresence];
}
[[NSUserDefaults standardUserDefaults] setObject:self.ary_UserStatus forKey:@"KejdoUserStatus"];
[[NSUserDefaults standardUserDefaults] synchronize];
[[NSNotificationCenter defaultCenter] postNotificationName:@"UserStatusChangeNotification" object:self];
}
Y a donde sea que estés enviando un mensaje a otro usuario en el chat. Hacer esto
if(appDelegate.ary_UserStatus.count>0)
{
for (int i=0; i<[appDelegate.ary_UserStatus count]; i++)
{
if ([jid.user isEqualToString:[NSString stringWithFormat:@"%@",[[appDelegate.ary_UserStatus objectAtIndex:i] valueForKey:@"Name"]]])
{
if ([[[appDelegate.ary_UserStatus objectAtIndex:i] valueForKey:@"Type"] isEqualToString:@"available"])
{
// Do something like table reload.
break;
}
else
[self sendPushNotification];
}
}
}
else
[self sendPushNotification];
Tengo una aplicación de chat ios que usa Openfire, lo que debo hacer es enviar una notificación de inserción cuando el mensaje (1) no se puede entregar por cualquier motivo, (2) la aplicación está en estado suspendido, es decir, no se puede generar una notificación. por sí mismo.
He leído la mayoría de las preguntas / sugerencias relacionadas con esto en stackoverflow y en otros lugares y he concluido algunas soluciones a mi problema. No soy desarrollador de iOS ni sabía nada acerca de openfire o xmpp antes de un par de días, así que me temo que mi comprensión de las cosas puede no estar completa y mis soluciones pueden ser erróneas.
Por favor confirme mi comprensión y sugiera si me falta algo o si hay un mejor enfoque. Por favor, sugiera también qué tan complejo será implementar una solución particular que se detalla a continuación.
El desafío aquí es identificar cuándo se requiere el impulso y dónde debe iniciarse el proceso, por lo que
1) una forma es usar la implementación xep-0184 de xmpp para verificar si el mensaje se entrega. para hacer esto deberíamos tener alguna marca entregada con el mensaje en la base de datos de ios, que se actualiza cuando la respuesta entregada se recibe de otro lado. Por lo tanto, necesitamos verificar este indicador después de un rato y si el estado entregado es falso, inicie el proceso de inserción con el mensaje. Parece ser una solución complicada (esperar respuesta). Marca de verificación con un poco de tiempo de espera ... no muy impresionante)
2) Un enfoque más directo es hacer algo en Openfire, cuando Openfire no puede enviar un mensaje, lo almacena en una tabla fuera de línea, podemos hacer una intercepción en esa parte e iniciar el proceso de inserción con el mensaje. Este parece ser el enfoque correcto, pero realmente tengo miedo de conseguir tanto dentro de fuego abierto y cambiar algo (también podría ser fácil, ¿alguien que ha trabajado un poco con fuego abierto puede decirlo?)
3) Este es mi último recurso y no es una solución ... pero si no puedo hacerlo correctamente dentro del plazo previsto (que es una semana a partir de ahora), planeamos enviar una notificación de inserción para todos los mensajes. oppenfire se ocupará del chat normal, mientras que nuestro servidor enviará un envío para cada mensaje, pero cuando la aplicación está en primer plano, hacemos algo para manejar los mensajes adicionales que no es necesario mostrar, de lo contrario, se recibe un envío cada vez que hay un mensaje. mensaje. ¿Qué piensan ustedes de esta manera temporal (por supuesto, tendremos que cambiar esto lo antes posible), es esto posible (o me estoy perdiendo algo aquí también)?
PS ¿Alguien puede decir cómo Whatsapp y otras aplicaciones populares manejan esto?
Muchas gracias por su ayuda.
XMPP requiere una conexión de socket persistente o una conexión BOSH "persistente" durante toda la sesión de XMPP. Creo que su desafío es que iOS no le permite ejecutar su aplicación y socket en segundo plano. Cada vez que su aplicación iOS entra en segundo plano, iOS mata su conexión de socket y su servidor Openfire mata su sesión XMPP. Esto significa que el usuario se desconecta . Esta es también la razón por la que los mensajes entrantes para este usuario van al almacenamiento fuera de línea.
Lo siento por esta respuesta, pero las 3 soluciones que sugirió son terribles hacks ;-). Si desea encontrar una buena solución, debe profundizar mucho en XMPP y iOS. 1 semana es un período de tiempo muy corto para esto.
¿Alguien puede decir cómo Whatsapp y otras aplicaciones populares manejan esto?
Mantienen viva la sesión XMPP. Esto funciona solo con servidores XMPP altamente modificados, algunos "Proxy de Cliente XMPP" entre los cuales mantiene su sesión en ejecución mientras su aplicación está en segundo plano, o una combinación o ambas.