当应用程序在后台运行时获取 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 通知以呼叫我的委托的主要内容,如果未能解决你的问题,请参考以下文章
当位置发生变化并且我的应用程序处于后台时,我可以获得本地通知吗?
如何在后台应用程序时从 JavaScript 发出通知/警报 - PhoneGap iPhone/iOS