Flutter实时通信插件pusher_client的使用

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

Flutter实时通信插件pusher_client的使用

Pusher Channels Flutter Client

pub version GitHub license Languages Twitter Follow

这是一个针对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

1 回复

更多关于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();
  }
}

注意事项

  1. 替换占位符:确保将your_clusteryour_app_keyyour_channel_nameyour_event_name替换为你的实际Pusher配置和频道信息。
  2. 错误处理:在实际应用中,你应该添加更多的错误处理逻辑,以确保在连接失败或事件处理出错时能够妥善处理。
  3. 事件数据格式:示例中假设事件数据中包含一个message字段。根据你的实际事件数据格式,你可能需要调整解析逻辑。

这个示例展示了基本的实时通信功能,包括连接到Pusher服务、订阅频道和处理事件。你可以根据需求进一步扩展和定制这个示例。

回到顶部