Flutter推送通知插件ym_flutter_push的使用

Flutter推送通知插件ym_flutter_push的使用

起因

目前GitHub上搜索发现没有合适的Flutter和Android推送原生插件,所以我参考和借鉴了taoweiji/MixPush项目。这个mixpush太老了,我这边更新了不少,去除了不需要的部分,更新了最新的jar和aar。

大家有什么问题可以提issues。

功能

  • 支持vivo、oppo、华为、小米、apple
  • 目前支持获取到regId
  • 支持服务端发送推送打开应用首页和子页面(可以附加不同的schema或者intent参数)

集成方法

1. 库不需要修改,直接使用项目下的example

2. 修改example下如下地方

a. 在android目录下的gradle.properties 各个值即可:

EXAMPLE_APPLICATION_ID=com.xiaogongqiu.app
EXAMPLE_VIVO_APP_ID=XX
EXAMPLE_VIVO_APP_KEY=XX
EXAMPLE_MI_APP_ID=XX
EXAMPLE_MI_APP_KEY=XX
EXAMPLE_OPPO_APP_KEY=XX
EXAMPLE_OPPO_APP_SECRET=XX
EXAMPLE_MEIZU_APP_ID=XX
EXAMPLE_MEIZU_APP_KEY=XX

b. 修改android app目录下build.gradleandroid.jks是自己的apk签名,改成自己的就行:

signingConfigs {
    release {
        keyAlias 'key0'
        keyPassword "xxxx"
        storePassword "xxxx"
        storeFile file('android.jks')
    }
}

c. 替换改android app 目录下华为推送配置文件arconnect-services.json文件,替换成自己的。

d. 修改app/src/AndroidManifest.xml,包名改成自己的(这个是属于小米的部分配置):

<permission
    android:name="com.xiaogongqiu.app.permission.MIPUSH_RECEIVE"
    android:protectionLevel="signature" />
<uses-permission android:name="com.xiaogongqiu.app.permission.MIPUSH_RECEIVE" />

e. 这个属于定义打开的activity的scheme,可以自己定义,不过小米、vivo、oppo、华为有的使用时intent参数有的是使用scheme。

<intent-filter>
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <category android:name="android.intent.category.BROWSABLE"/>
    <data
        android:scheme="ymappscheme"
        android:host="com.xiaogongqiu.app"
        android:path="/message"
    />
</intent-filter>

示例代码

以下是一个完整的示例代码,展示了如何使用ym_flutter_push插件来接收推送通知并处理点击事件。

import 'package:app_links/app_links.dart'; // 引入处理深层链接的库
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:logger/logger.dart';
import 'package:ym_flutter_push/ym_flutter_push.dart';

void main() {
  runApp(const MyApp()); // 运行应用
}

class MyApp extends StatefulWidget {
  const MyApp({super.key}); // 构造函数

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState(); // 创建状态
}

class _MyAppState extends State<MyApp> {
  String _registerId = 'Unknown'; // 注册ID
  String _data = ""; // 数据
  Logger logger = Logger(); // 日志记录器

  Future<void> init() async { // 初始化函数
    // 监听事件通道
    YmFlutterPush().eventChannel.receiveBroadcastStream().listen((event) {
      logger.i('-------------recv push message from remote---: $event'); // 记录日志
      setState(() {
        _data = event.toString(); // 更新数据
      });
    });

    // 获取注册ID
    var registerId = await YmFlutterPush().getRegisterInfo();
    logger.i('-------------registerId: $registerId'); // 记录日志
    setState(() {
      _registerId = registerId.toString(); // 更新注册ID
    });

    // 监听URI链接流
    AppLinks().uriLinkStream.listen((uri) {
      // 执行操作(导航等)
      logger.i('-------------uri: $uri'); // 记录日志
      setState(() {
        _data = uri.toString(); // 更新数据
      });
    });
  }

