8

我正在开发一个包含多个事件(例如 500 个事件)的日历应用程序,其中包含生日。我正在从 Web 服务下载事件。我想在生日当天上午 10:00 的特定时间向用户提供每个生日的提醒。我正在使用本地通知来安排警报,但我被困住了,因为 iOS 每个应用程序只允许 64 个通知,而且我有多个生日。一旦应用程序超过限制,我不知道如何安排更多通知。请建议我将如何解决这个问题。下面是我安排通知的代码

- (void)scheduleNotification:(NSMutableArray *)datesArray withMessage:(NSMutableArray *)messagesArray  NotificationID:(NSString *)notificationID
{

    NSCalendar *calendar = [NSCalendar currentCalendar];

    NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
    [formatter setDateStyle:NSDateFormatterNoStyle];
    [formatter setTimeStyle:NSDateFormatterShortStyle];


    NSDateFormatter *formatter1 = [[NSDateFormatter alloc]init];
    [formatter1 setDateStyle:NSDateFormatterMediumStyle];
    [formatter1 setDateFormat:@"dd/MM/yyyy"];

   // NSDate *myTime = [formatter dateFromString:@"06:10 PM"];
    NSDate *myTime = [formatter dateFromString:fireTime];

    for (int i = 0; i < [datesArray count]; i++)
    {
        NSDate *myDate = [formatter1 dateFromString:[datesArray objectAtIndex:i]];

        NSDateComponents *dateComponents = [calendar components:NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit fromDate:myDate];
        NSDateComponents *timeComponents = [calendar components:NSHourCalendarUnit|NSMinuteCalendarUnit fromDate:myTime];

        NSDateComponents * newComponents = [[NSDateComponents alloc]init];
        NSDateComponents *todayComponents = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:[NSDate date]];

        int day = [dateComponents day];
        int month = [dateComponents month];

        [newCompoents setDay:[dateComponents day]];
        [newCompoents setMonth:[dateComponents month]];

        if (day >= [todayComponents day] && month >= [todayComponents month]) { 
            NSLog(@"day = %d, month = %d", day, month);
            [newComponents setYear:[todayComponents year]];
        } else {
            NSLog(@"%d, %d", day, month);
            [newComponents setYear:[todayComponents year]+1];
        }


        [newComponents setHour:[timeComponents hour]];
        [newComponents setMinute:[timeComponents minute]];

        NSDate *combDate = [calendar dateFromComponents: newComponents];

        localNotif = [[UILocalNotification alloc] init];
        if (localNotif == nil)
            return;
        localNotif.fireDate = combDate;
        localNotif.timeZone = [NSTimeZone defaultTimeZone];

        // Notification details

        NSString *message = [@"Wish" stringByAppendingFormat:@" %@%@", [messagesArray objectAtIndex:i],@" On His Birthday"];
        localNotif.alertBody = message;

        // Set the action button
        localNotif.alertAction = @"View";

        localNotif.soundName = UILocalNotificationDefaultSoundName;
        localNotif.applicationIconBadgeNumber = 1;

        // Specify custom data for the notification
        NSDictionary *infoDict = [NSDictionary dictionaryWithObject:notificationID forKey:notificationID];
        localNotif.userInfo = infoDict;

        // Schedule the notification
        [[UIApplication sharedApplication] scheduleLocalNotification:localNotif];
    }

}

如果我犯了任何错误,请纠正我,并建议如何在超过 64 个限制后安排更多通知。

4

1 回答 1

1

我有一个类似的问题和一些可能对您有所帮助的其他选项,尽管它们都有缺陷,这意味着不能保证正确的行为。

请记住,重叠的生日在这里可能很有用。如果两个人最终在同一天过生日,请取消并重新安排他们的相关信息。如果您可以使用通用消息,您可以找到其他发生重复的间隔。

显然,鼓励您的用户按下通知打开应用程序会有所帮助(您的广告收入也可能如此)。你可以为你的最后一封邮件尝试一个好消息。

这很 hacky,但您可以使用此处描述的地理围栏(但可能不是远程通知):Can push notifications are used to run code without noticeing user?. 如果您添加使用它的功能,您甚至可能会获得批准。

我也考虑过通过自定义日历,但是 NSCalendar 是免费的桥接到 CFCalendarRef 并且故事似乎是我不会有运气尝试深入研究(并至少获得批准)。我会很高兴被告知我错了。

于 2014-07-20T01:57:52.690 回答