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.gradle
,android.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
更多关于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');
}
}
}
注意事项
- AppKey 和其他配置参数需要根据你的推送服务提供商的文档进行配置。
- 上述代码示例仅用于演示,实际项目中可能需要根据具体需求进行调整。
- 确保你的项目已经正确配置了推送服务的后台部分(如服务器端的配置)。
这个示例展示了如何在 Flutter 应用中使用 ym_flutter_push
插件进行推送通知的初始化。根据你的具体需求,你可能还需要处理推送消息的接收和处理逻辑。