2015-11-12 4 views
4

У меня есть следующий код, который загружает видео и пеет его. Однако при нажатии на дом и возвращении в приложение видео зависает и не будет воспроизводиться снова. Я чувствую, что ответ есть в функциях AppDelegate, но не может заставить их работать.AVPlayer Freezes однажды перемещен на задний план

import UIKit 
import AVKit 
import AVFoundation 



class ViewController: UIViewController, UIApplicationDelegate { 



var videoPlayer: AVPlayer! 
var playerLayer: AVPlayerLayer? 



override func viewDidLoad() { 
    super.viewDidLoad() 
    let path = NSBundle.mainBundle().pathForResource("video", ofType:"mp4") 
    let url = NSURL(fileURLWithPath: path!) 
    let playerItem = AVPlayerItem(URL: url) 

    self.videoPlayer = AVPlayer(playerItem: playerItem) 
    self.playerLayer = AVPlayerLayer(player: self.videoPlayer) 
    self.playerLayer!.frame = self.view.frame 
    self.videoPlayer!.play() 

    self.view.layer.addSublayer(self.playerLayer!) 


    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("playerDidReachEnd:"), name: AVPlayerItemDidPlayToEndTimeNotification, object:nil) 
} 


func playerDidReachEnd(notification: NSNotification) { 
    self.videoPlayer.seekToTime(kCMTimeZero) 
    self.videoPlayer.play() 
} 


func applicationWillResignActive(application: UIApplication) { 
    videoPlayer.pause() 
} 


func applicationDidBecomeActive(application: UIApplication) { 
    videoPlayer.play() 
} 


func applicationDidEnterBackground(application: UIApplication) { 
    videoPlayer.pause() 
} 


func applicationWillEnterForeground(application: UIApplication) { 
    videoPlayer.play() 
} 





override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 



} 

Вот что я использовал для его исправления.

import UIKit 
import AVKit 
import AVFoundation 



class ViewController: UIViewController, UIApplicationDelegate { 



var videoPlayer: AVPlayer! 
var playerLayer: AVPlayerLayer? 



override func viewDidLoad() { 
    super.viewDidLoad() 
    let path = NSBundle.mainBundle().pathForResource("video", ofType:"mp4") 
    let url = NSURL(fileURLWithPath: path!) 
    let playerItem = AVPlayerItem(URL: url) 

    self.videoPlayer = AVPlayer(playerItem: playerItem) 
    self.playerLayer = AVPlayerLayer(player: self.videoPlayer) 
    self.playerLayer!.frame = self.view.frame 
    self.videoPlayer!.play() 

    self.view.layer.addSublayer(self.playerLayer!) 

    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("continueVideo:"), name: "continueVideo", object: nil) 


    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("playerDidReachEnd:"), name: AVPlayerItemDidPlayToEndTimeNotification, object:nil) 
} 


func playerDidReachEnd(notification: NSNotification) { 
    self.videoPlayer.seekToTime(kCMTimeZero) 
    self.videoPlayer.play() 
} 

func continueVideo(notification: NSNotification) { 
    self.videoPlayer.play() 
} 

func applicationWillResignActive(application: UIApplication) { 
    videoPlayer.pause() 
} 


func applicationDidBecomeActive(application: UIApplication) { 
    videoPlayer.play() 
} 


func applicationDidEnterBackground(application: UIApplication) { 
    videoPlayer.pause() 
} 


func applicationWillEnterForeground(application: UIApplication) { 
    videoPlayer.play() 
} 





override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 



} 

И приложение делегат часть

import UIKit 


@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

var window: UIWindow? 


func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

    return true 
} 

func applicationWillResignActive(application: UIApplication) { 


} 

func applicationDidEnterBackground(application: UIApplication) { 


} 

func applicationWillEnterForeground(application: UIApplication) { 
    NSNotificationCenter.defaultCenter().postNotificationName ("continueVideo", object:nil) 
} 

func applicationDidBecomeActive(application: UIApplication) { 

} 

func applicationWillTerminate(application: UIApplication) { 

} 


} 

ответ

6

Это простое исправление, необходимо создать NSNotification и вызвать его из AppDelegate:

func applicationWillEnterForeground(application: UIApplication) { 
    NSNotificationCenter.defaultCenter().postNotificationName("continueVideo", object: nil) 
} 

SWIFT3 Update

func applicationWillEnterForeground(_ application: UIApplication) { 
    // NOTE: Notification.Name raw value should be global 
    NotificationCenter.default.post(name: Notification.Name(rawValue: "com.yourappname.continueVideo"), object:self) 
} 

И получить это уведомление в обычном порядке:

NSNotificationCenter.defaultCenter().addObserver(self, selector: "<funcName>:", name: "continueVideo", object: nil) 

SWIFT3 Update

NotificationCenter.default.addObserver(self, selector: #selector(<funcName>), name: Notification.Name(rawValue: "com.yourappname.continueVideo"), object: nil) 
+0

Не совсем уверен, что делать с момента получения уведомления? это происходит в контроллере просмотра? Также есть часть appdelegate в swift? – Opei

+0

Вы добавили «Уведомление» в свой 'ViewDidLoad', который уже просто добавляет этот слушатель, также создайте функцию и измените селектор (выделено ) – RichAppz

+0

У вас будет файл AppDelegate.swift как стандарт в основная папка. 'Func applicationWillEnterForeground (приложение: UIApplication)' должно быть уже в файле. – RichAppz

Смежные вопросы