MacOS下web_socket_channel组件使用异常问题求助
Flutter macOS应用WebSocket无法正常工作的问题排查
问题描述
以下WebSocket示例代码在iOS模拟器、Android模拟器及Chrome浏览器中运行正常,但作为macOS应用运行时无法正常工作。请问是否需要修改桌面应用的配置(比如Info.plist、Runner Workspace或其他位置)?
我的Flutter环境配置如下:
[✓] Flutter (Channel stable, 3.3.3, on macOS 12.6 21G115 darwin-arm, locale de-DE) [✓] Android toolchain - develop for Android devices (Android SDK version 32.1.0-rc1) [✓] Xcode - develop for iOS and macOS (Xcode 14.0.1)
示例代码
import 'package:flutter/material.dart'; import 'package:web_socket_channel/web_socket_channel.dart'; void main() => runApp(const MyApp()); class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { const title = 'WebSocket Demo'; return const MaterialApp( title: title, home: MyHomePage( title: title, ), ); } } class MyHomePage extends StatefulWidget { const MyHomePage({ super.key, required this.title, }); final String title; @override State<MyHomePage> createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { final TextEditingController _controller = TextEditingController(); late final WebSocketChannel _channel; @override void initState() { _channel = WebSocketChannel.connect( Uri.parse('wss://ws.postman-echo.com/raw'), ); super.initState(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: Padding( padding: const EdgeInsets.all(20.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Form( child: TextFormField( controller: _controller, decoration: const InputDecoration(labelText: 'Send a message'), ), ), const SizedBox(height: 24), StreamBuilder( stream: _channel.stream, builder: (context, snapshot) { return Text(snapshot.hasData ? '${snapshot.data}' : ''); }, ) ], ), ), floatingActionButton: FloatingActionButton( onPressed: _sendMessage, tooltip: 'Send message', child: const Icon(Icons.send), ), // 原代码此处缺少闭合括号,已补充 ); } void _sendMessage() { if (_controller.text.isNotEmpty) { _channel.sink.add(_controller.text); } } @override void dispose() { _channel.sink.close(); _controller.dispose(); super.dispose(); } }
问题根源与解决方案
问题出在macOS应用的网络权限配置上:macOS 10.14及以上版本要求应用明确声明网络访问权限,否则无法建立WebSocket连接。
需要修改macOS项目的Info.plist文件(路径:macos/Runner/Info.plist),添加以下配置:
添加网络权限描述
打开Info.plist,插入以下键值对(可通过Xcode可视化编辑或直接修改XML):<key>NSNetworkUsageDescription</key> <string>需要网络权限来与WebSocket服务器通信,实现消息收发功能</string>(可选)补充ATS配置(针对HTTPS连接异常场景)
虽然Postman的echo服务是标准HTTPS,默认ATS允许访问,但如果遇到连接问题,可添加以下配置确保兼容性:<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <false/> <key>NSAllowsArbitraryLoadsForMedia</key> <true/> <key>NSAllowsArbitraryLoadsInWebContent</key> <true/> </dict>
修改完成后重新编译运行macOS应用,WebSocket连接即可正常工作。
内容的提问来源于stack exchange,提问作者Vera Spöttl-Zeisberg
相关产品推荐
相关产品推荐

