ios - 去另一个 View Controller 后恢复音乐

标签 ios swift avfoundation

我正在尝试构建一个音乐应用程序。当我留在音乐 View Controller 中时,音乐正在播放。我还设置了音乐背景模式。音乐正在背景模式下播放,但是当我转到另一个 View Controller 时。音乐重新开始。问题是什么?

这是我的尝试

  //this is global variable 

    var player : AVPlayer?
    var playerItem:AVPlayerItem?

override func viewDidLoad() {
            super.viewDidLoad()
           musicplayer()
           play()
    }



 func musicplayer(){

        do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSessionPortOverride.speaker)
            print("AVAudioSession Category Playback OK")
            do {
                try AVAudioSession.sharedInstance().setActive(true)

                print("AVAudioSession is Active")

            } catch let error as NSError {
                print(error.localizedDescription)
            }
        } catch let error as NSError {
            print(error.localizedDescription)
        }


    }

这是我的播放器

    func play(){
    let musicUrl = totalAlbumList[myIndex].audiofile
            if let mm = musicUrl {
                var url: URL!
                url = URL(string: mm)
                playerItem = AVPlayerItem(url: url)
                player = AVPlayer(playerItem: playerItem)
                player?.volume = 1.0
                player?.rate = 1.0
                player?.play()

}

最佳答案

如果你想在所有类中播放音乐,只需将你的 AVPlayer 和所有与播放器相关的代码放在单例类中。

只有当应用程序处于后台模式并且您的 UIViewController 正在运行时,后台模式才有用。 使用下面的类来播放音乐。

//
//  MusicPlayer.swift
//  MusicPlayer
//
//  Created by Lakhwinder Singh on 11/09/17.
//  Copyright © 2017 lakh. All rights reserved.
//

import UIKit
import AVFoundation

class MusicPlayer: NSObject {

    //Constant varialbe of class
    static let player = MusicPlayer()

    //this is global variable
    var player : AVPlayer?
    var playerItem:AVPlayerItem?

    func initPlayer(){
        do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSessionPortOverride.speaker)
            print("AVAudioSession Category Playback OK")
            do {
                try AVAudioSession.sharedInstance().setActive(true)

                print("AVAudioSession is Active")

            } catch let error as NSError {
                print(error.localizedDescription)
            }
        } catch let error as NSError {
            print(error.localizedDescription)
        }
    }

    func playMusic(_ musicUrl: String?) {
        if let mm = musicUrl {
            var url: URL!
            url = URL(string: mm)
            playerItem = AVPlayerItem(url: url)
            player = AVPlayer(playerItem: playerItem)
            player?.volume = 1.0
            player?.rate = 1.0
            player?.play()
        }
    }

}

只需在您的 AppDelegate 中调用以下代码来初始化播放器。

   func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        MusicPlayer.player.initPlayer()
        return true
    }

并在您的类(class)中使用此代码。

MusicPlayer.player.playMusic(totalAlbumList[myIndex].audiofile)

关于ios - 去另一个 View Controller 后恢复音乐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46157538/

相关文章:

ios - 在 UIViewController 上执行的 UIView 上动态创建 UIButton AddTarget

iphone - 在 iOS 中播放简单音效的最佳方式

xcode - Firebase 提供商数据

ios - 向上动画但不填满屏幕的 View

ios - AVFoundation、AVCaptureMetadataOutput 截屏

ios - 为什么 Apple 向我发送消息说我的应用程序不支持 Ipv6?

ios - 在手动关闭 View 之前如何将数据转发到协议(protocol)?

swift - 如何在 swift 中将背景图像设置为按钮(单击按钮时)

ios - 无缝循环 AVPlayer

iphone - 使用 AVFoundation 捕获视频不会捕获任何音频