Ich baue einen Trainings-Timer in meiner App. Workflow ist:Wie wird ein Sound/Vibrieren auf einem Timer wiedergegeben, wenn die App geschlossen wird, ohne eine Benachrichtigung zu senden?
- Benutzer trifft "Start Timer" Taste
- Timer zählt für 90 Sekunden
- Timer nach 90 Sekunden beendet und löst PlayAlertSound
Dies funktioniert nur vibrieren, wenn Die App ist geöffnet, und ich erwarte nicht, dass mein Nutzer meine App anschaut, wenn der Timer 0 erreicht. Ich kann eine Benachrichtigung senden, aber dann sende ich im Verlauf eines Trainings Dutzende von Benachrichtigungen. Persönlich mag ich nicht viele Benachrichtigungen von einer einzigen App. Es fühlt sich laut an.
Gibt es eine Möglichkeit, dass die App eine Vibration sendet, während die App geschlossen wird, ohne eine Benachrichtigung zu senden?
Ich habe versucht, nach Hintergrundressourcen zu fragen, also läuft mein Timer nach dem Schließen der App, aber selbst wenn der Timer weiterläuft, wird die Vibration nicht ausgelöst, bis ich die App öffne, dh der Benutzer muss suchen an ihrem Telefon.
Hier ist mein Code:
class TimerViewController: UIViewController {
@IBOutlet weak var startTimerButton: UIButton!
@IBOutlet weak var timerLabel: UILabel!
@IBOutlet weak var resetTimerButton: UIButton!
var timer = NSTimer()
let timeInterval:NSTimeInterval = 0.05
let timerEnd:NSTimeInterval = 90
var timeCount:NSTimeInterval = 0.0
var backgroundTaskIdentifier: UIBackgroundTaskIdentifier?
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func startTimerButtonTapped(sender: UIButton) {
backgroundTaskIdentifier = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({
UIApplication.sharedApplication().endBackgroundTask(self.backgroundTaskIdentifier!)
})
if !timer.valid {
timerLabel.text = timeString(timeCount)
timer = NSTimer.scheduledTimerWithTimeInterval(timeInterval,
target: self,
selector: #selector(TimerViewController.timerDidEnd(_:)),
userInfo: "Time is up!!",
repeats: true) //repeating timer in the second iteration
}
}
@IBAction func resetTimerButtonTapped(sender: UIButton) {
timer.invalidate()
resetTimeCount()
timerLabel.text = timeString(timeCount)
}
func resetTimeCount(){
timeCount = timerEnd
}
func timeString(time:NSTimeInterval) -> String {
let minutes = Int(time)/60
//let seconds = Int(time) % 60
let seconds = time - Double(minutes) * 60
let secondsFraction = seconds - Double(Int(seconds))
return String(format:"%02i:%02i.%02i",minutes,Int(seconds),Int(secondsFraction * 100.0))
}
func timerDidEnd(timer:NSTimer){
//timerLabel.text = timer.userInfo as? String
//timer that counts down
timeCount = timeCount - timeInterval
if timeCount <= 0 {
timerLabel.text = "Time is up!!"
timer.invalidate()
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate)
//pushNotification()
} else { //update the time on the clock if not reached
timerLabel.text = timeString(timeCount)
}
}
//
// func pushNotification() {
// let notification = UILocalNotification()
// notification.alertAction = "Go back to App"
// notification.alertBody = "This is a Notification!"
// notification.fireDate = NSDate(timeIntervalSinceNow: 1)
// UIApplication.sharedApplication().scheduleLocalNotification(notification)
// }
//
}