Flutter实时通信插件pusher_client_fixed的使用

发布于 1周前 作者 caililin 来自 Flutter

Flutter实时通信插件pusher_client_fixed的使用

概述

pusher_client_fixed 是一个用于Flutter应用的Pusher Channels客户端插件,支持Android和iOS平台。它封装了 pusher-websocket-javapusher-websocket-swift,允许开发者在Flutter应用中实现实时通信功能。

安装

在你的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  pusher_client_fixed: ^0.0.4

然后运行 flutter pub get 来安装插件。

配置

iOS配置

  1. ios/Podfile 中设置最低部署目标为9.0:

    platform :ios, '9.0'
    
  2. 如果你使用本地的Pusher服务器(如 laravel-websockets),需要在 ios/Runner/Info.plist 中添加以下内容:

    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </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.** { *; }

示例代码

以下是一个完整的示例,展示如何使用 pusher_client_fixed 插件来订阅私有频道并监听事件。

import 'dart:developer';

import 'package:flutter/material.dart';
import 'package:pusher_client_fixed/pusher_client_fixed.dart';

void main() {
  runApp(const MyApp());
}

const String appId = "1321495";
const String key = "037c47e0cbdc81fb7144";
const String cluster = "mt1";
const String hostEndPoint = "172.17.96.1";
const String hostAuthEndPoint = "http://$hostEndPoint/broadcasting/auth";
const String token = "2|2gAA0Z1w43jasatIFaw0MD3H8LSDeGIoK2sCtTDw6ac6eb51";
const String channelName = 'private-messages';
const String eventName = 'MessageCreatedEvent';

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late PusherClient pusherClient;
  late Channel channel;

  [@override](/user/override)
  void initState() {
    super.initState();
    initPusher();
  }

  void initPusher() {
    pusherClient = PusherClient(
      key,
      PusherOptions(
        cluster: cluster,
        auth: PusherAuth(
          hostAuthEndPoint,
          headers: {'Authorization': 'Bearer $token'},
        ),
      ),
      autoConnect: false,
      enableLogging: true,
    );

    pusherClient.connect();

    pusherClient.onConnectionStateChange((state) {
      log(
        "previousState: ${state?.previousState}, currentState: ${state?.currentState}, socketId: ${pusherClient.getSocketId()}",
      );
      if (state?.currentState == 'CONNECTED') {
        channel = pusherClient.subscribe(channelName);

        channel.bind(eventName, (event) {
          log('${event?.data}');
        });
      }
    });

    pusherClient.onConnectionError((error) {
      log("error: ${error?.message}");
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Flutter Pusher Client Example'),
        ),
        body: const Center(
          child: Text('Listening to Pusher events...'),
        ),
      ),
    );
  }

  [@override](/user/override)
  void dispose() {
    pusherClient.unsubscribe(channelName);
    pusherClient.disconnect();
    super.dispose();
  }
}

更多关于Flutter实时通信插件pusher_client_fixed的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter实时通信插件pusher_client_fixed的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用pusher_client_fixed插件来实现实时通信的示例代码。这个插件是Pusher Beams官方Flutter插件的一个修正版,用于处理WebSocket连接和事件订阅。

首先,确保你已经在pubspec.yaml文件中添加了pusher_client_fixed依赖:

dependencies:
  flutter:
    sdk: flutter
  pusher_client_fixed: ^x.y.z  # 请替换为最新版本号

然后,运行flutter pub get来安装依赖。

接下来,你可以在你的Flutter应用中如下使用pusher_client_fixed插件:

import 'package:flutter/material.dart';
import 'package:pusher_client_fixed/pusher_client_fixed.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  PusherClient? _pusherClient;
  String _channelName = 'my-channel';
  String _eventName = 'my-event';
  String _receivedMessage = '';

  @override
  void initState() {
    super.initState();
    initPusher();
  }

  void initPusher() {
    var options = PusherOptions(
      cluster: 'YOUR_PUSHER_CLUSTER', // 替换为你的Pusher集群
      key: 'YOUR_PUSHER_APP_KEY',     // 替换为你的Pusher应用密钥
      debug: true,
    );

    _pusherClient = PusherClient(options);

    _pusherClient!.connect().then((value) {
      print('Connected to Pusher!');

      var channel = _pusherClient!.subscribe(_channelName);
      channel.bind(_eventName, (data) {
        setState(() {
          _receivedMessage = data['message'];
        });
        print('Received event: $_eventName with data: $data');
      });
    }).catchError((error) {
      print('Error connecting to Pusher: $error');
    });
  }

  @override
  void dispose() {
    _pusherClient?.disconnect();
    super.dispose();
  }

  @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(
                'Received Message: $_receivedMessage',
                style: TextStyle(fontSize: 24),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 初始化Pusher客户端:在initPusher方法中,我们创建了PusherClient实例,并配置了Pusher集群和应用密钥。然后,我们连接到Pusher服务器。

  2. 订阅频道和事件:一旦连接成功,我们订阅了一个名为my-channel的频道,并绑定了一个名为my-event的事件。当事件触发时,我们更新UI以显示接收到的消息。

  3. 清理资源:在dispose方法中,我们断开了与Pusher的连接,以释放资源。

请注意,你需要将YOUR_PUSHER_CLUSTERYOUR_PUSHER_APP_KEY替换为你自己的Pusher集群和应用密钥。

这个示例代码展示了如何使用pusher_client_fixed插件进行基本的实时通信。根据你的需求,你可以进一步扩展这个示例,比如处理更多类型的事件、管理多个频道等。

回到顶部