2017-01-28 4 views
1

Я недавно обновил свой проект до IOS 10, что вызвало любые локальные уведомления, которые я зарегистрировал, чтобы не срабатывать. Я попытался преобразовать локальное уведомление в уведомления пользователей, но он не имеет такого же эффекта. Вот оригинальный код, который я пытался преобразовать. В пределах viewDidLoad:Swift: преобразование локального уведомления в уведомление пользователя IOS 10

 guard let settings = UIApplication.shared.currentUserNotificationSettings else { return 
     } 
     if settings.types == UIUserNotificationType() { 
      let ac = UIAlertController(title: "Cant Schedule", message: "No Permission", preferredStyle: .alert) 
      ac.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) 
      present(ac, animated: true, completion: nil) 
      return 
     } 


     var dateComp: DateComponents = DateComponents() 
     dateComp.year = 2017; 
     dateComp.month = 01; 
     dateComp.day = 28; 
     dateComp.hour = 11; 
     dateComp.minute = 0; 
     (dateComp as NSDateComponents).timeZone = TimeZone.current 

     let calender:Calendar = Calendar(identifier: Calendar.Identifier.gregorian) 
     let date:Date = calender.date(from: dateComp)! 


     let notification = UILocalNotification() 
     notification.fireDate = date 
     notification.alertBody = "Notification!" 
     notification.alertAction = "You just Received a notification!" 
     notification.soundName = UILocalNotificationDefaultSoundName 
     notification.userInfo = ["customField1": "w00t"] 
     notification.repeatInterval = NSCalendar.Unit.weekOfYear 
     UIApplication.shared.scheduleLocalNotification(notification) 

Это вызвало местное уведомление для пожара в 11:00 каждую субботу.

Вот код, который я использовал, чтобы попытаться достичь того же эффекта в IOS 10:

func scheduleNotification(at date: Date) { 
let calendar = Calendar(identifier: .gregorian) 
let components = calendar.dateComponents(in: .current, from: date) 
let newComponents = DateComponents(calendar: calendar, timeZone: .current, month: components.month, day: components.day, hour: components.hour, minute: components.minute) 

let trigger = UNCalendarNotificationTrigger(dateMatching: newComponents, repeats: true) 

let content = UNMutableNotificationContent() 
content.title = "Notification" 
content.body = "You just Received a notification!" 
content.sound = UNNotificationSound.default() 

let request = UNNotificationRequest(identifier: "textNotification", content: content, trigger: trigger) 


UNUserNotificationCenter.current().add(request) {(error) in 
    if let error = error { 
     print("Error") 
    } 
} 
} 

В viewDidLoad:

UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound]) {(accepted, error) in 
    if !accepted { 
     print("Error") 
    } 
} 

Этот код работает нормально, если пользователь выбирает дату с помощью datePicker, но я не могу понять, как программно установить дату уведомления на ту же дату, что и в местном уведомлении (2017-28-01 11:00), а также о том, как сделать уведомление огнем каждую неделю в то же время, когда нет свойства repeatInterval.

+0

«Как предупредить огонь каждую неделю в одно и то же время»: http://stackoverflow.com/a/40856269/341994 – matt

+0

Спасибо. Не могли бы вы объяснить, как вы могли указывать, например, в понедельник в 11:00? Я не совсем понимаю, как вы будете передавать эту информацию только в переменную. –

+0

Компоненты даты с часами 11 и рабочим днем ​​2 – matt

ответ

1

Не могли бы вы объяснить, как вы могли бы указать только, например, понедельник в 11:00

Это просто вопрос того, чтобы оставить все, что не относится к многократному значению. Таким образом, в вашем случае вы хотите указать компоненты даты hour:11 и weekday:2 и ничего больше.

Чтобы понять, как это работает, запустите в детской площадке:

let dc = DateComponents(hour:11, weekday:2) 
let greg = Calendar(identifier: .gregorian) 
let d = greg.nextDate(after: Date(), matching: dc, matchingPolicy:.nextTime) 

Вы увидите, что d это приходит понедельник в 11 утра.

Это именно то, что UNNotificationTrigger будет делать, чтобы выяснить, когда отправить это уведомление.

Теперь, если вы также указали, что это триггер repeats, вы только что указали каждые Понедельник в 11:00.

+0

Спасибо за помощь! –