当应用程序在后台运行时获取 iPhone 通知以呼叫我的委托

Posted

技术标签:

【中文标题】当应用程序在后台运行时获取 iPhone 通知以呼叫我的委托【英文标题】:Getting iPhone notifications to call my delegate when the application is running in the background 【发布时间】:2011-07-08 14:03:02 【问题描述】:

我有一个想要继续运行的企业应用程序,因此它可以调用 Web 服务并在用户需要执行某些操作时通知用户。

所以,它现在在后台运行,它发出调用,得到结果,但通知用户是我的问题。

当我触发 UILocalNotification 时,警报不会调用我的 UIAlertDelegate,而且我不知道如何设置该警报来执行此操作。

这是我如何执行通知的代码,这实际上会引发警报,但我需要它然后显示View,以便他们可以看到表格,但它打开的View 是不是我的应用程序使用的两个之一。

        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];
        

另外,所以我试图发出一个警报,告诉我我可以设置委托,所以在我的控制器中,我调用了上面的代码,我也调用了这个:

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

然后获取此通知并最终调用此函数,这确实有效,但用户看不到警报,我希望因为它在后台。

- (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];
    

在主委托中,我定义了这个,以及相应的功能:

@interface FYRViewAppDelegate : NSObject <UIApplicationDelegate, UIAlertViewDelegate>

我的想法是,如果我能得到弹出来调用这个委托的警报,那么它就可以执行这个代码:

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

那么,有什么方法可以让UILocalNotification 使用我的委托来发出警报?

或者,有没有办法在应用程序处于后台时显示警报?

或者,我是否需要编写两个应用程序,以便它们与远程通知通信,所以当应用程序在后台运行时,一个应用程序会运行,然后通过远程通知启动主应用程序。我不喜欢这种方法,因为它看起来很乱,但可能会奏效。

因为程序永远不会停止运行

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

仅在启动时调用,本地通知从不调用它,也从不调用:

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

【问题讨论】:

【参考方案1】:

我想您不会在应用程序处于活动状态时发布通知。您不能在发布本地通知时简单地设置一个标志,然后在应用程序激活时检查该标志吗:

- (void)applicationDidBecomeActive:(UIApplication *)application

    if (localNotificationPosted) 
        // Do whatever you need to do.
    

这可能是正确的行为,因为除非用户关闭通知,否则应用程序将变为活动状态。即使用户关闭通知,下次打开应用时显示新消息也可能不是一件坏事。

【讨论】:

当应用程序在前台时,我只是更新表。理想情况下,我希望他们不要考虑应用程序,除非出现需要他们注意的事情,因此,可能需要数周(对于某些人)才需要他们注意,而对于其他人可能只需几分钟。要求用户打开应用程序以查看他们需要注意什么,这会影响程序的便利性,但是,您的解决方案可能是 iPhone 上的最佳方法。 另一个问题是应用程序并没有真正进入睡眠状态,它保持活动状态,所以我不知道它是否会调用“applicationDidBecomeActive”,我不确定如何解决那。另一种解决方案是在不活动时进入睡眠状态,然后当他们打开它时,调用 web 服务并在此时更新,但是,这似乎是一个糟糕的设计。

以上是关于当应用程序在后台运行时获取 iPhone 通知以呼叫我的委托的主要内容,如果未能解决你的问题,请参考以下文章

当位置发生变化并且我的应用程序处于后台时,我可以获得本地通知吗?

iphone App:当App在后台运行时发送警报消息?

如何在后台应用程序时从 JavaScript 发出通知/警报 - PhoneGap iPhone/iOS

当应用程序在 iOS 中关闭且应用程序未在后台运行时从推送通知中获取数据

iPhone中的XMPP后台连接

Iphone presentLocalNotificationNow 在后台应用程序时不会触发警报和声音