如何在背景中的特定日期时间在swift中运行任务,无论应用程序是打开还是关闭

时间:2016-12-02 10:44:24

标签: ios iphone swift background-process uilocalnotification

我正在处理警报应用程序,我需要在特定时间安排警报,我使用scheduleLocalNotification来安排警报,并且它可以正常工作。 但是我需要在触发警报之前运行到我的API服务器的请求。在该请求中,我想检查从API服务器返回的一些参数,如果满足某些条件。

如果任何人有一个在特定日期运行的方法 - 时间在swift中 请帮帮我

 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 :(得分:2)

无法通过本地通知唤醒应用,这仅适用于远程通知。根据{{​​3}}:

  

远程通知到达时,系统会处理用户   通常在应用程序处于后台时进行交互。它也是   将通知有效负载传递给   应用:didReceiveRemoteNotification:fetchCompletionHandler:   iOS和tvOS中app委托的方法

但仍有一个问题;即便如此,根据didReceiveRemoteNotification:fetchCompletionHandler: Notification Programming Guide,我们无法保证应用会启动:

  

但是,如果是用户,系统会自动启动您的应用   强行退出。在这种情况下,用户必须重新启动您的应用   或在系统尝试启动您的应用程序之前重新启动设备   再次自动。

我认为没有一种保证可以在稍后的某个时刻安排执行块的方法,与当时应用程序的状态无关。根据您的具体要求和频率,您可以注册fetch后台模式并实施application:performFetchWithCompletionHandler:documentation。最后一点:确保您是一个负责任的后台应用程序(根据我的经验,Apple认真对待此要求)