ios 如何使用Swift在后台播放音频?

zsohkypk  于 12个月前  发布在  iOS
关注(0)|答案(5)|浏览(119)

如你所见,我正在播放音频广播。但是当我按下Home键并退出应用程序时,流媒体停止或我听不到。如何在后台继续播放并从锁定屏幕收听?
ViewController.Swift

import UIKit
import AVFoundation
import MediaPlayer
import GoogleMobileAds

    class ViewController: UIViewController, GADInterstitialDelegate {
    
        @IBOutlet weak var exitMapButton: UIButton!
        @IBOutlet weak var radarMap: UIWebView!
        var interstitial: GADInterstitial!
        func createAndLoadInterstitial() -> GADInterstitial {
            var interstitial = GADInterstitial(adUnitID: "adUnitID-XXXX")
            interstitial.delegate = self
            interstitial.loadRequest(GADRequest())
            return interstitial
        }
        
        func getAd(){
            if (self.interstitial.isReady)
            {
                self.interstitial.presentFromRootViewController(self)
                self.interstitial = self.createAndLoadInterstitial()
            }
        }
        @IBOutlet weak var ataturkButton: UIButton!
        @IBOutlet weak var sabihaButton: UIButton!
        @IBOutlet weak var esenbogaButton: UIButton!
        @IBOutlet weak var weatherButton: UIButton!
        @IBOutlet weak var statusLabel: UILabel!
        @IBOutlet weak var playButton: UIButton!
        @IBOutlet weak var webViewButton: UIButton!
        var googleBannerView: GADBannerView!
override func viewDidLoad() {
            super.viewDidLoad()
        }
class PlayerAv {
            var audioLink: String?
            var player: AVPlayer
            init(link: String) {
                self.audioLink = link
                self.player = AVPlayer(URL: NSURL(string: link))
            }
        }
        var myPlayer = PlayerAv(link: "http://somewebsite.com/abc.pls")
        var setTowerState = ""
        
        @IBAction func sliderValueChanged(sender: UISlider) {
            var currentValue = Float(sender.value)
            println(currentValue)
            myPlayer.player.volume = currentValue
        }
        @IBAction func getWeatherWindow(sender: AnyObject) {
            UIApplication.sharedApplication().openURL(NSURL(string: "http://somewebpage.com")!)
            println("Directed to weather page")
        }
        @IBAction func changeToAtaturk() {
            myPlayer.player.pause()
            myPlayer = PlayerAv(link: "http://somewebsite.com/abc.pls")
            myPlayer.audioLink == ""
            println("\(myPlayer.audioLink!)--a")
            playButton.setTitle("Pause", forState: UIControlState.Normal)
            myPlayer.player.play()
            setTowerState = "ataturk"
            statusLabel.text = "Status: Playing, LTBA"
        }
        @IBAction func changeToEsenboga() {
            myPlayer.player.pause()
            myPlayer = PlayerAv(link: "http://somewebsite.com/def.pls")
            println("\(myPlayer.audioLink!)--a")
            playButton.setTitle("Pause", forState: UIControlState.Normal)
            myPlayer.player.play()
            setTowerState = "esenboga"
            statusLabel.text = "Status: Playing, LTAC"
        }
        @IBAction func changeToSabiha() {
            myPlayer.player.pause()
            myPlayer = PlayerAv(link: "http://somewebsite.com/efg.pls")
            println("\(myPlayer.audioLink!)--a")
            playButton.setTitle("Pause", forState: UIControlState.Normal)
            myPlayer.player.play()
            setTowerState = "sabiha"
            statusLabel.text = "Status: Playing, LTFJ"
        }
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
        @IBAction func playButtonPressed(sender: AnyObject) {
            toggle()
        }
        func toggle() {
            if playButton.titleLabel?.text == "Play" {
                playRadio()
                println("Playing")
                statusLabel.text = "Status: Playing"
            } else {
                pauseRadio()
                println("Paused")
                statusLabel.text = "Status: Paused"
            }
        }
        func playRadio() {
            myPlayer.player.play()
            playButton.setTitle("Pause", forState: UIControlState.Normal)   
        }
        func pauseRadio() {
            myPlayer.player.pause()
            playButton.setTitle("Play", forState: UIControlState.Normal)
        }
    }
webghufk

webghufk1#

您需要设置应用功能背景模式(音频和AirPlay),并将AVAudioSession类别设置为AVAudioSessionCategoryPlayback并将其设置为活动状态

来自Xcode 11.4 · Swift 5.2

do {
    try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [.mixWithOthers, .allowAirPlay])
    print("Playback OK")
    try AVAudioSession.sharedInstance().setActive(true)
    print("Session is Active")
} catch {
    print(error)
}

xeufq47z

xeufq47z2#

Xcode 10.2.1*Swift 4

请在您的AppDelegate中添加以下代码

func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
        do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, mode: AVAudioSessionModeDefault, options: [.mixWithOthers, .allowAirPlay])
            print("Playback OK")
            try AVAudioSession.sharedInstance().setActive(true)
            print("Session is Active")
        } catch {
            print(error)
        }
        return true
    }

**注意:-**请根据需要配置 * 选项 *。例如,要在播放视频文件时停止背景音频,

options: [.allowAirPlay, .defaultToSpeaker]

不要忘记在背景模式下启用音频和airplay x1c 0d1x

mlnl4t2r

mlnl4t2r3#

仅粘贴视图Didload

let path = Bundle.main.path(forResource:"Bismallah", ofType: "mp3")

    do{
        try playerr = AVAudioPlayer(contentsOf: URL(fileURLWithPath: path!))
    } catch {
        print("File is not Loaded")
    }
    let session = AVAudioSession.sharedInstance()
    do{
        try session.setCategory(AVAudioSessionCategoryPlayback)
    }
    catch{
    }

    player.play()
jc3wubiy

jc3wubiy4#

Swift 5 Xcode 11.2.1
在初始化AudioPlayer的地方添加此代码。

audioPlayer.delegate = self
audioPlayer.prepareToPlay()
let audioSession = AVAudioSession.sharedInstance()
do{
    try audioSession.setCategory(AVAudioSession.Category.playback)
}
catch{
    fatalError("playback failed")
}
jgzswidk

jgzswidk5#

解决方案:
第一步:更新Info.plist

在您的Info.plist文件中,您正在为您的应用程序定义所需的后台模式。这些模式指示您的应用打算如何使用后台处理。

<array>
    <string>audio</string>
    <string>video</string>
</array>

*第二步: AppDelegate.m**更新

在AppDelegate.m文件中,您正在将音频会话配置为使用AVAudioSessionCategoryPlayback类别。此步骤对于确保音频播放在后台继续至关重要。

#import <AVFoundation/AVFoundation.h> // Import AVFoundation

  NSError *setCategoryError = nil;
  BOOL success = [[AVAudioSession sharedInstance] 
  setCategory:AVAudioSessionCategoryPlayback error:&setCategoryError];

  if (!success) {
    NSLog(@"Error setting audio session category: %@", setCategoryError);
  }

相关问题