停止本地通知

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/…

以上是关于停止本地通知的主要内容,如果未能解决你的问题,请参考以下文章

在特定时间停止 iOS 本地通知

停止本地通知

添加 FCM 支持后,本地通知在 iOS 上停止工作

当应用程序从后台删除时停止本地通知

应用程序停止时如何在 Android 中获取本地通知?

本地通知 UNTimeIntervalNotificationTrigger triggerWithTimeInterval 每 1 分钟触发一次 如何停止