UILocalNotification:在repeatInterval期间更新BadgeNumber

时间:2011-01-19 11:01:40

标签: iphone objective-c xcode uilocalnotification

在停留2天后,我找不到任何解决方案,好像对每个人都清楚(但是我)!

我需要:

Alert.applicationIconBadgeNumber = x  

每次通知触发时都会在后台更新,我通过以下方式重复通知:

notif.repeatInterval = NSMinuteCalendarUnit  

每1米重复工作正常。当应用程序进入后台,但BadgeNumber剂量更新时,它仅采用第一个更新日期值。

我通过viewDidLoad调用scheduleNotification方法

这是我的完整代码:

- (void)scheduleNotification {
UILocalNotification *notif;
notif = [[[UILocalNotification alloc] init] autorelease];
notif.timeZone = [NSTimeZone defaultTimeZone];
notif.fireDate = [[NSDate date] dateByAddingTimeInterval:5];
notif.repeatInterval = NSMinuteCalendarUnit; 

NSInteger BadgeNumber = [self BadgeNumber];
NSInteger *BadgeNumberPointer = &BadgeNumber;
NSString *BadgeNumberString = [NSString stringWithFormat:@"%i", BadgeNumber];

notif.applicationIconBadgeNumber = *BadgeNumberPointer;

notif.alertBody = BadgeNumberString;
notif.alertAction = @"Hello";

[[UIApplication sharedApplication] scheduleLocalNotification:notif];
}

-(int)BadgeNumber{
NSDate *currentDateUpdate = [[NSDate alloc] init];
NSDateFormatter *formatter2 = [[NSDateFormatter alloc] init];
[formatter2 setDateFormat:@"dd"];
NSString *dateCheckUpdate = [formatter2 stringFromDate:currentDateUpdate];
NSInteger dateCheckUpdateInt = [[dateCheckUpdate substringWithRange:NSMakeRange(0, 2)] integerValue];

int BadgeNumber = dateCheckUpdateInt;
return BadgeNumber;
}

请建议如何修理它,感谢你们所有人。

2 个答案:

答案 0 :(得分:1)

由于操作系统在计划时复制通知,因此通知中的数据不会更新,因此应用程序徽章编号不会更改。

如果您不重复通知但是为每个时间间隔生成自己的新通知,它可能会为您提供所需的行为。我可以想到生成这样的通知的唯一方法是在scheduleNotification方法中发布一堆通知,然后记住在用户以正确的方式响应时删除通知。由于操作系统仅记住下一个按时间顺序排列的64个通知,因此您只能安排大约一个小时的价值。由于您的徽章编号似乎是当前日期,因此您可以检查时间,只有在午夜一小时内设置如此多的通知时才会费心。

我不明白你想要通过经常唠叨用户来完成什么,也不会告诉他们徽章编号中的日期。任何困扰我的应用程序或滥用徽章编号的应用程序都会很快从我的iOS设备中删除。也许重新思考你想要完​​成的事情可能会引导你找到更好的解决方案。

答案 1 :(得分:1)

我知道这已经得到了解答,但您可以使用NSUserDefaults作为缓存徽章计数的方法。然后在applicationIconBadgeNumber中你可以使用这样的东西:

notif.applicationIconBadgeNumber = ([NSUserDefaults standardUserDefaults] integerForKey:@"badgeCount"] + 1);

然后您可以在用户做出相应响应时重置它。