0

以下に示すように、2 つの通知をスケジュールしています。アプリは長寿命のアプリです。1 時間ごとに 1 つのローカル通知が実行されるようにスケジュールされています。もう 1 つは、1 日 1 回実行するようにスケジュールされています。2 番目にスケジュールされた通知 (1 時間ごとの通知) のみが発生します。

- (void)scheduleNotification
{
LogInfo(@"IN scheduleNotification - DELETEYESTERDAY NOTIFICATION SCHEDULED.");

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

NSDictionary *deleteDict = [NSDictionary dictionaryWithObject:@"DeleteYesterday"
                                                          forKey:@"DeleteYesterday"];

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [[NSDateComponents alloc] init];

components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:[NSDate date]];

NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];

[components setDay: day];
[components setMonth: month];
[components setYear: year];
[components setHour: 00];
[components setMinute: 45];
[components setSecond: 0];
[calendar setTimeZone: [NSTimeZone systemTimeZone]];
NSDate *dateToFire = [calendar dateFromComponents:components];

notif.fireDate = dateToFire;
notif.timeZone = [NSTimeZone systemTimeZone];
notif.repeatInterval = NSDayCalendarUnit;
notif.userInfo = deleteDict;

[[UIApplication sharedApplication] scheduleLocalNotification:notif];
}

そして、上記の後にこれをスケジュールします。

- (void)scheduleHeartBeat
{
LogInfo(@"IN scheduleHeartBeat - HEARTBEAT NOTIFICATION SCHEDULED.");

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

NSDictionary *heartbeatDict = [NSDictionary dictionaryWithObject:@"HeartBeat"
                                                     forKey:@"HeartBeat"];

heartbeat.userInfo = heartbeatDict;

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [[NSDateComponents alloc] init];

components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:[NSDate date]];

NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];

[components setDay: day];
[components setMonth: month];
[components setYear: year];
[components setHour: 00];
[components setMinute: 50];
[components setSecond: 0];
[calendar setTimeZone: [NSTimeZone systemTimeZone]];
NSDate *dateToFire = [calendar dateFromComponents:components];

heartbeat.fireDate = dateToFire;
heartbeat.timeZone = [NSTimeZone systemTimeZone];
heartbeat.repeatInterval = NSHourCalendarUnit;

[[UIApplication sharedApplication] scheduleLocalNotification:heartbeat];
}

上記は、アプリがメイン ビュー コントローラーの viewDidLoad で起動するときにスケジュールされます。

- (void)viewDidLoad
{
[self scheduleNotification];
[self scheduleHeartBeat];

[super viewDidLoad];
//OTHER CODE HERE
}

次に、appdelegate には次のものがあります。

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
LogInfo(@"IN didReceiveLocalNotification NOTIFICATION RECEIVED.");

NSString *notificationHeartBeat = nil;
NSString *notificationDeleteYesterday = nil;

application.applicationIconBadgeNumber = 0;    

if (notification) {
    notificationHeartBeat = [notification.userInfo objectForKey:@"HeartBeat"];
    notificationDeleteYesterday = [notification.userInfo objectForKey:@"DeleteYesterday"];
    LogInfo(@"IN didReceiveLocalNotification HEARTBEAT NOTIFICATION TYPE: %@", notificationHeartBeat);
    LogInfo(@"IN didReceiveLocalNotification DELETEYESTERDAY NOTIFICATION TYPE: %@", notificationDeleteYesterday);
}

if ([notificationHeartBeat isEqualToString:@"HeartBeat"]) {
    //CREATE THE HEARTBEAT
    LogInfo(@"CREATING THE HEARTBEAT.");
    //CALL THE FUNCTIONALITY HERE THAT CREATES HEARTBEAT.
}

if ([notificationDeleteYesterday isEqualToString:@"DeleteYesterday"]) {
    //DELETE YESTERDAYS RECORDS
    LogInfo(@"DELETING YESTERDAYS RECORDS.");

}    
}

最後にスケジュールされた通知 (scheduleHeartBeat) は、起動される唯一の通知です。誰かがなぜこれが起こっているのかを理解するのを手伝ってもらえますか?

4

1 に答える 1

1

繰り返し間隔を に指定しましたNSDayCalendarUnit。そのため、通知は翌日の指定された時間に送信されます。

テスト目的で、この繰り返し間隔を変更し、コードが正しく機能していることを確認してください。

私はテストしました。あなたのコードはここで正しく機能しています。

于 2013-06-27T10:16:14.637 に答える