9

在 UILocalNotification 我们使用NSCalendarUnitMinute类似重复......但我在 iOS 10 UserNotification 文档中找不到......我如何NSCalendarUnitMinute在 iOS 10 中使用类似重复UserNotification

这是将在晚上 8:30 安排本地通知的代码,并将在每分钟后重复一次。

UILocalNotification* localNotification = [[UILocalNotification alloc] init];
localNotification.fireDate = pickerDate;
localNotification.alertBody = self.textField.text;
localNotification.timeZone = [NSTimeZone defaultTimeZone];
localNotification.repeatInterval = NSCalendarUnitMinute;
localNotification.applicationIconBadgeNumber = [[UIApplication sharedApplication] applicationIconBadgeNumber] + 1;
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
4

3 回答 3

3

虽然看起来旧的通知框架对此有更好的支持,但直到我们意识到新的更好!

我有类似的问题,下面是旧通知如何与新通知齐头并进的示例。

为了更安全,这是Swift2.3.

// Retrieve interval to be used for repeating the notification
    private func retrieveRepeatInterval(repeatTemp: RepeatInterval) {
        switch repeatTemp {
        case .Never:
            if #available(iOS 10.0, *) {
                toDateComponents = NSCalendar.currentCalendar().components([.Hour, .Minute, .Day, .Month, .Year], fromDate: timeTemp!)
                toDateComponents.second = 0
                repeatNotification = false
            } else {
                repeatIntervalTemp = nil
            }
        case .EveryMinute:
            if #available(iOS 10.0, *) {
                toDateComponents.second = 0
                repeatNotification = true
            } else {
                repeatIntervalTemp = .Minute
            }
        case .EveryHour:
            if #available(iOS 10.0, *) {
                toDateComponents = NSCalendar.currentCalendar().components([.Minute], fromDate: timeTemp!)
                toDateComponents.second = 0
                repeatNotification = true
            } else {
                repeatIntervalTemp = .Hour
            }
        case .EveryDay:
            if #available(iOS 10.0, *) {
                toDateComponents = NSCalendar.currentCalendar().components([.Hour, .Minute], fromDate: timeTemp!)
                toDateComponents.second = 0
                repeatNotification = true
            } else {
                repeatIntervalTemp = .Day
            }
        case .EveryWeek:
            if #available(iOS 10.0, *) {
                toDateComponents = NSCalendar.currentCalendar().components([.Hour, .Minute, .Weekday], fromDate: timeTemp!)
                toDateComponents.second = 0
                repeatNotification = true
            } else {
                repeatIntervalTemp = .WeekOfYear
            }
        case .EveryMonth:
            if #available(iOS 10.0, *) {
                toDateComponents = NSCalendar.currentCalendar().components([.Hour, .Minute, .Day], fromDate: timeTemp!)
                toDateComponents.second = 0
                repeatNotification = true
            } else {
                repeatIntervalTemp = .Month
            }
        case .EveryYear:
            if #available(iOS 10.0, *) {
                toDateComponents = NSCalendar.currentCalendar().components([.Hour, .Minute, .Day, .Month], fromDate: timeTemp!)
                toDateComponents.second = 0
                repeatNotification = true
            } else {
                repeatIntervalTemp = .Year
            }
        }
    }

虽然这并不详尽,但我几乎涵盖了从一分钟到一年的所有内容。

更详细地说,

// RepeatInterval
enum RepeatInterval : String, CustomStringConvertible {
    case Never = "Never"
    case EveryMinute = "Every Minute"
    case EveryHour = "Every Hour"
    case EveryDay = "Every Day"
    case EveryWeek = "Every Week"
    case EveryMonth = "Every Month"
    case EveryYear = "Every Year"

    var description : String { return rawValue }

    static let allValues = [Never, EveryMinute, EveryHour, EveryDay, EveryWeek, EveryMonth, EveryYear]
}

var repeatTemp: RepeatInterval?

var repeatIntervalTemp: NSCalendarUnit?

var timeTemp: NSDate?

var toDateComponents = NSDateComponents()

因为这对我有用,所以可能对你们其他人也有用。请尝试让我知道是否有问题。

而且,对于这个问题的确切解决方案,我建议如下。

(可能苹果没有考虑过这样的场景,但可以处理)

  1. 安排晚上 8:30 的通知
  2. 当通知被触发时,将其删除并安排另一个具有不同标识符的通知,NSCalendarUnitMinute如上所示。
  3. 瞧,它有效!(或者没有?)
于 2016-09-30T06:00:56.543 回答
1

请耐心等待这是我的第一篇文章。

我们需要在 ios 10 中为我们的应用程序设置 1 分钟的重复间隔,并将新旧框架的组合用作解决方法。

  1. 用旧的安排重复的本地通知:

    UILocalNotification *ln = [[UILocalNotification alloc] init];
    ...
    ln.repeatInterval = kCFCalendarUnitMinute;
    ln.userInfo = @{@"alarmID": ...}
    ...
    [[UIApplication sharedApplication] scheduleLocalNotification:ln];

这将创建和安排通常的重复 LN,这些 LN 将显示为带有 UNLegacyNotificationTrigger 的 UNNotification

我使用alarmID 来连接新旧框架。

尝试:

UNUserNotificationCenter* center = [UNUserNotificationCenter 

currentNotificationCenter];
[center getPendingNotificationRequestsWithCompletionHandler:^(NSArray<UNNotificationRequest *> * _Nonnull requests) {
    NSLog(@"----------------- PendingNotificationRequests %i -------------- ", (int)requests.count);
    for (UNNotificationRequest *req in requests) {
        UNNotificationTrigger *trigger = req.trigger;
        NSLog(@"trigger %@", trigger);
    }
}];
  1. 响应动作和触发通知,操纵通知中心:

使用新框架 UNUserNotificationCenter 方法: willPresentNotification: didReceiveNotificationResponse:

  1. 我以通常的方式对这两个框架进行了请求授权和类别注册。

希望这可以帮助

于 2016-09-27T13:04:14.383 回答
1

使用UNCalendarNotificationTriggerwithDateComponents而不是NSCalendar

var date = DateComponents()
date.hour = 8
date.minute = 30

let trigger = UNCalendarNotificationTrigger(dateMatching: date, repeats: true)
let content = UNNotificationContent()
// edit your content

let notification = UNNotificationRequest(identifier: "myNotification", content: content, trigger: trigger)

您使用实例设置日期,DateComponents并指定通知是否应使用初始化程序的repeats参数重复。UNCalendarNotificationTrigger

UNCalendarNotificationTrigger 文档

请注意 Apple Docs 中有一个错字(截至 6 月 13 日)。如果您使用NSDateComponents而不是DateComponents,则需要date as DateComponentsdateMatching参数中显式转换您的。

针对您的评论,我不相信您想要的行为(更改重复通知的频率)受UNCalendarNotificationTrigger.

于 2016-06-14T06:21:46.223 回答