Skip to content

Commit 84b2d7f

Browse files
authored
Merge pull request #9 from GetStream/feature/ios-multitasking-camera
Feat: Added multitasking camera support
2 parents 36e1e88 + 41f0683 commit 84b2d7f

File tree

4 files changed

+67
-2
lines changed

4 files changed

+67
-2
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
--------------------------------------------
44

5+
[0.12.9+1] - 2025-02-17
6+
7+
* [iOS] Added helper method `configureIOSMultitaskingCameraAccess` to enable/disable Multitasking Camrea Access on iOS
8+
59
[0.12.9] - 2025-02-13
610

711
* [iOS] feat: Add option to start capture without broadcast picker (#1764)

common/darwin/Classes/FlutterWebRTCPlugin.m

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -853,7 +853,12 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
853853
result(nil);
854854
}
855855
#endif
856-
else if ([@"mediaStreamTrackHasTorch" isEqualToString:call.method]) {
856+
else if ([@"enableIOSMultitaskingCameraAccess" isEqualToString:call.method]) {
857+
NSDictionary* argsMap = call.arguments;
858+
BOOL enable = [argsMap[@"enable"] boolValue];
859+
860+
[self enableMultitaskingCameraAccess:enable result:result];
861+
} else if ([@"mediaStreamTrackHasTorch" isEqualToString:call.method]) {
857862
NSDictionary* argsMap = call.arguments;
858863
NSString* trackId = argsMap[@"trackId"];
859864
id<LocalTrack> track = self.localTracks[trackId];
@@ -1586,8 +1591,52 @@ - (void)mediaStreamTrackSetVideoEffects:(nonnull NSString *)trackId names:(nonnu
15861591
} else {
15871592
NSLog(@"mediaStreamTrackSetVideoEffects: track not found");
15881593
}
1594+
}
15891595

1596+
- (void)enableMultitaskingCameraAccess:(BOOL)enable result:(FlutterResult)result
1597+
{
1598+
@try {
1599+
AVCaptureSession *session = self.videoCapturer.captureSession;
1600+
if (session == nil) {
1601+
NSLog(@"enableMultitaskingCameraAccess: Capture session is nil.");
1602+
result(@NO);
1603+
return;
1604+
}
15901605

1606+
#if TARGET_OS_OSX
1607+
NSLog(@"enableMultitaskingCameraAccess: Multitasking camera access is not available on macOS.");
1608+
result(@NO);
1609+
return;
1610+
#else
1611+
if (@available(iOS 16.0, *)) {
1612+
BOOL shouldChange = session.multitaskingCameraAccessEnabled != enable;
1613+
BOOL canChange = !enable || (enable && session.isMultitaskingCameraAccessSupported);
1614+
1615+
if (shouldChange && canChange) {
1616+
[session beginConfiguration];
1617+
[session setMultitaskingCameraAccessEnabled:enable];
1618+
[session commitConfiguration];
1619+
1620+
result(enable ? @YES : @NO);
1621+
} else {
1622+
if (!canChange) {
1623+
NSLog(@"enableMultitaskingCameraAccess: Multitasking camera access is not supported on this device.");
1624+
result(@NO);
1625+
} else {
1626+
NSLog(@"enableMultitaskingCameraAccess: Multitasking camera access is already %@.", enable ? @"enabled" : @"disabled");
1627+
result(enable ? @YES : @NO);
1628+
}
1629+
}
1630+
} else {
1631+
NSLog(@"enableMultitaskingCameraAccess: Multitasking camera access requires iOS 16 or later.");
1632+
result(@NO);
1633+
}
1634+
#endif
1635+
}
1636+
@catch (NSException *exception) {
1637+
NSLog(@"enableMultitaskingCameraAccess: Exception occurred: %@ - %@", exception.name, exception.reason);
1638+
result(@NO);
1639+
}
15911640
}
15921641

15931642
- (void)mediaStreamGetTracks:(NSString*)streamId result:(FlutterResult)result {

lib/src/helper.dart

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,4 +179,16 @@ class Helper {
179179
throw Exception('requestCapturePermission only support for Android');
180180
}
181181
}
182+
183+
static Future<bool> enableIOSMultitaskingCameraAccess(bool enable) async {
184+
if (WebRTC.platformIsIOS) {
185+
return await WebRTC.invokeMethod(
186+
'enableIOSMultitaskingCameraAccess',
187+
<String, dynamic>{'enable': enable},
188+
);
189+
} else {
190+
throw Exception(
191+
'enableIOSMultitaskingCameraAccess is only supported for iOS');
192+
}
193+
}
182194
}

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: stream_webrtc_flutter
22
description: Flutter WebRTC plugin for iOS/Android/Destkop/Web, based on GoogleWebRTC.
3-
version: 0.12.9
3+
version: 0.12.9+1
44
homepage: https://github.com/GetStream/webrtc-flutter
55
environment:
66
sdk: ">=3.3.0 <4.0.0"

0 commit comments

Comments
 (0)