iOS 发送本地通知

iOS sending a local notification

我构建了一个应用程序,我想 运行 每天检查一次,看看用户需要执行哪些操作。所以我的第一个想法是支持后台模式,但后来我并没有真正在功能选项卡中找到我的选项。

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

我的所有应用程序都可以离线运行,所以我想检查一些 Realm 数据,然后发送适当的消息。我该怎么做?我希望它在用户关闭应用程序时仍然有效。

首先,当您需要您的应用程序在后台处理某些内容时(即即使设备已锁定,也可以在后台获取用户的位置),我认为这种方法有点复杂。

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

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

项目的能力?

  1. 本地通知

  2. 甚至在后台获取用户位置

  3. 甚至在后台向服务器发送用户数据

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

补充说明,不确定你是否已经知道这一点(因为几乎所有 iPhone 用户都知道这一点),如果应用程序打开并正在使用,则不会看到本地通知。

编辑(示例):

调度本地通知功能支持iOS9

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)
            }
        }
    }
}

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

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

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