iOS发送本地通知

时间:2017-06-29 18:36:32

标签: ios uilocalnotification

我构建了一个应用程序,我想进行每日检查,看看用户需要采取什么行动。所以我的第一个想法是支持后台模式,但后来我没有在功能选项卡中找到我的选项。

所以我决定选择background fetch,在AppDelegate func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)中实现此方法并使用它运行。但我不确定这是否是正确的做法?

我的所有应用都可以离线工作,因此我想查看一些Realm数据,然后发送相应的消息。我该怎么做?我希望它在用户关闭应用程序时仍能正常工作。

2 个答案:

答案 0 :(得分:0)

首先,当你需要你的应用程序在后台处理某些事情时(即使设备被锁定,在后台获取用户的位置),我相信这种方法有点复杂。

检查我对这个问题的回答:Will Realm still be able to save the data while user has locked iPhone?

我在那里提到了我用于生产级项目的示例项目(作为库)。

项目的能力?

  1. 本地通知

  2. 即使在后台获取用户位置

  3. 即使在后台发送用户数据到服务器

  4. 使用Core Data将数据存储到本地,甚至在后台再次存储。

  5. 附加说明,不确定您是否已经知道这一点(导致几乎所有iPhone用户都知道这一点),如果应用程序已打开并正在使用,则无法看到本地通知。

    编辑(样本):

    安排支持iOS 9的本地通知的功能

    private func setUpLocalNotification(hour: Int, minute: Int) {
    
        // have to use NSCalendar for the components
        let calendar = NSCalendar(identifier: .gregorian)!;
    
        var dateFire = Date()
    
        var fireComponents = calendar.components(
            [NSCalendar.Unit.day,
             NSCalendar.Unit.month,
             NSCalendar.Unit.year,
             NSCalendar.Unit.hour,
             NSCalendar.Unit.minute],
            from:dateFire)
    
        // if today's date is passed, use tomorrow
        if (fireComponents.hour! > hour || (fireComponents.hour == hour && fireComponents.minute! >= minute) ) {
    
            dateFire = dateFire.addingTimeInterval(86400)  // Use tomorrow's date
            fireComponents = calendar.components(
                [NSCalendar.Unit.day,
                 NSCalendar.Unit.month,
                 NSCalendar.Unit.year,
                 NSCalendar.Unit.hour,
                 NSCalendar.Unit.minute],
                from:dateFire);
        }
    
        // set up the time
        fireComponents.hour = hour
        fireComponents.minute = minute
    
        // schedule local notification
        dateFire = calendar.date(from: fireComponents)!
    
    
        let localNotification = UILocalNotification()
        localNotification.fireDate = dateFire
        localNotification.alertBody = notificationMessage
        localNotification.repeatInterval = .weekOfYear
        localNotification.soundName = UILocalNotificationDefaultSoundName
        localNotification.category = category.rawValue
    
        UIApplication.shared.scheduleLocalNotification(localNotification)
    }
    

    取消计划本地通知示例

    实际上这是明智的。

    // Loop through the schedule local notifications and cancel out if there's a weekend
    
    if let scheduledLocalNotifications = UIApplication.shared.scheduledLocalNotifications {
        for localNotification in scheduledLocalNotifications {
            if let fireDate = localNotification.fireDate {
                if fireDate.isWeekend() {                    UIApplication.shared.cancelLocalNotification(localNotification)
                }
            }
        }
    }
    

答案 1 :(得分:0)

您还可以在此处查看有关后台任务的Apple文档:

https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

远程通知似乎与你需要的东西特别相关,祝你好运!