2014-07-15 31 views
13

Ben SOF üzerinde birçok soru var biliyorum, ama bu "yeni" bir olduğunda sesi çalmaya başlar. Sorun şu ki, uygulama yaratmaya çalışıyorum ve alarm uygulaması var. Bildiğim kadarıyla, uygulama çalışmıyor olsa ve arka planda olsa bile, mükemmel bir şekilde çalışan alarm uygulamaları var.iOS 8, arka planda çalar saat uygulaması

Soruma sorum: uygulamanızın arka planda zaten çaldıktan sonra sesini çalmaya nasıl başladınız?

UILocalNotification harika, ancak kullanıcı zaten bildiriminizi tıkladıktan sonra yalnızca application:(_:didReceiveLocalNotification:) alırsınız, bu nedenle AVAudioPlayer kullanarak ses çalmadı, kullanıcının onu tıklattığına bakılmaksızın ses çalmak isterim veya çalışmıyor ' t. Elbette info.plist'da Required background modes: App plays audio or streams audio/video using AirPlay ile ayarlanmış. Müzik çalmaya başladığında, arka plana gidersem bile oynamaya devam eder.

Ben 30 saniye ve uygulama ile birlikte gelen sesleri çalmak için sadece edebilmek için sınırlı coz UILocalNotificaation sesi kullanmak istemiyoruz.

Herhangi bir yorumlara? düşünceler

örnek kod:

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

kullanıcı seçer ve alarm ve tıklama kaydederken Yukarıdaki kod çağrılır. ...

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") 


} 

Sen btw AVAudioPlayer için güçlü bir referans tutmak gerekir, bu yüzden serbest olsun olmayacak ve audioplayer.play() şey yapmaz:

ve burada AppDelegate içinde olup bitenler

+0

\ uygulama didreceivelocalnotification' sonra çağrılmalıdır 'arka planda ise: Bu elma üzerinden gideceğini, ama neden değil mi herhangi bir neden görmüyorum eğer emin değilim rağmen

bildirim atıldı. Belki sesi çalmak için kodunuzu buraya koyabilirsiniz. – Chris

+0

Birçok kez denedim, öyle değil, sadece kullanıcı bildirimi tıkladıktan sonra kovulur. Yine de sorumu düzenleyeceğim. – Nour1991

cevap

9

Son olarak, NSTimer ile yapmak başardı.

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() 
} 

ve başka bir yerde bir UILocalNotification iyi bir kullanıcı deneyimi için, bu zamanlayıcı ile senkronize edilir.

+0

Uygulama, bu kod aracılığıyla arka planda olduğunda ses çalmaya başlayabilirsiniz? – somedev

+0

evet, birisi bu teyit edebilir olmadığını bilmek isteriz, henüz saklamak için uygulaması yayınlamak vermedi ... o benim için çalıştı, bunu deneyebilirsiniz .. – Nour1991

+7

çalıştığını yok neden çözemiyorum. Uygulama arka planda çalışıyorsa, genellikle birkaç dakika sonra askıya alınır. Böylece, zamanlayıcı askıya alınmış durumda ise, zamanlayıcı playAlarm() öğesini başlatmaz. – somedev

İlgili konular