处理多个UILocalnotification超过64

时间:2015-01-02 04:55:51

标签: ios objective-c iphone xcode uilocalnotification

请使用代码解释! 可能会提出这个问题 Manage Multiple UILocal Notification 但是没有得到答案呢? 请关注这个问题和anser 如何管理超过64的通知?

我有所有UINotification时间的本地数据库,如下面的问题:

Set multiple UILocalNotification

请回答。

5 个答案:

答案 0 :(得分:4)

在任何给定时间都无法安排超过64个本地通知。但是,可能有办法有效地实现您的目标。

  1. 如果您有重复通知,请不要手动安排通知。而是使用UILocalNotification对象上的repeatInterval。此属性需要NSCalendarUnit,可用于将重复设置为每小时,每天,每月等。
  2. 每次启动应用时,都会重新评估预定的UILocalNotification个对象。丢弃任何不再有效的内容,并尽可能多地排队。
  3. 这是最不优雅的解决方案,但可能最适合为用户设置大量提醒。但是,在尝试此方法之前请注意,实际上您不会注册其他UILocalNotification个对象,因此在显示通知时您的用户将不会被带到应用程序。因此,除此之外,您可以使用calendar events and reminders为用户设置提醒。您可能希望使用EventKit框架来处理所有繁重的工作。这种方法的优点是您可以根据需要安排任意数量的事件。您可以使用日历作为通知存储来为您发送通知。因此,每次启动应用程序时,您都会使用其中一种谓词方法(如EKEventStore)查询- (NSArray *)eventsMatchingPredicate:(NSPredicate *)predicate,以查找您创建的事件。

答案 1 :(得分:1)

也许有其他方法可以管理UILocalNotification。 根据苹果,您可以设置最多64个通知。所以要管理超过64个通知,你可以在逻辑下面实现。

首先注册前64个本地通知。在每个应用启动或didBecomeActive获取剩余通知或使用[[UIApplication sharedApplication]scheduledLocalNotifications]计数。所以,如果您的计数<64,那么请说出它的30.所以添加新的 34 通知,现在您的总通知将是64.每次启动都要这样做,以便它可以根据您的需要工作。

也许这会对你有帮助。

答案 2 :(得分:1)

尝试此操作,您可以选择setDaysetMonth,....来更改实际情况:

NSCalendar *calendar = [NSCalendar currentCalendar];

NSDateComponents *components = [[NSDateComponents alloc] init];
[components setDay:3];

NSDate *date3Days = [calendar dateByAddingComponents:components 
                                               toDate:[NSDate date] 
                                              options:0];

UIApplication* app = [UIApplication sharedApplication];
NSArray*    oldNotifications = [app scheduledLocalNotifications];
if ( oldNotifications ) {
    [app cancelAllLocalNotifications];
    app.applicationIconBadgeNumber = 0;
}

UILocalNotification* notifyAlarm = [[UILocalNotification alloc] init];
if (notifyAlarm) {
    notifyAlarm.fireDate = date3Days;
    notifyAlarm.timeZone = [NSTimeZone defaultTimeZone];
    notifyAlarm.alertBody = NSLocalizedString( @"Push message", @"");
    notifyAlarm.soundName = @"sound.wav";
    [app scheduleLocalNotification:notifyAlarm];
}

如果您想设置一个特定时间,之后UILocalNotifications应该出现,您可以创建上述解决方案的方法并循环显示您希望显示通知的日期:

NSArray *arrayNumbers = @[@5, @7, @14, @21, @30, @60, @90, @120];
NSDictionary *dictNotifications = 
[[NSUserDefaults standardUserDefaults]    objectForKey:kUserDefAppStarts];

for ( NSNumber *bla in arrayNumbers ){

    NSString *strKey = [NSString stringWithFormat:@"%@%@", kUserDefAppStarts, bla];
    NSDictionary *dict = dictNotifications[strKey];
    NSString *strMessageQuestion = dict[kKeyMessage];

    [self createNotificationWithNumberOfDays:[bla integerValue]
                                  andMessage:strMessageQuestion
                                    userInfo:dict];
}

这是你必须调用的方法

+ (void)createNotificationWithNumberOfDays:(int)days 
                                andMessage:(NSString *)message 
                                  userInfo:(NSDictionary *)dict{

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [[NSDateComponents alloc] init];
[components setDay:days];

NSDate *dateAlert = [gregorian dateByAddingComponents:components toDate:[NSDate date] options:0];

UIApplication *app = [UIApplication sharedApplication];
UILocalNotification *notifyAlarm = [[UILocalNotification alloc] init];

if( notifyAlarm ){
    [notifyAlarm setFireDate:dateAlert];
    [notifyAlarm setTimeZone:[NSTimeZone defaultTimeZone]];
    [notifyAlarm setSoundName:@"soundname"];
    [notifyAlarm setAlertBody:message];
    [notifyAlarm setUserInfo:dict];
    [app scheduleLocalNotification:notifyAlarm];
}

}

答案 3 :(得分:1)

从iOS7开始您也可以使用后台应用刷新来安排本地通知。在每次刷新调用时,您都可以检查数据库中是否有最近(未来)的通知,并按照您在应用中的方式安排它们。我们一直在我们的应用程序中使用这种方法,Apple似乎没有问题。另请注意,该用户可以禁用它,因此您应该说服您的用户,您不会耗尽他们的电池:)

您可以在此处从文档中获取更多信息:What's new in iOS7

在这里:application:performFetchWithCompletionHandler:

答案 4 :(得分:0)

使用BGTaskScheduler在iOS 13上安排通知。