2016-10-30 9 views
1

Итак, я в настоящее время создаю приложение расписания, и я пытаюсь создать локальное уведомление для запуска в определенное время в определенный день недели, каждую неделю , Поэтому первое, что я делаю, это получить значение даты начала времени события, затем я вычитаю 5 минут от значения времени начала и затем планирую уведомление. Раньше это было очень легко просто нужно было набрать: notification.repeatInterval = CalendarUnit.WeekOfYear но теперь команда осуждается в Swift 3 и да, так что единственный способ я нашел:Планирование еженедельного повторяющегося локального уведомления с датой срабатывания даты с даты выбора в Swift 3

let someMinutesEarlier = Calendar.current.date(byAdding: .minute, value: -5, to: startTimePicker.date) 

     let contentOfNotification = UNMutableNotificationContent() 

     let interval = someMinutesEarlier?.timeIntervalSinceNow 

     contentOfNotification.title = "Event starting" 
     contentOfNotification.body = "Some notes" 
     contentOfNotification.sound = UNNotificationSound.default() 

     let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: interval!, repeats: true) 
     let request = UNNotificationRequest.init(identifier: notificationIdentifier, content: contentOfNotification, trigger: trigger) 

     let center = UNUserNotificationCenter.current() 
     center.add(request) { (error) in 
      print(error as Any) 
     } 

, но это только графики уведомления только один раз (независимо от того, что для параметра repeat boolean установлено значение true), из-за года в someMinutesEarlier ... или это может быть что-то еще? Есть идеи?

+0

Почему бы вам не использовать UNCalendarNotificationTrigger? – McNight

+0

Вы ориентируетесь на версии раньше, чем ios10 или ios10? Если вы хотите, чтобы ваше приложение запускалось в версиях раньше 10, я бы, вероятно, придерживался устаревшего подхода на данный момент. В противном случае вам нужно будет написать обе версии и использовать 'available' – Paulw11

ответ

3

Как упоминалось McNight, вы можете использовать UNCalendarNotificationTrigger так:

let interval = 60 * 60 * 24 * 7 - 300 // One week minus 5 minutes. 
let alarmTime = Calendar.current.date(byAdding: .second, value: interval, to: Date())! 
let components = Calendar.current.dateComponents([.weekday, .hour, .minute], from: alarmTime) 
let trigger = UNCalendarNotificationTrigger(dateMatching: components, repeats: true) 

(я не проверял этот код, но это должно получить Вас на правильном пути).

Дополнительная информация here.

Редактировать: Исправлен расчет временных интервалов, предложенный SwiftyCruz.

Редактировать 2: Обновлено для использования Календаря для выполнения сдвига во времени, как это было предложено RickiG.

+0

Я думаю, что добавленное время должно быть 60 * (60 * 24 * 7 - 5) или 60 * 60 * 24 * 7 - 300 – Cruz

+0

Спасибо! Да, конечно, UICalendarNotificationTrigger ... такая простая, но необходимая помощь. Спасибо всем, а также спасибо Paulw11. Я бы подумал об этом, но в основном я использую новый Swift 3 из-за идентификаторов уведомлений. –

+0

Пока вы довольны ios10, это лучший подход. – Paulw11

0

// Swift2.3

func setLNotification(weekDay:Int , hour:Int, min:Int, second:Int, alertBody:String, type:String, isRepeate:Bool){ 

    let calender = NSCalendar(identifier: NSCalendarIdentifierGregorian) 
    let dateComp: NSDateComponents? 

    dateComp = calender?.components([.Year,.WeekOfMonth,.Month], fromDate: NSDate()) 
    dateComp?.hour = hour 
    dateComp?.minute = min 
    dateComp?.second = 00 
    dateComp?.weekday = weekDay 
    dateComp!.timeZone = NSTimeZone.localTimeZone() 

    print(calender?.dateFromComponents(dateComp!)) 


    let SetCustomDate = calender?.dateFromComponents(dateComp!) 

    print(SetCustomDate) 

    let notification = UILocalNotification() 
    if isRepeate == true{ 

     switch type { 
     case "Weekly": 

      notification.fireDate = SetCustomDate!.dateByAddingTimeInterval(60*60*24*7) 
      notification.repeatInterval = NSCalendarUnit.Weekday 

     case "2 Weekly": 

      notification.fireDate = SetCustomDate!.dateByAddingTimeInterval(60*60*24*14) 
      notification.repeatInterval = NSCalendarUnit.Day 
     case "Monthly": 
      notification.fireDate = SetCustomDate!.dateByAddingTimeInterval(60*60*24*28) 
      notification.repeatInterval = NSCalendarUnit.Day 

     default: 
      break; 
     } 

     notification.soundName = UILocalNotificationDefaultSoundName 
     notification.repeatCalendar = calender 
    } 
    notification.alertTitle = "STATS" 
    notification.alertBody = "Please update your Stats detail" 
    notification.userInfo = ["uid":"reminder"] 

    print(notification) 

    UIApplication.sharedApplication().scheduleLocalNotification(notification) 



} 

 Смежные вопросы

  • Нет связанных вопросов^_^