fix(ios): fix playback status with lifecycle (#3819)
* fix(ios): fix playback status with lifecycle * chore(ios): fix lint error * fix(ios): check _playInBackground value within handleExternalPlaybackActiveChange
This commit is contained in:
parent
d072aeb451
commit
1b51c15348
@ -44,7 +44,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
private var _muted = false
|
private var _muted = false
|
||||||
private var _paused = false
|
private var _paused = false
|
||||||
private var _repeat = false
|
private var _repeat = false
|
||||||
private var _isPlaying: Bool?
|
private var _isPlaying = false
|
||||||
private var _allowsExternalPlayback = true
|
private var _allowsExternalPlayback = true
|
||||||
private var _textTracks: [TextTrack]?
|
private var _textTracks: [TextTrack]?
|
||||||
private var _selectedTextTrackCriteria: SelectedTrackCriteria?
|
private var _selectedTextTrackCriteria: SelectedTrackCriteria?
|
||||||
@ -264,7 +264,8 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
|
|
||||||
@objc
|
@objc
|
||||||
func applicationWillResignActive(notification _: NSNotification!) {
|
func applicationWillResignActive(notification _: NSNotification!) {
|
||||||
if _playInBackground || _playWhenInactive || _paused { return }
|
let isExternalPlaybackActive = _player?.isExternalPlaybackActive ?? false
|
||||||
|
if _playInBackground || _playWhenInactive || !_isPlaying || isExternalPlaybackActive { return }
|
||||||
|
|
||||||
_player?.pause()
|
_player?.pause()
|
||||||
_player?.rate = 0.0
|
_player?.rate = 0.0
|
||||||
@ -272,7 +273,8 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
|
|
||||||
@objc
|
@objc
|
||||||
func applicationDidBecomeActive(notification _: NSNotification!) {
|
func applicationDidBecomeActive(notification _: NSNotification!) {
|
||||||
if _playInBackground || _playWhenInactive || _paused { return }
|
let isExternalPlaybackActive = _player?.isExternalPlaybackActive ?? false
|
||||||
|
if _playInBackground || _playWhenInactive || !_isPlaying || isExternalPlaybackActive { return }
|
||||||
|
|
||||||
// Resume the player or any other tasks that should continue when the app becomes active.
|
// Resume the player or any other tasks that should continue when the app becomes active.
|
||||||
_player?.play()
|
_player?.play()
|
||||||
@ -281,20 +283,18 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
|
|
||||||
@objc
|
@objc
|
||||||
func applicationDidEnterBackground(notification _: NSNotification!) {
|
func applicationDidEnterBackground(notification _: NSNotification!) {
|
||||||
if !_playInBackground {
|
let isExternalPlaybackActive = _player?.isExternalPlaybackActive ?? false
|
||||||
// Needed to play sound in background. See https://developer.apple.com/library/ios/qa/qa1668/_index.html
|
if _playInBackground || isExternalPlaybackActive { return }
|
||||||
_playerLayer?.player = nil
|
// Needed to play sound in background. See https://developer.apple.com/library/ios/qa/qa1668/_index.html
|
||||||
_playerViewController?.player = nil
|
_playerLayer?.player = nil
|
||||||
}
|
_playerViewController?.player = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func applicationWillEnterForeground(notification _: NSNotification!) {
|
func applicationWillEnterForeground(notification _: NSNotification!) {
|
||||||
self.applyModifiers()
|
self.applyModifiers()
|
||||||
if !_playInBackground {
|
_playerLayer?.player = _player
|
||||||
_playerLayer?.player = _player
|
_playerViewController?.player = _player
|
||||||
_playerViewController?.player = _player
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Audio events
|
// MARK: - Audio events
|
||||||
@ -1464,7 +1464,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
}
|
}
|
||||||
let isPlaying = player.timeControlStatus == .playing
|
let isPlaying = player.timeControlStatus == .playing
|
||||||
|
|
||||||
guard _isPlaying == nil || _isPlaying! != isPlaying else { return }
|
guard _isPlaying != isPlaying else { return }
|
||||||
_isPlaying = isPlaying
|
_isPlaying = isPlaying
|
||||||
onVideoPlaybackStateChanged?(["isPlaying": isPlaying, "target": reactTag as Any])
|
onVideoPlaybackStateChanged?(["isPlaying": isPlaying, "target": reactTag as Any])
|
||||||
}
|
}
|
||||||
@ -1499,7 +1499,12 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
|
|
||||||
func handleExternalPlaybackActiveChange(player _: AVPlayer, change _: NSKeyValueObservedChange<Bool>) {
|
func handleExternalPlaybackActiveChange(player _: AVPlayer, change _: NSKeyValueObservedChange<Bool>) {
|
||||||
#if !os(visionOS)
|
#if !os(visionOS)
|
||||||
guard let _player, onVideoExternalPlaybackChange != nil else { return }
|
guard let _player else { return }
|
||||||
|
if !_playInBackground && UIApplication.shared.applicationState == .background {
|
||||||
|
_playerLayer?.player = nil
|
||||||
|
_playerViewController?.player = nil
|
||||||
|
}
|
||||||
|
guard onVideoExternalPlaybackChange != nil else { return }
|
||||||
onVideoExternalPlaybackChange?(["isExternalPlaybackActive": NSNumber(value: _player.isExternalPlaybackActive),
|
onVideoExternalPlaybackChange?(["isExternalPlaybackActive": NSNumber(value: _player.isExternalPlaybackActive),
|
||||||
"target": reactTag as Any])
|
"target": reactTag as Any])
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user