iOS:如果应用程序在后台并到达本地通知;哪个方法会自动调用?
Posted
技术标签:
【中文标题】iOS:如果应用程序在后台并到达本地通知;哪个方法会自动调用?【英文标题】:iOS: If app is in background and local notification is arrived; which method will called automatically? 【发布时间】:2016-09-26 11:46:43 【问题描述】:我的问题是,如果应用程序在后台并且通知到达并且我从 icon 打开应用程序;应用程序恢复它的状态,但我想在这种情况下更新屏幕数据。有什么方法可以在通知到达时在后台更新数据?
这是我用来处理这种情况的代码:
ViewController.m
文件代码:
- (void)viewDidLoad
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(appIsComingFromBackground:)
name:UIApplicationDidBecomeActiveNotification
object:nil];
// Do any additional setup after loading the view, typically from a nib.
- (void) appIsComingFromBackground:(NSNotification *) note
// code
NSString *hasMessage = [[NSUserDefaults standardUserDefaults] objectForKey:@"alertmsg"];
if([hasMessage length]!=0)
_labelText.text = hasMessage;
[[NSUserDefaults standardUserDefaults] setObject:@"" forKey:@"alertmsg"];
else
_labelText.text = @"";
AppDelegate.m
文件代码:
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
if (application.applicationState == UIApplicationStateActive)
else if(application.applicationState == UIApplicationStateBackground || application.applicationState == UIApplicationStateInactive)
[[NSUserDefaults standardUserDefaults] setObject:notification.alertTitle forKey:@"alertmsg"];
NSLog(@"Alert Message: %@", notification.alertTitle);
NSLog(@"Alert Body: %@", notification.alertBody);
【问题讨论】:
如果应用程序被挂起,那么在显示本地通知时不会调用应用程序委托方法。 @Paulw11 所以这个问题没有解决办法吗? 如果用户没有从通知中打开应用但从图标打开,我们有什么办法可以更新数据? 适当的操作是让您的应用检查新数据或采取任何适当的操作,无论它是如何启动的。点击通知通常是将用户带到您应用中的特定位置,例如特定消息或事件 @Paulw11 问题是当我从图标打开应用程序时;didReceiveLocalNotification
没有打电话。如果调用此方法,那么我的问题将得到解决。因为你必须从本地通知 Payload 更新数据。
【参考方案1】:
应用程序未运行
当应用未运行时,用户会通过以下方式查看通知,具体取决于通知设置:
显示警报或横幅
标记应用程序图标
播放声音
通过点击通知的操作按钮,用户将启动应用程序。在这种情况下,应用程序委托的 application:didFinishLaunchingWithOptions: 方法被调用。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
// Override point for customization after application launch.
// Handle launching from a notification
UILocalNotification *locationNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
if (locationNotification)
// Set icon badge number to zero
application.applicationIconBadgeNumber = 0;
return YES;
应用程序正在前台运行
如果在发送通知时应用正在运行,则屏幕上不会显示任何警报。应用程序会自动调用其委托的 application:didReceiveLocalNotification: 方法。
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
UIApplicationState state = [application applicationState];
if (state == UIApplicationStateActive)
// Request to reload table view data
[[NSNotificationCenter defaultCenter] postNotificationName:@"reloadData" object:self];
// Set icon badge number to zero
application.applicationIconBadgeNumber = 0;
应用程序正在后台运行
该应用之前已启动,但用户切换到另一个应用。当通知被触发时,用户通常会在屏幕顶部看到一个警告横幅。当它被点击时,应用程序将被带到前台。与应用在前台运行的情况类似,应用会自动调用其委托的 application:didReceiveLocalNotification: 方法。
【讨论】:
是的,你是对的,但问题是如果用户从图标打开应用程序而不是application:didReceiveLocalNotification
则不会被调用,并且在这种情况下数据也不会更新。 application:didReceiveLocalNotification
仅在用户从横幅或通知打开应用时调用。
看到这个developer.apple.com/library/content/documentation/…
非常感谢@Anbu.Karthik。但我的问题仍然存在。如果用户没有从通知中打开应用程序而是从图标打开应用程序,我们有什么方法可以更新数据?
@MuhammadUmair - 如果你点击图标然后会调用 didFinishLaunchingWithOptions ,用断点检查一次
我已经检查过了.. 如果应用程序在后台并且我从图标 didFinishLaunchingWithOptions
打开应用程序没有调用。应用只是恢复它之前的状态。【参考方案2】:
In Appdelegate
- (void)application:(UIApplication *)application didReceiveLocalNotification: (UILocalNotification *)notification
if (application.applicationState == UIApplicationStateActive)
else if(application.applicationState == UIApplicationStateBackground || application.applicationState == UIApplicationStateInactive)
// [[NSUserDefaults standardUserDefaults] setObject:notification.alertTitle forKey:@"alertmsg"];
[[NSNotificationCenter defaultCenter]postNotificationName:@"PushNotificationReceived" object:nil userInfo:userInfo];
NSLog(@"Alert Message: %@", notification.alertTitle);
NSLog(@"Alert Body: %@", notification.alertBody);
In view controller:
-(void)viewDidLoad
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(doChangesWhatdidYouWant:) name:@"PushNotificationReceived" object:nil];
-(void)doChangesWhatdidYouWant:(NSNotification *)notification
//Todo
【讨论】:
以上是关于iOS:如果应用程序在后台并到达本地通知;哪个方法会自动调用?的主要内容,如果未能解决你的问题,请参考以下文章
远程通知到达时哪个代表首先调用,而我的应用程序处于终止模式(不在后台)
当 iOS 10 应用程序在后台时,有啥方法可以触发本地通知?