2014-07-15 13 views
13

So che ci sono molte domande su SOF, ma questa è la "più nuova". Il fatto è che sto cercando di creare un'app di allarme e so per certo che ci sono app di allarme che funzionano perfettamente (in qualche modo), anche se l'app non è in esecuzione e si trova in background.iOs 8, avvia la riproduzione del suono quando sullo sfondo, sveglia app

La mia domanda è: come si inizia a riprodurre il suono dopo l'app è già in background ??

UILocalNotification è grande, ma si otterrà solo application:(_:didReceiveLocalNotification:) dopo che l'utente ha già fatto clic sul vostro notifica, in modo da giocare il suono usando AVAudioPlayer non ha funzionato, voglio giocare il suono indipendentemente resistere l'utente fa clic su di esso o doesn' t. Naturalmente con Required background modes: App plays audio or streams audio/video using AirPlay in info.plist già impostato. Una volta che la musica inizia a suonare, continua a suonare anche se vado in background.

Non voglio usare UILocalNotificaation coz è limitato a 30 secondi e solo in grado di riprodurre i suoni che sono in bundle con l'applicazione.

Eventuali approfondimenti? pensieri ??

codice di esempio:

var notif = UILocalNotification() 
    notif.fireDate = self.datePicker.date 
    notif.alertBody = "test" 
    UIApplication.sharedApplication().scheduleLocalNotification(notif) 

il codice di cui sopra viene chiamato quando l'utente seleziona e allarme e fa clic su Salva.

e qui è quello che sta accadendo in AppDelegate:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool { 
    NSLog("launched") 
    application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: UIUserNotificationType.Sound | UIUserNotificationType.Alert | 
     UIUserNotificationType.Badge, categories: nil 
     )) 
    AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: nil) 
    AVAudioSession.sharedInstance().setActive(true, error: nil) 

    self.sound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("sound", ofType: "caf")) 
    self.audioPlayer = AVAudioPlayer(contentsOfURL: sound, error: nil) 

    return true 
} 

func application(application: UIApplication!, didReceiveLocalNotification notification: UILocalNotification!){ 
    audioPlayer.play() 
    NSLog("received local notif") 


} 

È necessario tenere un forte riferimento alla AVAudioPlayer btw, in modo da non ottenere rilasciato, e il audioplayer.play() non farà nulla ...

+0

se la vostra applicazione è in background, 'didreceivelocalnotification' dovrebbe essere chiamato dopo la notifica licenziata. Forse puoi inserire il tuo codice laggiù per riprodurre il suono. – Chris

+0

l'ho provato molte volte, non lo fa, viene generato solo dopo che l'utente ha effettivamente cliccato sulla notifica. Modificherò comunque la mia domanda. – Nour1991

risposta

9

Infine, sono riuscito a farlo con NSTimer.

func applicationWillResignActive(application: UIApplication) { 
    var timer = NSTimer(fireDate: NSDate(timeIntervalSinceNow: 20), interval: 60.0, target: self, selector: Selector("playAlarm"), userInfo: nil, repeats: false) 
    NSRunLoop.currentRunLoop().addTimer(timer, forMode: NSDefaultRunLoopMode) 
} 
func playAlarm() { 
    self.sound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("sound", ofType: "caf")) 
    self.audioPlayer = AVAudioPlayer(contentsOfURL: sound, error: nil) 
    audioPlayer.play() 
} 

e da qualche altra parte un UILocalNotification è sincronizzato con questo timer, per una buona esperienza utente.

Anche se non sono sicuro se questo sarebbe passare attraverso mela, ma non vedo alcuna ragione per cui non sarebbe: \

+0

Quindi, puoi iniziare a riprodurre il suono quando l'app è in background tramite questo codice? – somedev

+0

sì, puoi provarlo, ha funzionato per me ... non ha ancora pubblicato app per l'archiviazione, mi piacerebbe sapere se qualcuno può confermare questo .. – Nour1991

+7

Non riesco a capire perché funziona. Se l'app viene eseguita in background, in genere viene sospesa dopo pochi minuti. Quindi, il timer non attiverà playAlarm() se l'app è in sospeso. – somedev