【问题标题】:application:didReceiveLocalNotification: not called when app in background应用程序:didReceiveLocalNotification:当应用程序在后台时不调用
【发布时间】:2015-06-23 12:34:20
【问题描述】:

当我的应用程序进入后台时,applicationDidEnterBackground 会被自动调用,并且在此方法中我们会触发本地通知。但是didReceiveLocalNotification:方法没有被调用

- (void)applicationDidEnterBackground:(UIApplication *)application {

UIApplication *app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
    bgTask = UIBackgroundTaskInvalid;
}];

UILocalNotification* localNotification = [[UILocalNotification alloc] init];
localNotification.timeZone = [NSTimeZone defaultTimeZone];
localNotification.fireDate = [NSDate date];
localNotification.alertBody = textString;
localNotification.alertAction = @"View";
localNotification.soundName = UILocalNotificationDefaultSoundName;
localNotification.applicationIconBadgeNumber =  1;

[[UIApplication sharedApplication] presentLocalNotificationNow:localNotification];
}

【问题讨论】:

标签: ios objective-c iphone ios7 uilocalnotification


【解决方案1】:

您对本地通知的期望不正确:

当您的应用进入后台时,您会在手机上看到即时通知,但您必须点击该通知才能触发 didReceiveLocalNotification 委托。

如果您在前台收到本地通知,则会自动触发 didReceiveLocalNotification。

以上场景已经过测试和验证。

更新:您必须阅读此文档: http://www.thekspace.com/home/component/content/article/62-uilocalnotification-demystified.html

【讨论】:

  • 当本地通知被触发时,我没有收到任何徽章或横幅。当然,在这种情况下,我们可以期待本地通知,因为处于非活动模式的应用程序没有暂停。
  • 哇,我复制粘贴了您的相同代码,并立即收到本地通知。 @Downvoter:请注意评论。
  • @RahulSharma 请使用此文档检查您的代码。我已经复制粘贴了您的代码,一切正常。所以可能你已经忽略了一些其他部分thekspace.com/home/component/content/article/…
  • @NitinGohel 不确定您对什么感到困惑。只有在应用未运行时启动应用时才会调用 didFinish。检查互联网或 stackoverflow 上的任何文档。
【解决方案2】:

试试这个代码:

NSDate *pickerDate = [date_picker date];
// Schedule the notification
UILocalNotification* localNotification = [[UILocalNotification alloc] init];
localNotification.fireDate = pickerDate;
localNotification.alertBody = @"Alert Body Message";
localNotification.alertAction = @"Alert Action Message";
localNotification.timeZone = [NSTimeZone defaultTimeZone];
[[UIApplication sharedApplication]     scheduleLocalNotification:localNotification];

并在 App 委托类的 didFinishLaunchingWithOptions 中使用此代码。

    UILocalNotification *locationNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
if (locationNotification) {
    // Set icon badge number to zero
    application.applicationIconBadgeNumber = 0;
}

【讨论】:

  • 将代码放入 didFinishLaunchingWithOptions 的目的是什么?如果您转到后台并进入前台,它将永远不会被调用。
  • @Tariq 当您在后台模式下应用程序并收到通知时调用。当您单击应用程序图标或通知时,将调用此方法
  • @NitinGohel 将调用哪个方法? OmPrakash 说如果你的应用程序在后台并且你点击通知然后 didFinishLaunchingWithOptions 将被调用。仔细检查 ios 文档。 didFinish 仅在应用程序第一次启动时被调用。当您在后台模式(非终止模式)下点击通知时,didReceiveLocalNotification 方法将被调用而不是 didFinishLaunchingWithOptions
  • 应用程序首次启动时调用选项的应用程序启动。应用在后台时不会调用它
  • @RahulSharma,我为 yoy 目标提供了 sn-p,它对我有用
【解决方案3】:

在安排通知之前,您必须将其注册为指定类型:

    - (void)applicationDidEnterBackground:(UIApplication *)application {

    UIApplication *app = [UIApplication sharedApplication];
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        bgTask = UIBackgroundTaskInvalid;
    }];

    UILocalNotification* localNotification = [[UILocalNotification alloc] init];
    localNotification.timeZone = [NSTimeZone defaultTimeZone];
    localNotification.fireDate = [NSDate date];
    localNotification.alertBody = textString;
    localNotification.alertAction = @"View";
    localNotification.soundName = UILocalNotificationDefaultSoundName;
    localNotification.applicationIconBadgeNumber =  1;
    // register notification settings
    if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
#ifdef __IPHONE_8_0
  UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge
      |UIRemoteNotificationTypeSound
      |UIRemoteNotificationTypeAlert) categories:nil];
  [application registerUserNotificationSettings:settings];
#endif
} else {
  UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
  [application registerForRemoteNotificationTypes:myTypes];
}

    [[UIApplication sharedApplication] presentLocalNotificationNow:localNotification];
    }

【讨论】:

  • @RahulSharma,我为 8.0 以下的版本添加了处理程序。现在它必须工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-02
  • 2017-11-06
  • 1970-01-01
  • 1970-01-01
  • 2019-05-30
  • 1970-01-01
相关资源
最近更新 更多