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在后台处理推送通知

当 iOS 10 应用程序在后台时,有啥方法可以触发本地通知?

iOS如何在本地通知上启动后台任务

即使应用程序未在后台运行,也可以自动打开应用程序的VoIP推送通知是否可以在iOS中使用?

iOS 后台获取本地通知