如果应用已经打开,请不要每天发送本地通知

时间:2022-09-11 20:50:42

I'm sending a Local Notification every day at the same time.

我每天都在同一时间发送本地通知。

I was wondering if there were a way to not send the notification if the user had already opened the app that day?

我想知道如果用户当天已经打开了应用程序,是否有办法不发送通知?

Here's the code I'm using to check if notifications are allowed, and then send the notification:

这是我用来检查是否允许通知的代码,然后发送通知:

- (void)viewDidLoad {
    [super viewDidLoad];

    UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
    UIUserNotificationSettings *mySettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];

    // before we create any new ones, cancel all existing notifications
    [[UIApplication sharedApplication]cancelAllLocalNotifications];

    if ([[[UIApplication sharedApplication] currentUserNotificationSettings] types] != UIUserNotificationTypeNone) {

        UILocalNotification* localNotification = [[UILocalNotification alloc] init];

        NSCalendar *cal = [NSCalendar currentCalendar];
        NSDateComponents *comp = [cal components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute) fromDate:[NSDate date]];
        comp.hour = 19; // 19 = 7PM
        comp.minute = 45; // 7:45 PM
        comp.second = 01; // 7:45:01 PM

        localNotification.fireDate = [cal dateFromComponents:comp];
        localNotification.alertBody = @"Local Notification in iOS8";
        localNotification.timeZone = [NSTimeZone defaultTimeZone];
        localNotification.repeatInterval = NSCalendarUnitDay;

        // this will schedule the notification to fire at the fire date
        [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
        // this will fire the notification right away, it will still also fire at the date we set
        [[UIApplication sharedApplication] presentLocalNotificationNow:localNotification];

    }
}

Edit: Here's the code I'm trying to implement the method suggestion per the answer below with? I'm obviously not getting something right here though :/

编辑:这是我试图按照下面的答案实现方法建议的代码?我显然没有在这里得到一些东西:/

- (void)isDateLowerThanToday {
    NSDate *now = [NSDate date];
    int daysToAdd = -1;
    NSDate *newDate1 = [now dateByAddingTimeInterval:60*60*24*daysToAdd];
    NSLog(@"NewDate1 = %@", newDate1);
}

1 个解决方案

#1


3  

You can store on NSUserDefaults the last notification sent date. Then, when app opens you check this value, if it's null or lower than Today you send the notification and updates the value on NSUserDefaults with current date.

您可以在NSUserDefaults上存储最后一个通知发送日期。然后,当应用程序打开时,检查此值,如果它为null或低于今天您发送通知并使用当前日期更新NSUserDefaults上的值。

Something like this should do the trick

这样的事情应该可以解决问题

NSString *key = @"LAST_NOTIFICATION_SENT_DATE";
NSDate *date = [[NSUserDefaults standardUserDefaults] objectForKey:key];

// You have to implement isDateLowerThanToday
if (!date || [self isDateLowerThanToday:date]) { 
    [self sendNotification];
    date = [NSDate date];
    [[NUserDefaults standardUserDefaults] setObject:date forKey:key];
}

Here you have isDateLowerThanToday implementation

在这里你有isDateLowerThanToday实现

-(bool)isDateLowerThanToday:(NSDate *)date {
    NSDate * now = [NSDate date];
    NSComparisonResult result = [now compare:date];

    return result == NSOrderedDescending;
}   

#1


3  

You can store on NSUserDefaults the last notification sent date. Then, when app opens you check this value, if it's null or lower than Today you send the notification and updates the value on NSUserDefaults with current date.

您可以在NSUserDefaults上存储最后一个通知发送日期。然后,当应用程序打开时,检查此值,如果它为null或低于今天您发送通知并使用当前日期更新NSUserDefaults上的值。

Something like this should do the trick

这样的事情应该可以解决问题

NSString *key = @"LAST_NOTIFICATION_SENT_DATE";
NSDate *date = [[NSUserDefaults standardUserDefaults] objectForKey:key];

// You have to implement isDateLowerThanToday
if (!date || [self isDateLowerThanToday:date]) { 
    [self sendNotification];
    date = [NSDate date];
    [[NUserDefaults standardUserDefaults] setObject:date forKey:key];
}

Here you have isDateLowerThanToday implementation

在这里你有isDateLowerThanToday实现

-(bool)isDateLowerThanToday:(NSDate *)date {
    NSDate * now = [NSDate date];
    NSComparisonResult result = [now compare:date];

    return result == NSOrderedDescending;
}