ios - una - ¿Cómo manejar las notificaciones push si la aplicación ya se está ejecutando?
recuperar notificaciones iphone (4)
Iterando los 3 niveles de carga útil.
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
for (id key in userInfo) {
NSLog(@"key: %@, value: %@", key, [userInfo objectForKey:key]);
NSString *message = nil;
NSDictionary *aps = [NSDictionary dictionaryWithDictionary:(NSDictionary *) [userInfo objectForKey:key] ];
for (id key1 in aps){
NSLog(@"key1: %@", key1);
id alert = [aps objectForKey:key1];
if ([alert isKindOfClass:[NSDictionary class]]) {
message = [alert objectForKey:@"body"];
NSLog(@"body: %@, value: %@", key1, message);
message = [alert objectForKey:@"loc-args"];
NSLog(@"loc-args: %@, value: %@", key1, message);
NSArray *args = (NSArray *) [alert objectForKey:@"loc-args"] ;
for (id key2 in args){
NSLog(@"key2: %@, value: ", key2);
}
message = [alert objectForKey:@"action-loc-key"];
NSLog(@"action-loc-key: %@, value: %@", key1, message);
}
else if ([alert isKindOfClass:[NSArray class]]) {
for (id key2 in key1){
NSLog(@"key2: %@, value: %@", key2, [key1 objectForKey:key2]);
}
}
else if([key1 isKindOfClass:[NSString class]]) {
message = [aps objectForKey:key1];
NSLog(@"key1: %@, value: %@", key1, message);
}
}
}
}
El resultado es:
2012-01-27 20:38:09.599 SPush[4181:707] key: aps, value: {
alert = {
"action-loc-key" = Open;
body = test;
"loc-args" = (
1000,
2000
);
};
badge = 0;
"content-available" = 10;
sound = default;
}
2012-01-27 20:38:13.133 SPush[4181:707] key1: alert
2012-01-27 20:38:13.134 SPush[4181:707] body: alert, value: test
2012-01-27 20:38:13.137 SPush[4181:707] loc-args: alert, value: (
1000,
2000
)
2012-01-27 20:38:13.138 SPush[4181:707] key2: 1000, value:
2012-01-27 20:38:13.139 SPush[4181:707] key2: 2000, value:
2012-01-27 20:38:13.140 SPush[4181:707] action-loc-key: alert, value: Open
2012-01-27 20:38:13.141 SPush[4181:707] key1: sound
2012-01-27 20:38:13.143 SPush[4181:707] key1: sound, value: default
2012-01-27 20:38:13.144 SPush[4181:707] key1: badge
2012-01-27 20:38:13.145 SPush[4181:707] key1: badge, value: 0
2012-01-27 20:38:13.146 SPush[4181:707] key1: content-available
2012-01-27 20:38:13.147 SPush[4181:707] key1: content-available, value: 10
¿Cómo manejamos las notificaciones push si la aplicación ya se está ejecutando? Quiero mostrar una alerta si la aplicación se está ejecutando (en lugar de una alerta de notificación de inserción). Solo si la aplicación no se está ejecutando, muestre una alerta de notificación de inserción.
Además, si envío una carga útil a APN, ¿cómo puedo crear una alerta con un botón de cancelación?
Puede comprobar el estado de la aplicación UIA. Solo haz un cheque como este
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
UIApplicationState state = [application applicationState];
if (state == UIApplicationStateActive)
{
UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"xxx" message:yourMessage delegate:self cancelButtonTitle:@"Done" otherButtonTitles: @"Anzeigen", nil] autorelease];
[alert setTag: 2];
[alert show];
}
else {
// Push Notification received in the background
}
}
la clave de "alerta" no estará allí directamente debajo del diccionario de información de usuario, necesita obtener otro diccionario con el nombre "aps" y luego obtener la "alerta" o "cuerpo" del diccionario de "aps".
Puede implementar la application:didReceiveRemoteNotification:
Aquí hay un código de ejemplo posible:
- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
{
NSString *message = nil;
id alert = [userInfo objectForKey:@"alert"];
if ([alert isKindOfClass:[NSString class]]) {
message = alert;
} else if ([alert isKindOfClass:[NSDictionary class]]) {
message = [alert objectForKey:@"body"];
}
if (alert) {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Title"
message:@"AThe message." delegate:self
cancelButtonTitle:@"button 1"
otherButtonTitles:@"button", nil];
[alertView show];
[alertView release];
}