swift: приложение чата - аудиоплеер в клетках - PullRequest
0 голосов
/ 29 апреля 2018

Мое приложение позволяет пользователям отправлять аудио, как в обычном приложении обмена сообщениями. Проблема в том, что каждый раз, когда приходит новое сообщение, и поэтому я обновляю свой collectionView, звук останавливается.

Прямо сейчас у меня есть AVPlayer в самой ячейке сообщения.

Есть ли какой-нибудь лучший способ и как я могу гарантировать, что звук не перестанет воспроизводиться при обновлении collectionView?

Ответы [ 2 ]

0 голосов
/ 15 июня 2018

Решение было довольно простым. Так как я перезагружал полную коллекцию ViewView

DispatchQueue.main.async{
   self.collectionView.reloadData()
   (...)
}

Эта проблема должна была возникнуть. Я решил эту проблему, просто вставляя новые ячейки или перезагружая определенные ячейки, а не перезагружая весь collectionView.

0 голосов
/ 30 апреля 2018

Вы можете объявить своего игрока таким:

import UIKit
import AVFoundation
import MediaToolbox
import MediaPlayer

class MusicPlayer: NSObject {

    static let player = MusicPlayer()

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

    func initPlayer(){
        do {
            UIApplication.shared.beginReceivingRemoteControlEvents()
            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 {

    MusicPlayer.player.initPlayer()


    return true
}

После этого игрок использует вот так

MusicPlayer.player.playMusic(YourFile)
...