2016-12-02 2 views
5

Я работаю над приложением для аварийных сигналов, мне нужно запланировать будильник в определенное время, я использую scheduleLocalNotification для планирования аварийных сигналов, и он работает нормально как я хочу. BUT Перед запуском будильника мне нужно выполнить запрос на сервер API. В этом запросе я хочу проверить некоторые параметры, возвращаемые с сервера API, если это удовлетворяет некоторому условию.Как запустить задачу в режиме быстрой установки в определенное время в фоновом режиме, либо приложение включено или выключено

Если какой-либо один есть метод, который работать на конкретную дату - время быстрой Пожалуйста, помогите мне для этого

func addAlarm (newAlarm: Alarm) { 
    // Create persistent dictionary of data 
    var alarmDictionary = NSUserDefaults.standardUserDefaults().dictionaryForKey(ALARMS_KEY) ?? Dictionary() 
    // Copy alarm object into persistent data 
    alarmDictionary[newAlarm.UUID] = newAlarm.toDictionary() 
    // Save or overwrite data 
    NSUserDefaults.standardUserDefaults().setObject(alarmDictionary, forKey: ALARMS_KEY) 

    scheduleNotification(newAlarm, category: "ALARM_CATEGORY") 
    scheduleNotification(newAlarm, category: "FOLLOWUP_CATEGORY") 

} 

    /* NOTIFICATION FUNCTIONS */ 
func scheduleNotification (alarm: Alarm, category: String) { 
    let notification = UILocalNotification() 
    notification.category = category 
    notification.repeatInterval = NSCalendarUnit.Day 
    switch category { 
    case "ALARM_CATEGORY": 
     notification.userInfo = ["UUID": alarm.UUID] 
     notification.alertBody = "Time to wake up!" 
     notification.fireDate = alarm.wakeup 
     notification.timeZone = NSTimeZone.localTimeZone() 
     notification.soundName = "loud_alarm.caf" 
     break 
    case "FOLLOWUP_CATEGORY": 
     notification.userInfo = ["UUID": alarm.followupID] 
     notification.alertBody = "Did you arrive yet?" 
     notification.fireDate = alarm.arrival 
     notification.timeZone = NSTimeZone.localTimeZone() 
     notification.soundName = UILocalNotificationDefaultSoundName 
     break 
    default: 
     print("ERROR SCHEDULING NOTIFICATION") 
     return 
    } 
    print("Notification=\(notification)") 
    // For debugging purposes 
    if alarm.isActive { 
     UIApplication.sharedApplication().scheduleLocalNotification(notification) 
    } 
} 
+1

К сожалению, локальные уведомления не могут быть тихими, но только удаленные уведомления. Мой совет для вас заключается в том, чтобы реализовать средство уведомления на вашем сервере, чтобы пользователь сообщал серверу, когда он хочет, чтобы их сигнал тревоги был, и сервер запускает метод в то время, выполняет проверки, которые вы хотите, если они передают отправляет удаленный уведомление устройства, вызывающего тревогу. –

+0

@JacobKing Спасибо за ваш совет, позвольте мне подождать некоторое время, На самом деле я хочу функцию, которая запускается в фоновом режиме в заданный период времени. если у кого-то есть идея, я подожду какое-то время. если я не получил какой-либо способный ответ, тогда я его реализую на сервере. –

ответ

2

Проснувшись приложение через местное уведомление не представляется возможным, это доступно только для удаленные уведомления. Согласно Notification Programming Guide:

При поступлении уведомления дистанционного, система обрабатывает пользователь взаимодействий обычно, когда приложение работает в фоновом режиме. Он также обеспечивает полезную нагрузку уведомления в применение: didReceiveRemoteNotification: fetchCompletionHandler: метод приложения делегата прошивки и tvOS

Но есть еще улов; даже тогда это не гарантирует, что приложение будет запущено, поскольку, согласно didReceiveRemoteNotification:fetchCompletionHandler:documentation:

Однако система делает не автоматически запускать приложение если пользователь имеет силу, бросить его. В этой ситуации пользователь должен перезапустить приложение или перезапустить устройство, прежде чем система снова запустит ваше приложение .

Я не думаю, что есть гарантированный способ запланировать блок для выполнения в какой-то более поздний момент, независимо от состояния приложения в то время. В зависимости от ваших конкретных требований и частоты вы можете зарегистрироваться в фоновом режиме fetch и реализовать application:performFetchWithCompletionHandler: до opportunistically fetch and validate server data. Последнее примечание: убедитесь, что вы являетесь ответственным фоновым приложением (по моему опыту Apple серьезно относится к этому требованию)

+0

Благодарим за отзыв, это полностью означает, что нет возможности просыпать приложение –

+1

@APKAPPS Это означает, что нет гарантированного способа сделать это в течение произвольного промежутка времени – spassas

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