  [@override](/user/override)
  void initState() {
    init(); // 初始化
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'), // 设置标题
        ),
        body: Center(
          child: Column(
            children: [
              Text('Running on: $_registerId\n'), // 显示注册ID
              SizedBox(
                height: 10,
              ),
              Text('Running on: $_data\n') // 显示数据
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter推送通知插件ym_flutter_push的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


当然,以下是一个关于如何使用 ym_flutter_push 插件在 Flutter 应用中实现推送通知的示例代码。这个插件通常用于集成云之讯(或其他支持的服务)的推送服务。

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加 ym_flutter_push 依赖:

dependencies:
  flutter:
    sdk: flutter
  ym_flutter_push: ^最新版本号  # 请替换为最新版本号

然后运行 flutter pub get 来获取依赖。

2. 配置 Android

android/app/src/main/AndroidManifest.xml 中添加必要的权限和服务声明:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <!-- 其他配置 -->

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

    <application
        android:name=".YourApplication"  <!-- 确保你的 Application 类在这里被引用 -->
        ... >

        <!-- 注册推送服务 -->
        <service
            android:name="com.yunmall.flutterpush.YMFlutterPushService"
            android:exported="true">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>

        <receiver android:name="com.yunmall.flutterpush.YMFlutterPushReceiver"
            android:exported="true">
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <category android:name="com.example.yourapp" />
            </intent-filter>
        </receiver>

        <!-- 其他配置 -->

    </application>
</manifest>

确保你有一个自定义的 Application 类,并在其中初始化插件:

// android/app/src/main/kotlin/com/example/yourapp/YourApplication.kt
package com.example.yourapp

import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant
import com.yunmall.flutterpush.YMFlutterPushPlugin

import android.app.Application

class YourApplication: Application() {
    override fun onCreate() {
        super.onCreate()
        YMFlutterPushPlugin.registerWith(registrarFor("com.yunmall.flutterpush.YMFlutterPushPlugin"))
    }

    private fun registrarFor(pluginId: String): Registrar {
        val flutterEngine = FlutterEngine(this)
        flutterEngine.navigationChannel.setInitialRoute("/")
        flutterEngine.dartExecutor.executeDartEntrypoint(
            DartExecutor.DartEntrypoint.createDefault()
        )
        return object : Registrar {
            override fun lookupKeyForAsset(asset: String?): String? = null
            override fun registrarFor(pluginKey: String?): Registrar? = if (pluginKey == pluginId) this else null
            override fun activity(): FlutterActivity? = null
            override fun context(): android.content.Context = applicationContext
            override fun view(): android.view.View? = null
            override fun requestPermissionsResult(
                requestCode: Int,
                permissions: Array<out String>,
                grantResults: IntArray
            ) {}
            override fun addActivityResultListener(listener: ActivityResultListener?) {}
            override fun <T : FlutterPlugin?> getPlugin(key: String?): T? = null
            override fun engine(): FlutterEngine = flutterEngine
        }
    }
}

注意:上述 Kotlin 代码仅用于演示目的,实际使用时可能需要调整以适应你的项目结构。

3. 配置 iOS

对于 iOS,你需要在 Info.plist 中添加必要的配置,并确保在 AppDelegate 中初始化插件(尽管 Flutter 插件通常会自动处理这部分)。

4. 使用插件

在你的 Flutter 代码中初始化并使用 ym_flutter_push 插件:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Push Notification Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('等待推送通知...'),
              ElevatedButton(
                onPressed: _initializePush,
                child: Text('初始化推送服务'),
              ),
            ],
          ),
        ),
      ),
    );
  }

  Future<void> _initializePush() async {
    try {
      // 初始化推送插件,传入必要的参数(如 AppKey 等)
      await YMFlutterPush.init(
        appKey: '你的AppKey',  // 替换为你的实际 AppKey
        channel: 'default_channel',  // 替换为你的通道名称
      );
      print('推送服务初始化成功');
    } catch (e) {
      print('推送服务初始化失败: $e');
    }
  }
}

注意事项

  1. AppKey 和其他配置参数需要根据你的推送服务提供商的文档进行配置。
  2. 上述代码示例仅用于演示,实际项目中可能需要根据具体需求进行调整。
  3. 确保你的项目已经正确配置了推送服务的后台部分(如服务器端的配置)。

这个示例展示了如何在 Flutter 应用中使用 ym_flutter_push 插件进行推送通知的初始化。根据你的具体需求,你可能还需要处理推送消息的接收和处理逻辑。

回到顶部