volumen una suena sonido posponer poner musica editar con como cancion alarma ios audio swift alarm

ios - una - mi alarma no suena iphone



iOs 8, comienza a reproducir el sonido cuando está en el fondo, aplicación de despertador (1)

Sé que hay muchas preguntas sobre SOF, pero esta es la más "nueva". La cuestión es que estoy tratando de crear y alarmar la aplicación, y sé de hecho que hay aplicaciones de alarma que funcionan perfectamente (de alguna manera), incluso si la aplicación no se está ejecutando y está en segundo plano.

Mi pregunta es: ¿cómo empiezas a reproducir el sonido una vez que tu aplicación ya está en segundo plano?

UILocalNotification es excelente, pero solo obtendrás la application:(_:didReceiveLocalNotification:) después de que el usuario haya hecho clic en tu notificación, por lo que reproducir el sonido con AVAudioPlayer no funcionó, quiero reproducir el sonido independientemente del tiempo en que el usuario haga clic en él o no. Por supuesto, con los Required background modes: App plays audio or streams audio/video using AirPlay en info.plist ya configurado. Una vez que la música comienza a reproducirse, sigue sonando incluso si voy al fondo.

No quiero usar el sonido UILocalNotificaation porque tiene un límite de 30 segundos y solo puede reproducir los sonidos que se incluyen con la aplicación.

¿Alguna idea? pensamientos?

Código de muestra:

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

el código anterior se llama cuando el usuario selecciona y alarma y hace clic en guardar.

y esto es lo que está sucediendo en 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") }

Debes mantener una fuerte referencia al AVAudioPlayer cierto, para que no se libere, y el audioplayer.play() no jugará nada ...


Finalmente, logré hacerlo 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() }

y en otro lugar se sincroniza una UILocalNotification con este temporizador, para una buena experiencia de usuario.

Aunque no estoy seguro de si esto pasaría por Apple, pero no veo ninguna razón por la que no: /