Flutter实时通信插件pusher_client的使用
Flutter实时通信插件pusher_client的使用
Pusher Channels Flutter Client
这是一个针对Flutter的Pusher Channels客户端插件,支持Android和iOS平台。它包装了 pusher-websocket-java v2.2.5 和 pusher-websocket-swift v8.0.0。
更多关于Pusher Channels的教程和深入信息,请访问官方文档。
此客户端适用于官方Pusher服务器以及Laravel自托管的Pusher WebSocket服务器(laravel-websockets)。
支持的平台与部署目标
- Android API 16及以上
- iOS 9.0及以上
安装
在pubspec.yaml
文件中添加以下内容:
dependencies:
pusher_client: ^2.0.0
配置
iOS配置
在ios/Podfile
文件中设置最低部署目标为9.0,将以下行取消注释并修改:
platform :ios, '9.0'
如果你使用的是本地Pusher服务器(如laravel-websockets),可能会遇到订阅私有频道的问题。可以在ios/Runner/Info.plist
中添加如下代码解决:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
或者指定你将连接的域名:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>example.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
Android配置
如果你启用了R8或ProGuard代码混淆,在android/app/build.gradle
文件中添加以下规则:
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
然后在android/app/proguard-rules.pro
文件中添加:
-keep class com.github.chinloyal.pusher_client.** { *; }
API概览
以下是API的核心用法示例:
PusherOptions options = PusherOptions(
host: 'example.com',
wsPort: 6001,
encrypted: false,
auth: PusherAuth(
'http://example.com/auth',
headers: {
'Authorization': 'Bearer $token',
},
),
);
PusherClient pusher = PusherClient(
YOUR_APP_KEY,
options,
autoConnect: false
);
// connect at a later time than at instantiation.
pusher.connect();
pusher.onConnectionStateChange((state) {
print("previousState: ${state.previousState}, currentState: ${state.currentState}");
});
pusher.onConnectionError((error) {
print("error: ${error.message}");
});
// Subscribe to a private channel
Channel channel = pusher.subscribe("private-orders");
// Bind to listen for events called "order-status-updated" sent to "private-orders" channel
channel.bind("order-status-updated", (PusherEvent event) {
print(event.data);
});
// Unsubscribe from channel
pusher.unsubscribe("private-orders");
// Disconnect from pusher service
pusher.disconnect();
示例Demo
以下是一个完整的示例demo,展示了如何使用pusher_client
插件进行实时通信:
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:pusher_client/pusher_client.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
PusherClient pusher;
Channel channel;
@override
void initState() {
super.initState();
String token = getToken();
pusher = new PusherClient(
"app-key",
PusherOptions(
// if local on android use 10.0.2.2
host: 'localhost',
encrypted: false,
auth: PusherAuth(
'http://example.com/broadcasting/auth',
headers: {
'Authorization': 'Bearer $token',
},
),
),
enableLogging: true,
);
channel = pusher.subscribe("private-orders");
pusher.onConnectionStateChange((state) {
log("previousState: ${state.previousState}, currentState: ${state.currentState}");
});
pusher.onConnectionError((error) {
log("error: ${error.message}");
});
channel.bind('status-update', (event) {
log(event.data);
});
channel.bind('order-filled', (event) {
log("Order Filled Event" + event.data.toString());
});
}
String getToken() => "super-secret-token";
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Example Pusher App'),
),
body: Center(
child: Column(
children: [
ElevatedButton(
child: Text('Unsubscribe Private Orders'),
onPressed: () {
pusher.unsubscribe('private-orders');
},
),
ElevatedButton(
child: Text('Unbind Status Update'),
onPressed: () {
channel.unbind('status-update');
},
),
ElevatedButton(
child: Text('Unbind Order Filled'),
onPressed: () {
channel.unbind('order-filled');
},
),
ElevatedButton(
child: Text('Bind Status Update'),
onPressed: () {
channel.bind('status-update', (PusherEvent event) {
log("Status Update Event" + event.data.toString());
});
},
),
ElevatedButton(
child: Text('Trigger Client Typing'),
onPressed: () {
channel.trigger('client-istyping', {'name': 'Bob'});
},
),
],
)),
),
);
}
}
这个示例展示了如何创建一个简单的Flutter应用程序,并使用pusher_client
插件订阅和绑定到实时事件。通过点击按钮,你可以执行取消订阅、解除绑定事件、重新绑定事件以及触发客户端事件等操作。
更多关于Flutter实时通信插件pusher_client的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter实时通信插件pusher_client的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter应用中使用pusher_client
插件来实现实时通信的示例代码。pusher_client
是一个用于与Pusher服务进行实时通信的Flutter插件。
首先,确保你已经在pubspec.yaml
文件中添加了pusher_client
依赖:
dependencies:
flutter:
sdk: flutter
pusher_client: ^latest_version # 替换为最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,你可以在你的Flutter项目中配置和使用pusher_client
。以下是一个简单的示例,展示了如何连接到Pusher服务、订阅一个频道并处理事件。
主程序文件(main.dart
)
import 'package:flutter/material.dart';
import 'package:pusher_client/pusher_client.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
late PusherClient _pusherClient;
late Channel _channel;
String? _message;
@override
void initState() {
super.initState();
// 配置Pusher客户端
var options = PusherOptions(
cluster: 'your_cluster', // 替换为你的Pusher集群
key: 'your_app_key' // 替换为你的Pusher应用密钥
);
_pusherClient = PusherClient(options);
// 连接到Pusher
_pusherClient.connect().then((connection) {
print('Connected to Pusher!');
// 订阅频道
_channel = _pusherClient.subscribe('your_channel_name');
// 绑定事件监听器
_channel.bind('your_event_name', (data) {
setState(() {
_message = data['message']; // 假设事件数据中包含'message'字段
});
});
}).catchError((error) {
print('Error connecting to Pusher: $error');
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Pusher Client Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
_message ?? 'Waiting for messages...',
style: TextStyle(fontSize: 24),
),
],
),
),
),
);
}
@override
void dispose() {
// 断开连接并取消订阅
_pusherClient.disconnect();
_channel.unbind('your_event_name');
super.dispose();
}
}
注意事项
- 替换占位符:确保将
your_cluster
、your_app_key
、your_channel_name
和your_event_name
替换为你的实际Pusher配置和频道信息。 - 错误处理:在实际应用中,你应该添加更多的错误处理逻辑,以确保在连接失败或事件处理出错时能够妥善处理。
- 事件数据格式:示例中假设事件数据中包含一个
message
字段。根据你的实际事件数据格式,你可能需要调整解析逻辑。
这个示例展示了基本的实时通信功能,包括连接到Pusher服务、订阅频道和处理事件。你可以根据需求进一步扩展和定制这个示例。