我在我的应用程序中处理Alarm模块。我开发了代码,从用户输入日期和时间,并在我的应用程序中的特定时间设置事件。 此外,我将信息存储到我的本地数据库中,以显示用户设置的警报列表。
现在我想在执行特定警报时从数据库中删除条目(当UILocalNotification显示到应用程序中时我想调用数据库方法从db中删除该条目)
我通过这种方式设置通知
NSUserDefaults* preferences = [NSUserDefaults standardUserDefaults];
int notificationCount = [preferences integerForKey:@"notification_count"];
notificationCount++;
NSDate* final_date = [calendar dateFromComponents:final_Components];
UILocalNotification *localNotification = [[UILocalNotification alloc]init];
localNotification.fireDate = final_date;
localNotification.alertBody=titleTextField.text;localNotification.soundName = UILocalNotificationDefaultSoundName;
localNotification.timeZone = [NSTimeZone defaultTimeZone];
localNotification.applicationIconBadgeNumber = 1;
NSDictionary* userInfoDic = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:notificationCount] forKey:@"notification_id"]; localNotification.userInfo = userInfoDic;
localNotification.repeatInterval = 0;
[[UIApplication sharedApplication]scheduleLocalNotification:localNotification];
[preferences setInteger:notificationCount forKey:@"notification_count"];
我使用了Delegate didReceiveLocalNotification
-(void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
NSString *itemName = [notification.userInfo objectForKey:@"notification_id"];
NSLog(@"userInfo is %@",itemName);
databaseObject.deleteNotification(itemName)
}
我的问题是" didReceiveLocalNotification"只调用2个案例
1)当用户使用app(应用程序在前台)时。
2)显示通知并且用户点击通知
但是在第3种情况下,应用程序处于后台模式并显示通知,如果用户没有点击通知或第二种情况是打开应用程序,直接点击应用程序图标或用户清除通知,那时didReceiveLocalNotification委托是不是称为..
有没有办法在所有情况下检测通知火灾或任何其他方法使用我可以检测到通知已经触发,然后我将执行我的删除方法。
感谢任何帮助 谢谢
答案 0 :(得分:0)
是的,您是对的,如果您的应用被暂停/终止并且用户没有点按通知来启动/激活您的应用,则您的通知会被触发,您将无法了解通知的信息。< / p>
执行此操作的唯一方法是计算每次应用运行时的时间,并重新安排通知并更新数据库。
毫秒计算:
NSInteger myMillisecond; //assume it exists
const NSTimeInterval oneSecondAsMilliseconds = 1000.0;
NSTimeInterval myTimeInterval = myMillisecond/oneSecondAsMilliseconds;
NSDate *currentDate = [NSDate date];
NSTimeInterval currentTimeStamp = [currentDate timeIntervalSince1970];
if (myTimeInterval > currentTimeStamp) {
//myTimeInterval is a later time than now
}