2015-06-03 2 views
1

Я отправляю 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]; 

    } 
} 

Edit: Вот код, который я пытаюсь реализовать метод предложения за ответ ниже с? Очевидно, я не получаю что-то здесь, хотя:/

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

ответ

3

Вы можете хранить на NSUserDefaults последнее уведомление посланной дату. Затем, когда приложение открывается, вы проверяете это значение, если оно равно null или ниже, чем сегодня. Вы отправляете уведомление и обновляете значение на 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; 
} 
+0

Сладкого Я собираюсь попробовать, что имеет смысл! – SRMR

+0

Является '[self sendNotification];' заполнителем для моего кода, который у меня уже есть, который отправляет уведомление? – SRMR

+0

Я знаю, что я должен реализовать 'isDateLowerThanToday', но является ли код внутри этого метода, находящего дату? Думаю, мне сложно понять, как это сделать? Можете ли вы помочь мне на этом быстро? Благодаря! – SRMR

Смежные вопросы