Xamarin iOS:CallKit与WKWebView WebRTC音频会话冲突致媒体流异常
PushKit/CallKit无法在iOS上启动WebRTC WKWebView,但该功能在Android上运行完全正常。推测CallKit音频会话与WebRTC WebView之间存在冲突。
复现步骤
- WKWebviewRenderer的OnElementChanged方法:
webView = new FullWKWebView(new CoreGraphics.CGRect(), new WKWebViewConfiguration() { AllowsInlineMediaPlayback = true, AllowsAirPlayForMediaPlayback = true, AllowsPictureInPictureMediaPlayback = true, MediaPlaybackAllowsAirPlay = true, MediaPlaybackRequiresUserAction = false, });
- PushKit通知:
CallProviderDelegate.ReportIncomingCall(new NSUuid(call.CallID.ToString()), call.ClientName, call);
- CXProviderDelegate的ReportIncomingCall方法:
// 创建更新信息描述来电和呼叫方 var update = new CXCallUpdate(); update.RemoteHandle = new CXHandle(CXHandleType.EmailAddress, handle); update.HasVideo = !call.AudioOnly; // 向系统上报来电 Provider.ReportNewIncomingCall(uuid, update, (error) => { // 判断是否已接听电话 if (error == null) { // 已接听,上报至呼叫管理器 call.CallID = Guid.Parse(uuid.ToString()); CallManager.Calls.Add(new ActiveCall(uuid, handle, false, call)); } else { // 在此处向用户上报错误 Console.WriteLine("Error: {0}", error); } });
- CXProviderDelegate的DidActivateAudioSession:启动WKWebView WebRTC(尝试在接听电话时启动WebView也无效果)
预期行为
视频通话应在所有平台上完全正常运行,支持完整的音频和视频功能。
实际行为(推测CallKit音频会话与WebRTC WebView之间存在冲突)
- Android(主叫)→Android(被叫):正常
- iOS(主叫)→Android(被叫):正常
- Android(主叫)→iOS(被叫):iOS端(被叫)视频停止
- Web(主叫)→Android(被叫):正常
- Web(主叫)→iOS(被叫):iOS端(被叫)视频停止
- iOS(主叫)→iOS(被叫):被叫端视频停止
环境信息
Visual Studio Community 2022 for Mac预览版
版本:17.5 Preview(17.5 build 1766)
安装UUID:e557854f-a905-44ee-8e30-4046c9714dc5
运行时
.NET 7.0.1(64位)
架构:Arm64
Microsoft.macOS.Sdk 12.3.2372; git-rev-head:754abbf6a3563f6267e5717ae832b4ac25b1f2fb; git-branch:release/7.0.1xx-xcode13.3
Roslyn(语言服务)
4.5.0-3.23056.2+97881342e427ff5cdcba8f12b12ff8e6f3564431
NuGet
版本:6.4.0.117
.NET SDK(Arm64)
SDK路径:/usr/local/share/dotnet/sdk/7.0.200-preview.22628.1/Sdks
SDK版本:
7.0.200-preview.22628.1
7.0.100
6.0.405
6.0.403
6.0.401
6.0.400-preview.22330.6
6.0.302
6.0.101
MSBuild SDK路径:/Applications/Visual Studio(2022).app/Contents/MonoBundle/MSBuild/Current/bin/Sdks
.NET SDK(x64)
SDK版本:
6.0.405
6.0.403
6.0.401
6.0.400-preview.22330.6
6.0.106
6.0.101
6.0.408
5.0.404
3.1.426
3.1.425
3.1.423
3.1.421
3.1.416
.NET Runtime(Arm64)
运行时路径:/usr/local/share/dotnet/dotnet
运行时版本:
7.0.0
7.0.13
6.0.11
6.0.9
6.0.7
6.0.6
6.0.1
.NET Runtime(x64)
运行时路径:/usr/local/share/dotnet/x64/dotnet
运行时版本:
6.0.13
6.0.11
6.0.9
6.0.6
6.0.1
5.0.17
5.0.13
3.1.32
3.1.31
3.1.29
3.1.27
3.1.22
Xamarin.Profiler
版本:1.8.0.49
路径:/Applications/Xamarin Profiler.app/Contents/MacOS/Xamarin Profiler
Updater
版本:11
Xamarin.Android
版本:13.2.0.0(Visual Studio Community)
提交记录:xamarin-android/d17-5/797e2e1
Android SDK路径:/Users/vymacmini/Library/Developer/Xamarin/android-sdk-macosx
支持的Android版本:
12.1(API level 32)
8.0(API level 26)
12.0(API level 31)
8.1(API level 27)
5.0(API level 21)
11.0(API level 30)
10.0(API level 29)
8.1(API level 25)
9.0(API level 28)
13.0(API level 33)
SDK命令行工具版本:7.0
SDK平台工具版本:34.0.1
SDK构建工具版本:33.0.1
构建信息:
Mono: 6dd9def
Java.Interop: xamarin/java.interop@149d70fe
SQLite: xamarin/sqlite@fdc1e34
Xamarin.Android Tools: xamarin/xamarin-android-tools@9f02d77
Microsoft Build of OpenJDK
Java SDK路径:/Library/Java/JavaVirtualMachines/microsoft-11.jdk
版本:11.0.16.1
Eclipse Temurin JDK
Java SDK路径:/Library/Java/JavaVirtualMachines/temurin-8.jdk
版本:1.8.0.302
Android SDK Manager
版本:17.5.0.33
哈希值:f0c0c52
分支:remotes/origin/d17-5~1
构建日期:2023-02-02 19:20:19 UTC
Android Device Manager
版本:0.0.0.1245
哈希值:7f8a990
分支:7f8a990
构建日期:2023-02-02 19:20:19 UTC
Xamarin Designer
版本:17.5.3.47
哈希值:e8b5d371c3
分支:remotes/origin/d17-5
构建日期:2023-02-02 19:20:14 UTC
Apple开发者工具
Xcode: 14.2 21534
构建版本:14C18
Xamarin.Mac
未安装
Xamarin.iOS
版本:16.2.0.2 Visual Studio Community
哈希值:956a059
分支:xcode14.2
构建日期:2022-12-15 06:15:44-0500
构建信息
发布ID:1705001766
Git修订版本:749808e99f0d0bf8a8eb45fe406840107ffb46b4
构建日期:2023-02-02 19:18:20+00
构建分支:release-17.5
构建通道:release-17.5
操作系统
Mac OS X 13.0.1
Darwin 22.1.0 Darwin Kernel Version 22.1.0
Sun Oct 9 20:14:30 PDT 2022
root:xnu-8792.41.9~2/RELEASE_ARM64_T8103 arm64
构建日志
无构建错误
内容的提问来源于stack exchange,提问作者Vy Phan

