有没有办法在发送本地通知时运行一些代码?

Posted

技术标签:

【中文标题】有没有办法在发送本地通知时运行一些代码?【英文标题】:Is there a way to run some code when a local notification is sent? 【发布时间】:2016-02-11 22:31:30 【问题描述】:

我想在本地通知发出后运行一些代码来更新viewcontroller,我尝试了didReceiveLocalNotification的功能,但它只在用户点击通知时才有效,我想知道是否有通知发出后如何运行函数?

【问题讨论】:

【参考方案1】:

我认为您无法知道本地通知何时发送,主要是因为您可以安排本地通知或在您的应用处于后台时立即发送。

根据Apple:

您可以致电scheduleLocalNotification: 安排本地通知。该应用程序使用UILocalNotification 对象中指定的触发日期作为交付时刻。或者,您可以通过调用presentLocalNotificationNow: 方法立即呈现通知。

当应用在后台运行并且某些消息、数据或其他用户可能感兴趣的项目到达时,它们也可能会发现本地通知很有用。在这种情况下,应用程序可以使用UIApplication 方法presentLocalNotificationNow: 立即呈现通知(ios 为应用程序提供了在后台运行的有限时间)。

没有办法知道UILocalNotification 是何时发送的,但它何时收到当然是某些情况。在您的情况下,我想您正在安排UILocalNotification,所以让我们按部分划分:

当应用未打开且用户触摸时发送通知

iOS 应用的委托实现application:didFinishLaunchingWithOptions: 方法来处理本地通知。它使用UIApplicationLaunchOptionsLocalNotificationKey 键从启动选项字典中获取关联的UILocalNotification 对象。因此,您可以通过触摸UILocalNotification 了解应用程序的打开位置。见以下代码:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 

    if let launchNotification = launchOptions?[UIApplicationLaunchOptionsLocalNotificationKey] as? UILocalNotification 
        // do anything you want update UIViewController, etc
    

    return true
 

当应用程序运行并且用户触摸它时发送通知

一旦用户触摸UILocalNotification,您就可以使用didReceiveLocalNotification 方法处理它,并在其中做任何您想做的事情。

在应用运行且用户未触摸时发送通知

如果用户不触摸UILocalNotification,您唯一可以知道您的UILocalNotification 是否已发送的唯一方法是保留您之前安排的UILocalNotifications 列表并稍后检查(这是不是一个很好的解决方案,但它的工作)。

但始终存在UIApplicationWillEnterForegroundNotification,可用于通知您要更新的UIViewController,应用程序将像这样进入前台:

private var foregroundNotification: NSObjectProtocol!

override func viewDidLoad() 
    super.viewDidLoad()

    foregroundNotification = NSNotificationCenter.defaultCenter().addObserverForName(UIApplicationWillEnterForegroundNotification, object: nil, queue: NSOperationQueue.mainQueue()) 
        [unowned self] notification in

        print("Notified ViewControllerB")
    


deinit 
    // make sure to remove the observer when this view controller is dismissed/deallocated

    NSNotificationCenter.defaultCenter().removeObserver(foregroundNotification)

我认为您必须正确考虑收到通知时需要在应用内执行的操作,以防用户不点击它。

希望对你有所帮助。

【讨论】:

非常感谢,当用户没有点击通知但在发送通知后进入应用程序时,我想我已经接近更新视图了。但似乎我每次打开应用程序时都会收到“Notified ViewControllerB”,而不仅仅是在通知之后。我认为这是因为它没有正确取消初始化或在我的应用程序中的正确位置。 @LudvigSørensen 不,如果 UIViewController 仍然是内存,您会收到通知,仅此而已。 哦,好吧。我正在构建这个每日挑战应用程序,用户将在其中获得每日挑战,然后能够完成它。我想在发送通知后立即运行的功能是获取新挑战功能,以便视图将更新并为用户提供新挑战。但唯一的问题是,当我在您给我的代码中运行该功能时,每次用户重新进入应用程序时,视图都会更新。我只想在新的挑战到来时更新视图。 (每天) 顺便说一句:我想更新视图的原因是,当用户在挑战上单击“完成”时,它会将他们带到一个视图,其中有新挑战的倒计时,然后想法是,当用户在发送通知(倒计时达到 0 时)后重新进入应用程序时,视图将更新。非常感谢您的帮助:) @LudvigSørensen NSCalendar 更好地计算两个 NSDates 之间的差异,NSTimer 目的不同,NSTimer 这只是为了设置一个计时器,你无能为力它。【参考方案2】:

在objective c中有一个方法,你可以搜索类似的swift..在你的appdelegate中添加这个方法

- (void)userNotificationCenter:(UNUserNotificationCenter *)center
       willPresentNotification:(UNNotification *)notification
         withCompletionHandler:(void (^)(UNNotificationPresentationOptions UNNotificationPresentationOptionBadge))completionHandler
       [self.tableview reloadData];

我认为这会有所帮助..

【讨论】:

这个“询问代理如何处理在应用程序在前台运行时到达的通知。”【参考方案3】:

您可以通过用于发送通知的方法进行更新。

【讨论】:

以上是关于有没有办法在发送本地通知时运行一些代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 后台运行服务以接收本地通知?

如何显示多个本地通知?

iOS 13本地通知未发送

如何离线发送通知,而不是本地通知?

为啥我收到远程通知时没有发送本地通知?

本地通知能否快速从网络下载信息