gpt4 book ai didi

iOS UILocalNotification 设置为每天触发一次,每两天触发一次,并且仅在星期日触发

转载 作者:技术小花猫 更新时间:2023-10-29 10:26:38 25 4
gpt4 key购买 nike

我正在尝试使用设置包来安排 UILocalNotification。在设置中,您可以选择是否希望每天收到通知(1 次/天)、每 2 天 1 次、仅在星期日或从不。

这是我使用的代码(全部在 AppDelegate.m 中):

    -(void)defaultsChanged:(NSNotification *)notification {

[[UIApplication sharedApplication] cancelAllLocalNotifications];

[[NSUserDefaults standardUserDefaults]synchronize];
NSString *testValue = [[NSUserDefaults standardUserDefaults] stringForKey:@"multi_preference"];

NSLog(@"%@", testValue);

NSDate *today = [NSDate date];

NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* compoNents = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:today]; // Get necessary date components

[compoNents month];[compoNents day];

NSDictionary *dictToday= [self getDataFromdate : [compoNents day] month:[compoNents month]];


if ([testValue isEqualToString:@"one"]){
UILocalNotification* localNotification = [[UILocalNotification alloc] init];
localNotification.fireDate = [[NSDate date]dateByAddingTimeInterval:20];
localNotification.alertAction = @"View";
localNotification.alertBody = [dictToday objectForKey:@"saint_description"];
localNotification.repeatInterval = NSDayCalendarUnit;
localNotification.timeZone = [NSTimeZone defaultTimeZone];
localNotification.applicationIconBadgeNumber = [[UIApplication sharedApplication] applicationIconBadgeNumber] + 1;

[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
[[NSNotificationCenter defaultCenter] postNotificationName:@"reloadData" object:self];

}
if (testValue==Nil){
UILocalNotification* localNotification = [[UILocalNotification alloc] init];
localNotification.fireDate = [[NSDate date]dateByAddingTimeInterval:20];
localNotification.alertAction = @"View";
localNotification.alertBody = [dictToday objectForKey:@"saint_description"];
localNotification.repeatInterval = NSDayCalendarUnit;
localNotification.timeZone = [NSTimeZone defaultTimeZone];
localNotification.applicationIconBadgeNumber = [[UIApplication sharedApplication] applicationIconBadgeNumber] + 1;

[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
[[NSNotificationCenter defaultCenter] postNotificationName:@"reloadData" object:self];

}
if ([testValue isEqualToString:@"two"]){

UILocalNotification* localNotification = [[UILocalNotification alloc] init];
localNotification.fireDate = [[NSDate date]dateByAddingTimeInterval:86401];
localNotification.alertAction = @"View";
localNotification.alertBody = [dictToday objectForKey:@"saint_description"];
localNotification.repeatInterval = NSDayCalendarUnit;
localNotification.timeZone = [NSTimeZone defaultTimeZone];
localNotification.applicationIconBadgeNumber = [[UIApplication sharedApplication] applicationIconBadgeNumber] + 1;

[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
[[NSNotificationCenter defaultCenter] postNotificationName:@"reloadData" object:self];

}

if ([testValue isEqualToString:@"three"]){
NSDate *today2 = [[NSDate alloc] init];
NSCalendar *gregorian = [[NSCalendar alloc]
initWithCalendarIdentifier:NSGregorianCalendar];

// Get the weekday component of the current date
NSDateComponents *weekdayComponents = [gregorian components:NSWeekdayCalendarUnit
fromDate:today2];

/*
Create a date components to represent the number of days to subtract from the current date.
The weekday value for Sunday in the Gregorian calendar is 1, so subtract 1 from the number of days to subtract from the date in question. (If today is Sunday, subtract 0 days.)
*/
NSDateComponents *componentsToSubtract = [[NSDateComponents alloc] init];
[componentsToSubtract setDay: 0 - ([weekdayComponents weekday] - 1)];

NSDate *beginningOfWeek = [gregorian dateByAddingComponents:componentsToSubtract
toDate:today2 options:0];

/*
Optional step:
beginningOfWeek now has the same hour, minute, and second as the original date (today).
To normalize to midnight, extract the year, month, and day components and create a new date from those components.
*/
NSDateComponents *components =
[gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit |
NSDayCalendarUnit) fromDate: beginningOfWeek];
beginningOfWeek = [gregorian dateFromComponents:components];



UILocalNotification* localNotification = [[UILocalNotification alloc] init];
localNotification.fireDate = beginningOfWeek;
localNotification.alertAction = @"View";
localNotification.alertBody = [dictToday objectForKey:@"saint_description"];
localNotification.repeatInterval = NSWeekdayCalendarUnit;
localNotification.timeZone = [NSTimeZone defaultTimeZone];
localNotification.applicationIconBadgeNumber = [[UIApplication sharedApplication] applicationIconBadgeNumber] + 1;

[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
[[NSNotificationCenter defaultCenter] postNotificationName:@"reloadData" object:self];

}
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(defaultsChanged:)
name:NSUserDefaultsDidChangeNotification
object:nil];

UILocalNotification *locationNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
if (locationNotification) {
// Set icon badge number to zero
application.applicationIconBadgeNumber = 0;
}
return yes;
}
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{




UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Today's Saint"
message:notification.alertBody
delegate:self cancelButtonTitle:@"OK"
otherButtonTitles:nil];
if (notification.alertBody!=Nil)
[alert show];


[[NSNotificationCenter defaultCenter] postNotificationName:@"reloadData" object:self];

// Set icon badge number to zero
application.applicationIconBadgeNumber = 0;
}

我所说的启动通知的代码是否正确?如果不是,它有什么问题?谢谢!

最佳答案

您似乎在每当用户更改首选项时安排通知。但是,您永远不会取消安排以前安排的通知,这就是为什么您会观察到通知的爆发时间与您一天或两天前反复更改设置的时间完全一致。

您安排的通知与您打算修改的通知集是不同的对象。不幸的是,UILocalNotifications 没有标识符标记。

但是,只要您收到带有 [[UIApplication sharedApplication] cancelAllLocalNotifications];defaultsChanged: 消息,您就可以取消安排所有以前的通知改期。这将解决您的问题。

另请仔细查看 this solution这建议甚至在启动时取消和重新安排通知,以避免在用户重新安装您的应用程序时出现突发或重复通知。

关于iOS UILocalNotification 设置为每天触发一次,每两天触发一次,并且仅在星期日触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19704594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com