如果用户当天尚未打开应用,我目前正在安排本地通知每天下午6点出现一次。如果用户已经加载了应用程序,那么我想取消当天的通知,并在明天下午6点安排新的通知。但是,当我尝试迭代计划通知列表(这不是我在应用程序中的唯一本地通知)时,通知会正确显示,[[UIApplication sharedApplication] scheduledLocalNotifications]数组始终为空。以下是给我带来麻烦的代码段:
// See if we need to create a local notification to tell the user that they can receive a daily reward
NSArray *notifications = [[UIApplication sharedApplication] scheduledLocalNotifications]; // <- This is always empty
// Iterate over all the pending notifications
for( int iter = 0; iter < [notifications count]; iter++ )
{
UILocalNotification* localNotification = [notifications objectAtIndex:iter];
if( [[localNotification.userInfo objectForKey:@"source"] isEqualToString:@"dailyReminder"] )
[[UIApplication sharedApplication] cancelLocalNotification:localNotification];
}
NSCalendar* calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
[calendar setTimeZone:[NSTimeZone localTimeZone]];
NSDateComponents *nowComponents = [calendar components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit | NSSecondCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:serverDate];
int hour = [nowComponents hour];
int minute = [nowComponents minute];
int second = [nowComponents second];
int hoursToAdd = 18 - hour;
NSDateComponents *comps = [[[NSDateComponents alloc] init] autorelease];
[comps setDay:1];
[comps setHour:hoursToAdd];
[comps setMinute:-minute];
[comps setSecond:-second];
NSDate *tomorrow6PM = [calendar dateByAddingComponents:comps
toDate:serverDate
options:0];
NSMutableDictionary* userInfo = [NSMutableDictionary dictionary];
[userInfo setObject:@"dailyReminder" forKey:@"source"];
scheduleNotification(tomorrow6PM, NSLocalizedString(@"Come Back!", @"daily reminder notification message"), NSLocalizedString(@"Launch", @"daily reminder notification button text"), [UIApplication sharedApplication].applicationIconBadgeNumber+1, userInfo);
scheduleNotification函数很简单,只需构建一个本地通知:
void scheduleNotification(NSDate* fireIn, NSString* bodyText, NSString* alertText, NSUInteger badgeCount, NSMutableDictionary* userInfo)
{
static int appCount = 0;
appCount += 1;
if(!isLocalNotificationEnabled())
return;
Class localNotificationClass = NSClassFromString(@"UILocalNotification");
UILocalNotification* localNotification = [[localNotificationClass alloc] init];
if(!localNotification)
return;
localNotification.fireDate = fireIn;
localNotification.timeZone = [NSTimeZone systemTimeZone];
localNotification.alertBody = bodyText;
localNotification.alertAction = alertText;
localNotification.soundName = UILocalNotificationDefaultSoundName;
localNotification.applicationIconBadgeNumber = badgeCount;
localNotification.userInfo = userInfo;
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
[localNotification release];
}
我不明白为什么本地通知数组总是为空。就像我在正确的时间显示通知之前说的那样,所以他们正在安排。任何帮助表示赞赏。
答案 0 :(得分:7)
现在有类似的问题。我的猜测是iOS不会立即安排通知,而只是在当前运行循环结束时。我在同一个运行循环中多次设置scheduledLocalNotifications属性时遇到了这些问题,并且更改似乎没有相应更新。我想我会自己保留本地通知数组的副本,并且只设置scheduledLocalNotifications并且从不读它。
答案 1 :(得分:1)
localNotification.fireDate = fireIn;
在此行中检查“fireIn”是NSDate
或NSString
的对象。
如果NSString
在NSDate
的帮助下将其转换为NSDateformatter
对象,然后将其分配给localNotification
fireDate。
我以前遇到过同样的问题,并通过上述步骤解决了这个问题。
答案 2 :(得分:0)
如果计划具有无效的开火日期,它将不会被调度并返回结果空数组,因为从来没有有效的一个计划,尝试打印出如下所示的localNotification,您可能会发现问题。
NSLog(@"Notification--->: %@", localNotification);