2017-05-12 7 views
1

現在AVPlayerを使用しているビューでビデオを自分のバックグラウンドで再生していますが、ホーム画面に戻ってからアプリケーションを開くと、ビデオが一時停止して再開できません。もちろん、アプリを閉じて再オープンすると修正されますが、ユーザーがアプリに戻ると再開する必要があります。
私は、ViewControllerにリンクする変数を作成し、次にavPlayer.play()を呼び出すことによって、AppDelegateでapplicationDidBecomeActiveを使用しようとしました。しかし、これはnilを見つけたというエラーを返します。私はapplicationDidBecomeActiveでviewDidLoad()を呼び出すことも試みましたが、それはデリゲートからコードを呼び出さないときにコードが完全に機能していても、私にBAD INSTRUCTIONエラーを返します。
ご協力いただければ幸いです!applicationDidBecomeActiveのときにAVPlayerのビデオを再開しますか?

のViewController:

import UIKit 
import AVFoundation 


class ViewController: UIViewController, CLLocationManagerDelegate { 

    var avPlayer: AVPlayer! 
    var avPlayerLayer: AVPlayerLayer! 
    var paused: Bool = false 
    var foregroundNotification: NSObjectProtocol! 

    //viewDidLoad 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     NotificationCenter.default.addObserver(self, selector:#selector(ViewController.viewDidLoad), name:NSNotification.Name.UIApplicationWillEnterForeground, object:UIApplication.shared) 


     //Rotate icon 

     let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation") 
     rotateAnimation.fromValue = 0.0 
     rotateAnimation.toValue = 360.0 
     rotateAnimation.repeatCount = HUGE 
     rotateAnimation.duration = 450 


     checkInButton.layer.add(rotateAnimation, forKey: "myAnimationKey"); 

     //Play background video 

     let theURL = Bundle.main.url(forResource:"city2", withExtension: "mp4") 

     avPlayer = AVPlayer(url: theURL!) 
     avPlayerLayer = AVPlayerLayer(player: avPlayer) 
     avPlayerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 
     avPlayer.volume = 0 
     avPlayer.actionAtItemEnd = .none 
     //avPlayer.rate = 1 

     avPlayerLayer.frame = view.layer.bounds 
     view.backgroundColor = .clear 
     view.layer.insertSublayer(avPlayerLayer, at: 0) 

     NotificationCenter.default.addObserver(self, 
               selector: #selector(playerItemDidReachEnd(notification:)), 
               name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, 
               object: avPlayer.currentItem) 

} 


    func playerItemDidReachEnd(notification: Notification) { 
     let p: AVPlayerItem = notification.object as! AVPlayerItem 
     p.seek(to: kCMTimeZero) 
    } 

    override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 
     avPlayer.play() 
     paused = false 

    } 

    override func viewDidDisappear(_ animated: Bool) { 
     super.viewDidDisappear(animated) 
     avPlayer.pause() 
     paused = true 

} 
} 

委任:

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

    var window: UIWindow? 
    var vc = ViewController() 


    func applicationDidBecomeActive(_ application: UIApplication) { 
     // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 

     vc.avPlayer.play() 
     vc.paused = false 

    } 
+0

てみてください演奏を扱います。また、ViewControllerでavPlayer.play()を開始する関数を作成します。 –

答えて

0

このように一度通知を設定します。その後

NotificationCenter.default.addObserver(self, selector: #selector(appMovedToForeground), name: Notification.Name.UIApplicationWillEnterForeground, object: nil) 

あなたの音楽がここにViewDidAppearまたはViewWillAppear機能にNameWillEnterForegroundと通知センターを追加

func appMovedToForeground() { 
    //do you play stuff here 
} 
関連する問題