Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
51 changes: 50 additions & 1 deletion common/darwin/Classes/FlutterWebRTCPlugin.m
Original file line number Diff line number Diff line change
Expand Up @@ -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<LocalTrack> track = self.localTracks[trackId];
Expand Down Expand Up @@ -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 {
Expand Down
12 changes: 12 additions & 0 deletions lib/src/helper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -179,4 +179,16 @@ class Helper {
throw Exception('requestCapturePermission only support for Android');
}
}

static Future<bool> enableIOSMultitaskingCameraAccess(bool enable) async {
if (WebRTC.platformIsIOS) {
return await WebRTC.invokeMethod(
'enableIOSMultitaskingCameraAccess',
<String, dynamic>{'enable': enable},
);
} else {
throw Exception(
'enableIOSMultitaskingCameraAccess is only supported for iOS');
}
}
}
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
@@ -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"
Expand Down