Start playing sound in background on iOS?

后端 未结 2 1757
渐次进展
渐次进展 2021-01-02 21:29

I\'m trying to do something similar to Tile.app. When it shows a notification, it plays a sound. That seems simple enough-- use UILocalNotification and include

2条回答
  •  离开以前
    2021-01-02 21:34

    Actually you can use one of AudioServices... functions

    • AudioServicesPlaySystemSound
    • AudioServicesPlayAlertSound
    • AudioServicesPlaySystemSoundWithCompletion

    to start playing sound in background.

    I'm not sure about length of sound that can be submitted to AudioServicesCreateSystemSoundID because I'm checked only with short looped sound for ringing but this API not tied to notification so possible can overpass 30 second limit.

    EDIT: App still requires audio in UIBackgroundModes to play in background

    Cut from my test project appDelegate, iOS 9.3.1

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // test sound in foreground.
        registerAndPlaySound()
    
        return true
    }
    
    func applicationDidEnterBackground(application: UIApplication) {
        var task =  UIBackgroundTaskInvalid
        task = application.beginBackgroundTaskWithName("time for music") {
            application.endBackgroundTask(task)
        }
        // dispatch not required, it's just to simulate "deeper" background  
        let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(5 * Double(NSEC_PER_SEC)))
    
        dispatch_after(delayTime, dispatch_get_main_queue()) {
            self.registerAndPlaySound()
        }
    }
    
    func registerAndPlaySound() {
        var soundId: SystemSoundID = 0
    
        let bundle = NSBundle.mainBundle()
        guard let soundUrl = bundle.URLForResource("InboundCallRing", withExtension: "wav") else {
            return
        }
        AudioServicesCreateSystemSoundID(soundUrl, &soundId)
    
        AudioServicesPlayAlertSound(soundId)
    }
    

    Update

    There I used beginBackgroundTask to start sound only as simplest way to execute code in background in another project similar code to registerAndPlaySound was called from PushKit callback without background task.

提交回复
热议问题