如何在iOS 10 UserNotifications上设置NSCalendarUnitMinute repeatInterval?

时间:2016-06-14 06:18:03

标签: ios objective-c swift ios10 unnotificationrequest

在UILocalNotification中,我们使用String str1 = "11,22,13,31,21,12"; String str2 = "11,12,13,21,22,31"; 之类的重复.....但我无法在iOS 10中找到UserNotification doc ...我怎样才能使用NSCalendarUnitMinute重复iOS 10 NSCalendarUnitMinute

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

UserNotification

3 个答案:

答案 0 :(得分:2)

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

我遇到了类似的问题,下面是旧通知如何与新通知同时进行的示例。

为了更加安全,这是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()

因为这对我有用,所以应该对你们其他人来说。如果有问题,请尝试告诉我。

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

(可能,Apple没有考虑过这种情况,但可以处理)

  1. 安排晚上8:30的通知
  2. 触发通知后,将其删除,并为上面显示的NSCalendarUnitMinute等效项安排另一个使用不同标识符的通知。
  3. Voila,它的作品!! (或者不是吗?)

答案 1 :(得分:1)

使用UNCalendarNotificationTriggerDateComponents代替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 Documentation

请注意,Apple Docs中存在拼写错误(截至2013年6月13日)。如果您使用NSDateComponents代替DateComponents,则需要在date as DateComponents参数中明确地投射dateMatching

在回复您的评论时,我认为UNCalendarNotificationTrigger不支持您想要的行为(更改重复通知的频率)。

答案 2 :(得分:0)

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

我们需要在ios 10中为我们的应用程序提供1分钟的重复间隔,并将其用作新旧框架组合的变通方法。

  1. 使用旧的计划重复本地通知:

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

  2. 这将创建和安排通常重复的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. 响应操作和触发通知,操纵通知中心:
    2. 使用新框架UNUserNotificationCenter方法: willPresentNotification: didReceiveNotificationResponse:

      1. 请求授权和类别注册我以通常的方式为两个框架做了。
      2. 希望这有帮助