diff --git a/CHANGELOG.md b/CHANGELOG.md index ed58548055..10648e32ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ -------------------------------------------- +[0.12.9+1] - 2025-02-17 + +* [iOS] Added helper method `configureIOSMultitaskingCameraAccess` to enable/disable Multitasking Camrea Access on iOS + [0.12.9] - 2025-02-13 * [iOS] feat: Add option to start capture without broadcast picker (#1764) diff --git a/common/darwin/Classes/FlutterWebRTCPlugin.m b/common/darwin/Classes/FlutterWebRTCPlugin.m index 14581a400f..2cf46c1cec 100644 --- a/common/darwin/Classes/FlutterWebRTCPlugin.m +++ b/common/darwin/Classes/FlutterWebRTCPlugin.m @@ -853,7 +853,12 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { result(nil); } #endif - else if ([@"mediaStreamTrackHasTorch" isEqualToString:call.method]) { + else if ([@"enableIOSMultitaskingCameraAccess" isEqualToString:call.method]) { + NSDictionary* argsMap = call.arguments; + BOOL enable = [argsMap[@"enable"] boolValue]; + + [self enableMultitaskingCameraAccess:enable result:result]; + } else if ([@"mediaStreamTrackHasTorch" isEqualToString:call.method]) { NSDictionary* argsMap = call.arguments; NSString* trackId = argsMap[@"trackId"]; id track = self.localTracks[trackId]; @@ -1586,8 +1591,52 @@ - (void)mediaStreamTrackSetVideoEffects:(nonnull NSString *)trackId names:(nonnu } else { NSLog(@"mediaStreamTrackSetVideoEffects: track not found"); } +} +- (void)enableMultitaskingCameraAccess:(BOOL)enable result:(FlutterResult)result +{ + @try { + AVCaptureSession *session = self.videoCapturer.captureSession; + if (session == nil) { + NSLog(@"enableMultitaskingCameraAccess: Capture session is nil."); + result(@NO); + return; + } + #if TARGET_OS_OSX + NSLog(@"enableMultitaskingCameraAccess: Multitasking camera access is not available on macOS."); + result(@NO); + return; + #else + if (@available(iOS 16.0, *)) { + BOOL shouldChange = session.multitaskingCameraAccessEnabled != enable; + BOOL canChange = !enable || (enable && session.isMultitaskingCameraAccessSupported); + + if (shouldChange && canChange) { + [session beginConfiguration]; + [session setMultitaskingCameraAccessEnabled:enable]; + [session commitConfiguration]; + + result(enable ? @YES : @NO); + } else { + if (!canChange) { + NSLog(@"enableMultitaskingCameraAccess: Multitasking camera access is not supported on this device."); + result(@NO); + } else { + NSLog(@"enableMultitaskingCameraAccess: Multitasking camera access is already %@.", enable ? @"enabled" : @"disabled"); + result(enable ? @YES : @NO); + } + } + } else { + NSLog(@"enableMultitaskingCameraAccess: Multitasking camera access requires iOS 16 or later."); + result(@NO); + } + #endif + } + @catch (NSException *exception) { + NSLog(@"enableMultitaskingCameraAccess: Exception occurred: %@ - %@", exception.name, exception.reason); + result(@NO); + } } - (void)mediaStreamGetTracks:(NSString*)streamId result:(FlutterResult)result { diff --git a/lib/src/helper.dart b/lib/src/helper.dart index bae5c9aaa9..e4fd66f9b6 100644 --- a/lib/src/helper.dart +++ b/lib/src/helper.dart @@ -179,4 +179,16 @@ class Helper { throw Exception('requestCapturePermission only support for Android'); } } + + static Future enableIOSMultitaskingCameraAccess(bool enable) async { + if (WebRTC.platformIsIOS) { + return await WebRTC.invokeMethod( + 'enableIOSMultitaskingCameraAccess', + {'enable': enable}, + ); + } else { + throw Exception( + 'enableIOSMultitaskingCameraAccess is only supported for iOS'); + } + } } diff --git a/pubspec.yaml b/pubspec.yaml index 5eabaff71c..7fea2ebfed 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: stream_webrtc_flutter description: Flutter WebRTC plugin for iOS/Android/Destkop/Web, based on GoogleWebRTC. -version: 0.12.9 +version: 0.12.9+1 homepage: https://github.com/GetStream/webrtc-flutter environment: sdk: ">=3.3.0 <4.0.0"