From f188a7fd480ee3454e602b7ba516dacc7bbe7ea7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20Moska=C5=82a?= <91079590+moskalakamil@users.noreply.github.com> Date: Wed, 26 Mar 2025 12:20:32 +0100 Subject: [PATCH] refactor(ios): unpause after exiting fullscreen (#4472) * refactor(ios): unpause after exiting fullscreen * chore: lint code --- examples/bare/ios/Podfile.lock | 62 +++++++++++----------- examples/common/BasicExample.tsx | 8 +-- ios/Video/Features/RCTPlayerObserver.swift | 14 +++++ 3 files changed, 46 insertions(+), 38 deletions(-) diff --git a/examples/bare/ios/Podfile.lock b/examples/bare/ios/Podfile.lock index 117768e6..93246303 100644 --- a/examples/bare/ios/Podfile.lock +++ b/examples/bare/ios/Podfile.lock @@ -852,12 +852,12 @@ PODS: - React-Mapbuffer (0.73.2): - glog - React-debug - - react-native-video (6.10.2): + - react-native-video (6.11.0): - glog - RCT-Folly (= 2022.05.16.00) - React-Core - - react-native-video/Video (= 6.10.2) - - react-native-video/Video (6.10.2): + - react-native-video/Video (= 6.11.0) + - react-native-video/Video (6.11.0): - glog - RCT-Folly (= 2022.05.16.00) - React-Core @@ -1024,13 +1024,13 @@ PODS: - React-jsi (= 0.73.2) - React-logger (= 0.73.2) - React-perflogger (= 0.73.2) - - ReactNativeHost (0.5.3): + - ReactNativeHost (0.5.0): - glog - RCT-Folly (= 2022.05.16.00) - React-Core - React-cxxreact - ReactCommon/turbomodule/core - - ReactTestApp-DevSupport (3.10.18): + - ReactTestApp-DevSupport (3.10.17): - React-Core - React-jsi - ReactTestApp-Resources (1.0.0-dev) @@ -1213,50 +1213,50 @@ SPEC CHECKSUMS: FBReactNativeSpec: 86de768f89901ef6ed3207cd686362189d64ac88 fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 glog: c5d68082e772fa1c511173d6b30a9de2c05a69a2 - RCT-Folly: cd21f1661364f975ae76b3308167ad66b09f53f5 + RCT-Folly: 7169b2b1c44399c76a47b5deaaba715eeeb476c0 RCTRequired: 9b1e7e262745fb671e33c51c1078d093bd30e322 RCTTypeSafety: a759e3b086eccf3e2cbf2493d22f28e082f958e6 React: 805f5dd55bbdb92c36b4914c64aaae4c97d358dc React-callinvoker: 6a697867607c990c2c2c085296ee32cfb5e47c01 - React-Codegen: ea685412377744d2e2108adb131fce2f040ddd14 - React-Core: d9a7e296b2e7b57f27d81b62a7d293d06527268a - React-CoreModules: 399f72f0892befe0fde5d415703c0b9b356762e7 - React-cxxreact: beb7cb8adddd4b25d4262f55927dcd1d3577e99d + React-Codegen: 39377d8c90c3fc0792753c9af53b788abfe5850b + React-Core: 943d6097aaf381b1e7c7e105eecd5a27b51c4e17 + React-CoreModules: 710e7c557a1a8180bd1645f5b4bf79f4bd3f5417 + React-cxxreact: 0f0b3933c36dfe4ed10638a33398533f90ab78d3 React-debug: f1637bce73342b2f6eee4982508fdfb088667a87 - React-Fabric: cb2eba1fd764229f9a5737fa7b339695d4949848 - React-FabricImage: b86bf7e1c6560bf82ade361dac6f3281e68453ee - React-graphics: 87ba141b72379824c7835224c1a87993683151a8 - React-ImageManager: 1bc92d558d4d5de07c6c1a7244d33ad2a872728e + React-Fabric: ba7d74992ed878fdbf91f8b49eb725b310786980 + React-FabricImage: e7457fb89db50cb1b51d0546b5ff002b91026efe + React-graphics: dd5af9d8b1b45171fd6933e19fed522f373bcb10 + React-ImageManager: c5b7db131eff71443d7f3a8d686fd841d18befd3 React-jsc: 94234736a90ea29f017f2ee76e5f358a6ba076a9 - React-jserrorhandler: 0b1476485be6d79f09a8f0548c355b1cc14e8f21 - React-jsi: dbfd3bab7712367d4c2aced271d794dde76f0d68 - React-jsiexecutor: 368e562638c31174479c00434d37fd67b761c15b + React-jserrorhandler: 97a6a12e2344c3c4fdd7ba1edefb005215c732f8 + React-jsi: 0cd661b6ea862c104706311f8265050ee3ecf5e4 + React-jsiexecutor: 94f6026bc4054b413f0ac5e210691c2916d99d1b React-jsinspector: 03644c063fc3621c9a4e8bf263a8150909129618 React-logger: 66b168e2b2bee57bd8ce9e69f739d805732a5570 React-Mapbuffer: 9ee041e1d7be96da6d76a251f92e72b711c651d6 - react-native-video: 6e6a4c453879c646d8a2e5c16ff0903af33daadd + react-native-video: a37a6ee1a15aa383c7abc2879c0b7524e6ff1f6b React-nativeconfig: d753fbbc8cecc8ae413d615599ac378bbf6999bb - React-NativeModulesApple: 0c22e17930a2de06bbd4d49a149351a5151283dc + React-NativeModulesApple: 22c25a1baa4b0d0d4845dad2578fc017b0805589 React-perflogger: 29efe63b7ef5fbaaa50ef6eaa92482f98a24b97e React-RCTActionSheet: 69134c62aefd362027b20da01cd5d14ffd39db3f - React-RCTAnimation: ed774e28e707ce47b1e2dc6aa7f8f3267b815061 - React-RCTAppDelegate: b3312577f20a1c3aaf58ff6d561f3119c74b95b4 - React-RCTBlob: 8c173ce722daff128efb38f29a390984800f9302 - React-RCTFabric: a0a76ccfa863b02382cb74e04450e9f69cd1cf49 - React-RCTImage: 1f75f5d0539b381f70981386b1459fbb2c21eb9b - React-RCTLinking: febd566d57a9cb05a02f39771ccc8c20f8432e89 - React-RCTNetwork: d427de729372fd50d7cb601db64d0fcd9ea9a514 - React-RCTSettings: 73594c6c8c334c7d958cf98ac72335f3e4df9bf5 - React-RCTText: f1079c24f45cec6ddb6363c12ad87f9a940b2ddb - React-RCTVibration: 62420b57a47482d1b88dde64ba88d333f2625aab - React-rendererdebug: a474ec4cdfed75211dce6c3828de8391cc5c4280 + React-RCTAnimation: 3b5a57087c7a5e727855b803d643ac1d445488f5 + React-RCTAppDelegate: 842870b97f47de7255908ba1ca8786aef877b0b8 + React-RCTBlob: 1fa011b5860c9a70802fab986ad334b458387b7a + React-RCTFabric: c8f86a85501d70c8a77d71f22273e325ffb63fa0 + React-RCTImage: 27b27f4663df9e776d0549ed2f3536213e793f1b + React-RCTLinking: 962880ce9d0e2ea83fd182953538fc4ed757d4da + React-RCTNetwork: 73a756b44d4ad584bae13a5f1484e3ce12accac8 + React-RCTSettings: 6d7f8d807f05de3d01cfb182d14e5f400716faac + React-RCTText: 73006e95ca359595c2510c1c0114027c85a6ddd3 + React-RCTVibration: 599f427f9cbdd9c4bf38959ca020e8fef0717211 + React-rendererdebug: f2946e0a1c3b906e71555a7c4a39aa6a6c0e639b React-rncore: 74030de0ffef7b1a3fb77941168624534cc9ae7f React-runtimeexecutor: 2d1f64f58193f00a3ad71d3f89c2bfbfe11cf5a5 React-runtimescheduler: 6517c0cdfae3ea29b599759e069ae97746163248 React-utils: f5bc61e7ea3325c0732ae2d755f4441940163b85 ReactCommon: a42e89b49d88c3890dfb6fd98a33ac80d555be19 ReactNativeHost: 1e71e0d4c176f03f4b9073a35197d576ec40cce3 - ReactTestApp-DevSupport: 1e39530b4a8602e7138a5b9dfafe41d3a78382ff + ReactTestApp-DevSupport: 63ee335373656e70e33d7ac50cd599f31285c962 ReactTestApp-Resources: 857244f3a23f2b3157b364fa06cf3e8866deff9c RNCPicker: d2ac37457765e0066fe17c93f536eae024b6e53a SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17 diff --git a/examples/common/BasicExample.tsx b/examples/common/BasicExample.tsx index af1aeede..ba245b06 100644 --- a/examples/common/BasicExample.tsx +++ b/examples/common/BasicExample.tsx @@ -221,11 +221,6 @@ const BasicExample = () => { console.log('onVideoBandwidthUpdate', data); }; - const onFullScreenExit = () => { - // iOS pauses video on exit from full screen - Platform.OS === 'ios' && setPaused(true); - }; - const _renderLoader = showPoster ? () => : undefined; const _subtitleStyle = {subtitlesFollowVideo: true}; @@ -240,7 +235,7 @@ const BasicExample = () => { }; useEffect(() => { - videoRef.current?.setSource({...currentSrc, bufferConfig: _bufferConfig }); + videoRef.current?.setSource({...currentSrc, bufferConfig: _bufferConfig}); }, [currentSrc]); return ( @@ -261,7 +256,6 @@ const BasicExample = () => { muted={muted} controls={controls} resizeMode={resizeMode} - onFullscreenPlayerWillDismiss={onFullScreenExit} onLoad={onLoad} onAudioTracks={onAudioTracks} onTextTracks={onTextTracks} diff --git a/ios/Video/Features/RCTPlayerObserver.swift b/ios/Video/Features/RCTPlayerObserver.swift index 6f73cfb9..019fa5ea 100644 --- a/ios/Video/Features/RCTPlayerObserver.swift +++ b/ios/Video/Features/RCTPlayerObserver.swift @@ -322,6 +322,20 @@ class RCTPlayerObserver: NSObject, AVPlayerItemMetadataOutputPushDelegate, AVPla _restoreUserInterfaceForPIPStopCompletionHandler = completionHandler } + func playerViewController( + _: AVPlayerViewController, + willEndFullScreenPresentationWithAnimationCoordinator coordinator: UIViewControllerTransitionCoordinator + ) { + // iOS automatically pauses videos after exiting fullscreen, + // but it's better if we resume playback + let wasPlaying = player?.timeControlStatus == .playing + + coordinator.animate(alongsideTransition: nil) { [weak self] context in + guard let self, !context.isCancelled, wasPlaying else { return } + self.player?.play() + } + } + func setRestoreUserInterfaceForPIPStopCompletionHandler(_ restore: Bool) { guard let _restoreUserInterfaceForPIPStopCompletionHandler else { return }