停止本地通知
Posted
技术标签:
【中文标题】停止本地通知【英文标题】:Stop local notification 【发布时间】:2012-07-23 07:28:21 【问题描述】:下面有个问题:
当通过按主页按钮将应用程序最小化到后台时,创建一个本地通知以每 5 分钟弹出一次。 从后台删除应用程序。 -->我预期的然后 pup-up 只显示应用程序存在时,当从后台删除应用程序时它被丢弃。我的问题是本地通知仍然处于活动状态,并且从后台删除后它仍然每 5 分钟显示一次弹出窗口。
我怎样才能阻止它? 请帮我! 提前致谢。
【问题讨论】:
你为什么要使用本地通知,而你只希望它们在你的应用程序运行时出现?本地通知的全部意义在于,无论您的应用程序是否正在运行,它们都会在指定时间出现。 当我想从后台弹出时你有什么建议吗?在我的例子中它只有 5 分钟,可能是 10 分钟或 20 分钟。我们还知道在后台使用应用程序时有关计时器的限制。 很抱歉,但我认为您正在尝试解决错误的问题。一般来说,用户不知道哪些应用程序在内存中,哪些应用程序已被终止。仅仅因为应用程序列在“任务管理器”中并不意味着它正在运行或在内存中。我的意思是,您不应该尝试根据应用程序是否在内存中来调整行为。对于用户来说,背景(在内存中)和被杀死的应该看起来完全一样。 【参考方案1】:把它放在应用程序委托中。当应用程序进入后台时,它将删除所有本地通知。
- (void)applicationDidEnterBackground:(UIApplication *)application
[[UIApplication sharedApplication] cancelAllLocalNotifications];
【讨论】:
我也在使用 [[UIApplication sharedApplication] cancelAllLocalNotifications];在 applicationDidEnterBackground 和 didFinishLaunchingWithOptions 但它仍然无法正常工作。 对不起,我的错。更新了问题。【参考方案2】:如果您不想取消所有通知...我已经设置了一个唯一标识符,存储在通知的 userInfo 字典中。当我想删除时,我会快速枚举所有通知并选择正确的通知进行删除。
我在这里的绊脚石是记住存储我为通知创建的 UUID,还记得在快速枚举中使用 isEqualToString。我想我也可以使用特定的名称字符串而不是唯一标识符。如果有人可以让我知道比快速枚举更好的方法,请告诉我。
@interface myApp ()
NSString *storedUUIDString;
- (void)viewDidLoad
// create a unique identifier - place this anywhere but don't forget it! You need it to identify the local notification later
storedUUIDString = [self createUUID]; // see method lower down
// Create the local notification
- (void)createLocalNotification
UILocalNotification *localNotif = [[UILocalNotification alloc] init];
if (localNotif == nil) return;
localNotif.fireDate = [self.timerPrototype fireDate];
localNotif.timeZone = [NSTimeZone defaultTimeZone];
localNotif.alertBody = @"Hello world";
localNotif.alertAction = @"View"; // Set the action button
localNotif.soundName = UILocalNotificationDefaultSoundName;
NSDictionary *infoDict = [NSDictionary dictionaryWithObject:storedUUIDString forKey:@"UUID"];
localNotif.userInfo = infoDict;
// Schedule the notification and start the timer
[[UIApplication sharedApplication] scheduleLocalNotification:localNotif];
// Delete the specific local notification
- (void) deleteLocalNotification
// Fast enumerate to pick out the local notification with the correct UUID
for (UILocalNotification *localNotification in [[UIApplication sharedApplication] scheduledLocalNotifications])
if ([[localNotification.userInfo valueForKey:@"UUID"] isEqualToString: storedUUIDString])
[[UIApplication sharedApplication] cancelLocalNotification:localNotification] ; // delete the notification from the system
// Create a unique identifier to allow the local notification to be identified
- (NSString *)createUUID
CFUUIDRef theUUID = CFUUIDCreate(NULL);
CFStringRef string = CFUUIDCreateString(NULL, theUUID);
CFRelease(theUUID);
return (__bridge NSString *)string;
上述大部分内容可能在过去 6 个月的某个时间从 *** 中删除。希望这会有所帮助
【讨论】:
我认为如果应用程序还活着(集中或最小化),你的方式工作。但是当创建通知 -> 最小化 -> 从后台删除应用程序时会发生什么。您的应用是否仍显示通知? 抱歉,截至 2011 年 3 月,这似乎是不可能的:linkhttp://***.com/questions/5398191/cancelalllocalnotifications-in-applicationwillterminate - 现在可能不同了。解决方法建议:限制通知的数量而不是不断重复,确保用户在这些预定通知期间的某个时间点返回应用程序,如果通知要继续重置它们。恐怕我的经历到此为止:)现在可能会有所不同。解决方法建议:限制通知的数量而不是不断重复,确保用户在这些预定通知期间的某个时间点返回应用程序,如果通知要继续重置它们。恐怕我的经历就到此为止了:) 史蒂文,感谢您的帮助,但我仍然不明白您的意思。 嗯,这是个好问题。如果应用程序被用户意外终止或内存不足,则无法删除通知,而且我刚刚发现也无法将通知设置为重复固定次数。您必须创建单独的单独通知来模拟重复,提示用户在用完之前返回应用程序以重新创建该队列 - ***.com/questions/5762517/…以上是关于停止本地通知的主要内容,如果未能解决你的问题,请参考以下文章
本地通知 UNTimeIntervalNotificationTrigger triggerWithTimeInterval 每 1 分钟触发一次 如何停止