本地通知无效

时间:2013-06-03 09:52:35

标签: iphone ios objective-c nsdate uilocalnotification

我正在尝试让我的应用使用本地通知。但我无法理解我的头脑。我好几天都在关注这个问题。我的core database实体Favorites(我最喜欢的艺术家)和实体Artists(艺术家的详细信息。

我有一个设置本地通知的按钮。当我按下按钮时,我会执行以下操作。

-(void)addLocalNotifications{
    GenkonStageDataModel *model = [[GenkonStageDataModel alloc]init];
    NSMutableArray *allFavorites = [model getAllFavorites];
    NSLog(@"allFavoriets count is %d",allFavorites.count);
    UIApplication* app = [UIApplication sharedApplication];
    for (int i = 0; i<allFavorites.count; i++){
        Favorites *favorite = [allFavorites objectAtIndex:i];
        int artId = [favorite.fav_art_id intValue];
        Artists *artist = [model getArtistById:artId];
        UILocalNotification* notifyAlarm = [[UILocalNotification alloc]
                                            init];
        if (notifyAlarm)
        {
            NSDate *datePush = [self getDateForArtist:artist];
            NSLog(@"Push notification should send on: %@",datePush);
            notifyAlarm.fireDate = datePush;
            NSDictionary *dicNotification = [[NSDictionary alloc]initWithObjectsAndKeys:artist.art_id,@"pushKey", nil];
            notifyAlarm.userInfo = dicNotification;
            notifyAlarm.repeatInterval = 0;
            notifyAlarm.soundName = @"Glass.aiff";
            notifyAlarm.alertBody = [NSString stringWithFormat:@"%@ starts in 15 minutes",artist.art_name];
            [app scheduleLocalNotification:notifyAlarm];
            NSLog(@"Added");
        }

    }
}

此方法的作用如下。

 1. Get all the favorites
 2. Loop through the favorites and get the artists linked with that favorite by ID
 3. Get the date for when the local notification should be sent
 4. Set in the userInfo dictionary the artist ID (I do this for deleting the local notification when I want to)
 5. Shedule the local notification.

现在所有这些都被添加(我认为),因为它在数组中正确循环,并且总是在我的日志中给出正确的日期和“已添加”。

但是现在当我更改我的设备时,它的dateTime到我通常应该收到本地通知的时间。我什么都没收到!!!!

我也提前2小时将日期更改为正确的时间。因为当我使用示例本地通知进行测试时。他们像这样设置了fireDate。

 NSDate *alertTime = [NSDate date];

这导致我点击按钮后立即发送本地通知。但是当我记录下来的时候,我注意到它是在实际时间前2小时......?

我真的希望有人可以帮我解决这个问题! 提前致谢!

修改

这就是我获取fireDate的方式

-(NSDate *)getDateForArtist:(Artists *)artist{
    int day = [artist.art_day intValue];
    int timeStart = [artist.art_timestart intValue];
    NSString *timeStart2 = [self getTimeStamp:artist.art_timestart];
    int hours = [[timeStart2 substringWithRange:NSMakeRange(0,2)]intValue];
    int minutes = [[timeStart2 substringWithRange:NSMakeRange(2,2)]intValue];
    int day2;

    if(timeStart >=2400 ){
        day = day++;
    }
    if(day == 1){
        NSLog(@"day is 28");
        day2 = 28;
    }else if (day == 2){
        NSLog(@"day is 29");
        day2 = 29;
    }else{
        NSLog(@"day is 30");
        day2 = 30;
    }
    NSDateComponents *comps = [[NSDateComponents alloc] init];
    [comps setDay:day2];
    [comps setMonth:06];
    [comps setYear:2013];
    [comps setHour:hours];
    [comps setMinute:minutes];
    NSCalendar *gregorian = [[NSCalendar alloc]
                             initWithCalendarIdentifier:NSGregorianCalendar];
    NSDate *date = [gregorian dateFromComponents:comps];
    NSLog(@"date is %@",date);


    NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
    [offsetComponents setMinute:-15];

    NSDate *date2 = [gregorian dateByAddingComponents:offsetComponents toDate:date options:0];
    NSLog(@"date -15 min %@", date2);
    return date2;
}

我得到了这个LOG

2013-06-30 14:37:13.910 genkonstage[1633:907] date is 2013-06-30 16:50:00 +0000
2013-06-30 14:37:13.913 genkonstage[1633:907] Push notification should send on: 2013-06-30 16:35:00 +0000

1 个答案:

答案 0 :(得分:0)

从你的评论(提前10秒工作)听起来它的工作正常。

当您更改设备的日期/时间时,您是如何做到的?及时转发?向后?你在改变时区吗?

您是否也安排了过去日期/时间的通知?如果您指定过去的日期(或零),则会立即发送通知。

使用UILocalNotification对象的timeZone属性评估开火日期,因此如果您未设置时区,则开火数据将被视为GMT时间。尝试:

notifyAlarm.timeZone = [NSTimeZone defaultTimeZone];

如果您将开火日期设置为09:00然后移至其他时区,则警报仍将在新时区的09:00开始。