当应用在后台运行时获取iPhone通知来调用我的委托



我有一个企业应用程序,我想让它继续运行,这样它就可以调用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 {

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

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

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

最新更新