2016-05-13 2 views
0

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?

  1. Benutzer trifft "Start Timer" Taste
  2. Timer zählt für 90 Sekunden
  3. 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) 
// } 
//  

} 

Antwort

0

Leider möglich, es ist nicht Ihre App aufwachen, wenn eine lokale Benachrichtigung empfangen wird - und das ist eine gute Sache, sonst wäre es viel missbraucht werden.

Aber Sie können Audio im Hintergrund wie folgt spielen: How to Play Audio in Background Swift?

Versuchen 90 Sekunden Stille zu spielen, und dann Alarmton spielen.

Verwandte Themen