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

时间:2015-06-03 20:23:17

标签: ios objective-c notifications uilocalnotification

我每天都在同一时间发送Local 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];

    }
}

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

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

1 个答案:

答案 0 :(得分:3)

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

这样的事情可以解决问题

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];
}

这里有isDateLowerThanToday实施

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

    return result == NSOrderedDescending;
}