6

看起来

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

didReceiveLocalNotification:(UILocalNotification *)notification

仅当用户确认 UILocalNotification 时才会触发,例如通过滑动滑块或触摸 iOS 通知下拉菜单中的条目。

如果用户忽略 UILocalNotification 并通过简单地单击应用程序图标重新进入应用程序,有什么方法可以告诉 UILocalNotification 已经消失?

我应该提一下,这实际上只适用于重复通知,因为可以通过观察总数来检测非重复通知的触发。也就是说,当他们开火时,从[[UIApplication sharedApplication] scheduledLocalNotifications].

我正在寻找类似的东西..

[[UIApplication sharedApplication] unacknowledgedLocalNotifications]

唉,我找不到类似的东西。

4

3 回答 3

5

好吧,你可以在里面查看你的预定通知[[UIApplication sharedApplication] scheduledLocalNotifications]。要了解计划的重复通知是否已触发,请访问该fireDate属性以查看为通知设置的初始日期。然后检查repeatInterval属性。

因此,您有 2 个变量,一个是初始变量,NSDate可以说2013-05-08 12:00,第二个是重复间隔,可以说是每天。通过这样做,[NSDate date]您将获得我所在的位置(在瑞典)现在的当前日期2013-05-09 22:45。因此,这意味着有一个用户尚未采取行动的通知。

因此,您需要创建一个方法来获取这些参数,然后从初始日期开始迭代,以查看在当前日期时间之前错过了多少通知。

您会发现NSCalendars dateByAddingComponents:toDate:options很有用。

于 2013-05-09T20:52:18.420 回答
2

此后每个人都可能继续前进,但我想分享我对这个问题的解决方案。(对不起长变量名称......)

这个想法很简单:永远保持fireDate在未来。

- 每次调用 didFinishLaunchingWithOptions 或 didReceiveLocalNotification 时,只需取消您当前的通知并在未来重新安排一个带有 fireDate 间隔单位的新通知

- 当您的应用程序启动时,遍历所有计划的通知,如果 fireDate 不在未来,您就知道它被忽略了

就我而言,通知每周重复一次。我首先在 didFinishLaunchingWithOptions 中重新安排任何确认的通知:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UILocalNotification* localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];

    if (localNotif != nil)
    {
        [NotificationsHelper rescheduleNotification:localNotif];
    }
}

还有在 didReceiveLocalNotification 中:

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *) notification
{
   [NotificationsHelper rescheduleNotification:notification];
}  

在 App Launch 中,我会检查所有过去是否有任何带有 fireDate 的通知:

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    [self checkLocalNotifications:application];
}

我的“checkLocalNotifications”函数的代码:

- (void) checkLocalNotifications:(UIApplication *) application
{
    UIApplication*  app        = [UIApplication sharedApplication];
    NSArray*        eventArray = [app scheduledLocalNotifications];

    for (int i = 0; i < [eventArray count]; i++)
    {
        UILocalNotification* notification = [eventArray objectAtIndex:i];

        if ([NotificationsHelper wasWeeklyRepeatingNotificationIgnored:notification])
        {
            [NotificationsHelper rescheduleNotification:notification];

            NSLog(@"NotificationWasIgnored: %@ %@",notification.alertAction, notification.alertBody );
        }
    }
}

我的“wasWeeklyRepeatingNotificationIgnored”函数的代码:

+ (BOOL) wasWeeklyRepeatingNotificationIgnored:(UILocalNotification*) the_notification
{
    BOOL    result;
    NSDate* now = [NSDate date];

    // FireDate is earlier than now
    if ([the_notification.fireDate compare:now] == NSOrderedAscending)
    {
        result = TRUE;
    }
    else
    {
        result = FALSE;
    }

    return result;
}

我的“重新安排通知”功能的代码:

+ (void) rescheduleNotification:(UILocalNotification*) the_notification
{
    UILocalNotification* new_notification = [[UILocalNotification alloc] init];

    NSMutableDictionary* userinfo = [[NSMutableDictionary alloc] init];

    [new_notification setUserInfo:userinfo];
    [new_notification setRepeatInterval:the_notification.repeatInterval];
    [new_notification setSoundName:UILocalNotificationDefaultSoundName];
    [new_notification setTimeZone:[NSTimeZone defaultTimeZone]];
    [new_notification setAlertAction:the_notification.alertAction];
    [new_notification setAlertBody:the_notification.alertBody];
    [new_notification setRepeatCalendar:[NSCalendar currentCalendar]];
    [new_notification setApplicationIconBadgeNumber:the_notification.applicationIconBadgeNumber];

    NSCalendar*       gregorian         = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents* weekdayComponents = [gregorian components:NSWeekdayCalendarUnit
                                                       fromDate:the_notification.fireDate];

    NSInteger weekday   = [weekdayComponents weekday];
    NSDate*   next_week = [self addDay:weekday toHourMinute:the_notification.fireDate];

    [new_notification setFireDate:next_week];

    [[UIApplication sharedApplication] scheduleLocalNotification:new_notification];
    [[UIApplication sharedApplication] cancelLocalNotification:the_notification];
}
于 2013-06-24T23:07:43.007 回答
0

如果您的 UILocalNotifications 增加了应用程序图标徽章编号(即应用程序图标右上角的红色圆圈中的数字),那么有一种非常简单的方法可以检查未确认的 UILocalNotifications:只需检查当前applicationIconBadgeNumber是什么:

- (void)applicationWillEnterForeground:(UIApplication *)application
{        
    int unacknowledgedNotifs = application.applicationIconBadgeNumber;
    NSLog(@"I got %d unacknowledged notifications", unacknowledgedNotifs);
    //do something about it...

    //You might want to reset the count afterwards:
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];

}
于 2013-09-05T19:54:37.207 回答