.NET MAUI Blazor注册IConnectivity后iPhone端启动崩溃
MAUI Blazor 应用 TestFlight 发布后启动闪屏即崩溃排查方案
构建环境
- 硬件设备:MacBook Air (M1, 2020),系统版本 macOS 12.3.1
- 开发工具:VS Code for macOS 通用版 1.67.2
- 框架版本:.NET 6.0.300
问题复现步骤
- 执行命令
dotnet new maui-blazor新建默认 MAUI Blazor 应用 - 执行以下发布命令编译 iOS 包:
dotnet publish MyMauiBlazorApp.csproj -f:net6.0-ios -c:Release /p:ServerAddress=myipaddree /p:ServerUser=myuser /p:TcpPort=58181 /p:ArchiveOnBuild=true /p:_DotNetRootRemoteDirectory=/Users//Library/Caches/Xamarin/XMA/SDKs/dotnet/ /p:EnableAssemblyILStripping=false /p:ServerPassword=myuserpassword
- 完成 App Store 发布所需全套配置流程,包括应用 ID 创建、签名证书、发布描述文件配置
- 通过 Transporter 将构建好的包上传至 TestFlight
- 在 iPhone 设备上下载安装应用并启动,此时应用运行完全正常
- 在项目的
iOS/Info.plist文件中添加以下配置:
<key>MinimumOSVersion</key> <string>14.2</string> <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
- 在项目的
MauiProgram.cs文件中添加以下服务注册代码:
builder.Services.AddSingleton<IConnectivity>(Connectivity.Current);
- 按照此前完全相同的流程重新构建
.ipa安装包,再次上传发布至 App Store
问题现象
在 iPhone 12 Max Pro 设备上下载更新后的应用,启动时仅短暂显示闪屏页面随即崩溃;但同一份代码在构建所用的 Mac 本地执行命令 dotnet build -t:Run -c:Release -f net6.0-maccatalyst MyMauiBlazorApp.csproj 可在 Mac Catalyst 环境下正常运行,无任何异常。
排查思路与解决方案
第一步:先拿崩溃日志定位具体报错
iOS 发布版崩溃不会在本地控制台输出日志,先通过两个渠道拿堆栈:
- 设备端:打开「设置-隐私与安全性-分析与改进-分析数据」,找到和应用名、崩溃时间匹配的
.ips文件导出 - Xcode端:手机连Mac后打开Xcode,进入
Window > Devices and Simulators,选中对应设备点「View Device Logs」,筛选对应应用的崩溃记录
重点看堆栈里有没有Permissions、Connectivity、Info.plist相关的缺失字段报错,这是这类场景下最常见的崩溃原因
第二步:补全Info.plist缺失的强制权限声明
你注册了IConnectivity网络服务,但设置的最低支持版本是iOS 14.2,这个版本开始苹果强制要求声明本地网络权限,缺失时系统会在应用启动阶段直接终止进程,不会弹权限申请框,而且Mac Catalyst环境不会做该校验,和你描述的现象完全匹配。
在iOS/Info.plist里补充以下配置:
<!-- iOS14+ 访问网络强制要求的权限声明 --> <key>NSLocalNetworkUsageDescription</key> <string>需要访问网络加载应用内容</string>
第三步:修正发布配置的已知bug
你当前发布参数里加了/p:EnableAssemblyILStripping=false,但.NET 6.0.300版本的MAUI有已知问题:强制关闭IL裁剪时,Microsoft.Maui.Essentials下的Connectivity相关实现程序集不会被正确打包到ipa中,启动时加载服务找不到对应实现就会直接崩溃。
按以下方式调整配置:
- 在项目文件
MyMauiBlazorApp.csproj中加入以下配置,用部分裁剪模式代替完全关闭裁剪,同时避免Blazor依赖被误裁剪:
<PropertyGroup> <MtouchInterpreter>-all</MtouchInterpreter> <TrimMode>partial</TrimMode> </PropertyGroup> <ItemGroup> <TrimmerRootAssembly Include="Microsoft.AspNetCore.Components.Web" /> <TrimmerRootAssembly Include="Microsoft.Maui.Essentials" /> </ItemGroup>
- 修正发布命令:移除
/p:EnableAssemblyILStripping=false参数,同时把路径里缺失的用户名补上——你原来的_DotNetRootRemoteDirectory写的是/Users//Library/,两个斜杠中间缺了当前Mac的用户名,远程构建时会导致SDK路径映射错误,丢依赖。修正后的发布命令参考:
dotnet publish MyMauiBlazorApp.csproj -f:net6.0-ios -c:Release /p:ServerAddress=你的构建机IP /p:ServerUser=构建机用户名 /p:TcpPort=58181 /p:ArchiveOnBuild=true /p:_DotNetRootRemoteDirectory=/Users/构建机用户名/Library/Caches/Xamarin/XMA/SDKs/dotnet/ /p:ServerPassword=构建机密码
第四步:本地验证后再上传
重新打包前先做本地真机验证,避免反复上传浪费时间:
- iPhone连Mac,执行
dotnet build -t:Run -c:Release -f net6.0-ios直接在真机跑Release版本,确认启动正常、网络功能可用 - 归档生成ipa后通过Xcode安装到真机测试,确认无崩溃再上传Transporter
内容的提问来源于stack exchange,提问作者user1424876
相关产品推荐
相关产品推荐

