Swift - 在 applicationWillTerminate 中调用本地通知方法

Posted

技术标签:

【中文标题】Swift - 在 applicationWillTerminate 中调用本地通知方法【英文标题】:Swift - Calling Local Notification Method in applicationWillTerminate 【发布时间】:2017-02-14 19:54:12 【问题描述】:

我有一个用于本地通知的公共函数,我想在 applicationWillTerminate 中调用该函数。当我尝试这个时,没有任何反应。我确定本地通知功能没问题,因为当我在 viewDidLoad 中调用它时,它可以正常工作。


这是本地通知功能;

func scheduleLocalNotification(second: Double) 

    if #available(ios 10.0, *) 
        let center = UNUserNotificationCenter.current()

        let content = UNMutableNotificationContent()
        content.badge = 1
        content.title = "Title!"
        content.body = "Message!"
        content.categoryIdentifier = "id"
        content.userInfo = ["key": "value"]
        content.sound = UNNotificationSound.default()

        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: second, repeats: false)

        let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)
        center.add(request)
     else 
        // Fallback on earlier versions
    

AppDelegate;

func applicationWillTerminate(_ application: UIApplication) 

        scheduleLocalNotification(second: 30.0)
        print("Terminating!")

        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    

我在 SO 中搜索了类似的问题,发现了 2 个问题,但没有一个能解决我的问题。

Send local notification after termination app swift 2

Local notification on application termination


编辑:请求授权;

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 

        let launchedBefore = UserDefaults.standard.bool(forKey: "launchedBefore")
        if (!launchedBefore)  
            if #available(iOS 10.0, *) 
                UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound])  (granted, error) in
                    if granted 
                        print("Authorization granted!")
                     else 
                        print("Authorization not granted!")
                    
                
             else 
                let settings = UIUserNotificationSettings(types: [.alert, .badge , .sound], categories: nil)
                UIApplication.shared.registerUserNotificationSettings(settings)
            

            UserDefaults.standard.set(true, forKey: "launchedBefore")
        

        // Override point for customization after application launch.
        return true
    

【问题讨论】:

你如何终止应用来测试这个? @Paulw11 按两次按钮并删除该应用程序。我也在使用真机进行测试。 您是否在代码的前面某处requestAuthorization(options:completionHandler:) This solution 是一个 hack,但它对我有用。它的要点是应用程序在可以安排通知之前被终止。 hack 的作者所做的就是让线程休眠。 【参考方案1】:

您链接到的第二个问题的答案似乎相关 - 如果系统决定在后台终止您的应用程序,则不能保证调用 applicationWillTerminate

【讨论】:

我正在像往常一样在前台终止应用程序。【参考方案2】:

只是关于 applicationWillTerminate 的注释:正如 Apple 所说,“Uncommon”所说,不能保证会调用它。

但我认为是设计问题:

a) 如果您想添加本地通知,请在用户设置后立即执行。

b) 如果您通过“applicationWillTerminate”来节省 CPU 时间,仅在退出时调用“添加通知”,请确保每次都没有大的惩罚保存通知。作为一种标准行为,在 iOS 中,我们应该在用户设置后立即保存所有内容。

在我的应用中,我只是在“返回”或“关闭”时添加通知。

c) 确保控制/重置已设置的通知。

如果您只是在测试 iOS 行为,那么您处于角落边缘,请在此处查看“爱斯基摩人”答案:

https://forums.developer.apple.com/thread/13557

【讨论】:

以上是关于Swift - 在 applicationWillTerminate 中调用本地通知方法的主要内容,如果未能解决你的问题,请参考以下文章

应用退出和重新启动时不保存 NSManagedObjectContext

iphone应用程序终止时删除文档文件夹中的文件

当应用程序关闭或终止时,将 textField 中的数据保存到文件中

我应该在 iOS/OS X 应用程序中在哪里初始化我的单例?

swift [Swift Notes]在学习Swift #Swift的同时收集笔记

swift 优雅地处理Swift中可本地化的字符串。注意:此代码在Swift 2中,需要在现代Swift中使用更新。