2011-07-08 1 views
1

J'ai une application d'entreprise que je veux continuer à utiliser, afin qu'elle puisse appeler un service web et informer l'utilisateur quand il y a quelque chose à faire. Donc, il fonctionne maintenant en arrière-plan, il fait les appels, obtient des résultats, mais informer l'utilisateur est mon problème.Recevoir des notifications iPhone pour appeler mon délégué lorsque l'application s'exécute en arrière-plan

Lorsque je déclenche un UILocalNotification l'alerte n'appelle pas mon UIAlertDelegate, et je ne vois pas comment définir cette alerte pour le faire.

Voici mon code pour la façon dont je fais la notification, et cela provoque effectivement une alerte, mais j'en ai besoin pour faire apparaître un View afin qu'ils puissent voir la table, mais le View il ouvre n'est pas un des deux mon application utilise.

 UILocalNotification *localNotif = [[UILocalNotification alloc] init]; 
     if (localNotif) { 
      localNotif.alertBody = [NSString stringWithFormat:NSLocalizedString(@"%@ has a message for you.", nil), @"FYR"]; 
      localNotif.alertAction = NSLocalizedString(@"Read Msg", nil); 
      localNotif.soundName = nil;    
      localNotif.applicationIconBadgeNumber = -1; 
      NSDictionary *infoDict = [NSDictionary dictionaryWithObjectsAndKeys:@"Your Background Task works", ItemListKey, @"Message from FYR", MessageTitleKey, nil]; 
      localNotif.userInfo = infoDict; 
      [[UIApplication sharedApplication] presentLocalNotificationNow:localNotif]; 
      [localNotif release]; 
     } 

Aussi, j'ai donc essayé d'avoir une alerte arriver que je peux mettre le délégué, donc dans mon contrôleur, où j'appelle le code ci-dessus j'appelle également ceci:

 [[NSNotificationCenter defaultCenter] 
     postNotificationName:@"ShowAlert" 
     object:nil 
     userInfo:mydata]; 

Cette la notification est alors ramassée et finalement cette fonction est appelée, et cela fonctionne, mais l'alerte n'est pas visible pour l'utilisateur, j'attends parce que c'est en arrière-plan.

- (void) _showAlert:(NSString*)pushmessage withTitle:(NSString*)title { 
    NSLog(@"%@", @"Attemping to show alert"); 
    UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:title 
                 message:pushmessage 
                 delegate:self 
               cancelButtonTitle:@"No" 
               otherButtonTitles:@"Yes",nil]; 
    [alertView show]; 
    if (alertView) { 
     [alertView release]; 
    } 
} 

Dans le délégué principal, j'ai cette définition et les fonctions appropriées:

@interface FYRViewAppDelegate : NSObject <UIApplicationDelegate, UIAlertViewDelegate> {

ma pensée est que si je peux obtenir l'alerte qui apparaît pour appeler ce délégué puis peut exécuter ce code:

- (void)alertView:(UIAlertView *)alertview clickedButtonAtIndex:(NSInteger)buttonIndex { 
    alertview--; 
    if (buttonIndex == 0) { 
    } else { 
     [self.window addSubview:[tableController view]]; 
    } 
} 

Alors, est-il possible d'obtenir le UILocalNotification d'utiliser mon délégué pour l'alerte?

Ou est-il possible d'afficher une alerte lorsque l'application est en arrière-plan?

Ou, ai-je besoin d'écrire deux applications, afin qu'ils communiquent avec des notifications à distance, donc quand l'application est en arrière-plan on s'exécute puis démarre l'application principale avec une notification à distance. Je n'aime pas cette approche car elle semble très salissante, mais fonctionnerait probablement.

Depuis que le programme ne cesse de courir

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

est seulement appelé au démarrage, la notification locale, il appelle jamais et cela aussi est jamais appelé:

- (void) application:(UIApplication*)application didReceiveLocalNotification:(UILocalNotification *)localNotification {.

Répondre

0

Je suppose que vous ne publiez pas de notifications lorsque l'application est active. Ne pourriez-vous simplement définir un indicateur lorsque vous postez une notification locale, puis vérifiez le drapeau lorsque l'application devient actif:

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    if (localNotificationPosted) { 
     // Do whatever you need to do. 
    } 
} 

Ce sera probablement le comportement correct, étant donné que l'application devient actif à moins que l'utilisateur rejette la notification.Même si l'utilisateur rejette la notification, afficher de nouveaux messages la prochaine fois que l'application est ouverte n'est probablement pas une mauvaise chose.

+0

Lorsque l'application est au premier plan, je mets à jour la table. Idéalement, je veux qu'ils ne pensent pas à l'application à moins que quelque chose ne leur tombe dessus, alors cela pourrait prendre des semaines (pour certaines personnes) avant que quelque chose ait besoin de leur attention, et pour d'autres, quelques minutes. Demander à l'utilisateur d'ouvrir l'application pour voir ce dont son attention a besoin détourne la commodité du programme, mais votre solution pourrait être la meilleure approche sur l'iPhone. –

+0

Un autre problème est que l'application ne se met pas vraiment en veille, elle reste active, donc je ne sais pas si elle appellera jamais "applicationDidBecomeActive", et je ne suis pas sûr de savoir comment contourner cela. L'autre solution consiste à simplement se mettre en veille lorsqu'il n'est pas actif, puis, quand ils l'ouvrent, appelez le service web et mettez à jour à ce moment-là, mais, encore une fois, cela semble juste un mauvais design. –

Questions connexes