Flutter推送服务插件mobpush_plugin的使用

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

Flutter推送服务插件mobpush_plugin的使用

这是一个基于MobPush功能的扩展的Flutter插件。使用此插件能够帮助您在使用Flutter开发应用时,快速地实现推送功能。

插件主页:https://pub.dartlang.org/packages/mobpush_plugin

Demo例子:https://github.com/MobClub/MobPush-for-Flutter/mobpush_plugin

注意:老版本插件mobpush(https://pub.dartlang.org/packages/mobpush)不再更新,请使用当前插件mobpush_plugin(https://pub.dartlang.org/packages/mobpush_plugin)

开始集成

1. 在pubspec.yaml文件中加入下面依赖

dependencies:
  mobpush_plugin:

然后执行:flutter packages get导入package

在你的dart工程文件中,导入下面头文件,开始使用

import 'package:mobpush_plugin/mobpush_plugin.dart';

2. iOS平台配置

参考iOS集成文档

实现 1: 获取appKey和appSecret

实现 5.1: 配置appkey和appSecret

3. Android平台配置

导入MobPush相关依赖

在项目根目录的build.gradle中添加以下代码:

dependencies {
    classpath 'com.android.tools.build:gradle:3.2.1'
    classpath 'com.mob.sdk:MobSDK:+'
    classpath 'com.google.gms:google-services:4.0.1' // 不需要FCM厂商推送无需配置
}

/android/app/build.gradle中添加以下代码:

apply plugin: 'com.android.application'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
// 导入MobSDK
apply plugin: 'com.mob.sdk'

MobSDK {
    appKey "您的Mob平台appKey"
    appSecret "您的Mob平台appSecret"

    // 配置MobPush
    MobPush {
        // 配置厂商推送(可选配置,不需要厂商推送可不配置,需要哪些厂商推送只需配置哪些厂商配置即可)
        devInfo {
            // 配置小米厂商推送
            XIAOMI {
                appId "您的小米平台appId"
                appKey "您的小米平台appKey"
            }

            // 配置华为厂商推送
            HUAWEI {
                appId "您的华为平台appId"
            }

            // 配置魅族厂商推送
            MEIZU {
                appId "您的魅族平台appId"
                appKey "您的魅族平台appKey"
            }

            // 配置FCM厂商推送
            FCM {
                // 设置默认推送通知显示图标
                iconRes "@mipmap/default_ic_launcher"
            }

            // 配置OPPO厂商推送
            OPPO {
                appKey "您的OPPO平台appKey"
                appSecret "您的OPPO平台appSecret"
            }

            // 配置VIVO厂商推送
            VIVO {
                appId "您的VIVO平台appId"
                appKey "您的VIVO平台appKey"
            }
        }
    }
}

MainActivityonCreate中添加以下代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GeneratedPluginRegistrant.registerWith(this);
}

在项目的/android/app/AndroidManifest.xml文件中添加:

<application
    android:name=".CustomApplication"
    ... >
    ...
</application>

接口方法说明

(1)设置隐私协议授权状态:

MobpushPlugin.updatePrivacyPermissionStatus(true);

(2)设置远程推送环境,向用户授权(仅iOS):

if (Platform.isIOS) {
    MobpushPlugin.setCustomNotification();
}

(3)设置远程推送环境(仅iOS):

if (Platform.isIOS) {
    // 开发环境 false, 线上环境 true
    MobpushPlugin.setAPNsForProduction(false);
}

(4)添加推送回调监听(接收自定义透传消息回调、接收通知消息回调、接收点击通知消息回调)

MobpushPlugin.addPushReceiver(_onEvent, _onError);

void _onEvent(Object event) {
    print('&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;onEvent:' + event.toString());
}

void _onError(Object event) {
    print('&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;onError:' + event.toString());
}

(5)停止推送

MobpushPlugin.stopPush();

(6)重新打开推送服务

MobpushPlugin.restartPush();

(7)是否已停止接收推送

MobpushPlugin.isPushStopped();

(8)设置别名

MobpushPlugin.setAlias("别名").then((Map<String, dynamic> aliasMap) {
    String res = aliasMap['res'];
    String error = aliasMap['error'];
    print("&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; setAlias -&gt; res: $res error: $error");
});

(9)获取别名

MobpushPlugin.getAlias().then((Map<String, dynamic> aliasMap) {
    String res = aliasMap['res'];
    String error = aliasMap['error'];
    print("&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; getAlias -&gt; res: $res error: $error");
});

(10)删除别名

MobpushPlugin.deleteAlias("别名").then((Map<String, dynamic> aliasMap) {
    String res = aliasMap['res'];
    String error = aliasMap['error'];
    print("&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; deleteAlias -&gt; res: $res error: $error");
});

(11)添加标签

List<String> tags = ["tag1", "tag2"];
MobpushPlugin.addTags(tags).then((Map<String, dynamic> tagsMap) {
    String res = tagsMap['res'];
    String error = tagsMap['error'];
    print("&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; addTags -&gt; res: $res error: $error");
});

(12)获取标签

MobpushPlugin.getTags().then((Map<String, dynamic> tagsMap) {
    List<String> resList = List<String>.from(tagsMap['res']);
    String error = tagsMap['error'];
    print("&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; getTags -&gt; res: $resList error: $error");
});

(13)删除标签

List<String> tags = ["tag1", "tag2"];
MobpushPlugin.deleteTags(tags).then((Map<String, dynamic> tagsMap) {
    String res = tagsMap['res'];
    String error = tagsMap['error'];
    print("&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; deleteTags -&gt; res: $res error: $error");
});

(14)清空标签

MobpushPlugin.cleanTags().then((Map<String, dynamic> tagsMap) {
    String res = tagsMap['res'];
    String error = tagsMap['error'];
    print("&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; cleanTags -&gt; res: $res error: $error");
});

(15)发送本地通知

MobpushPlugin.addLocalNotification();

(16)绑定手机号

MobpushPlugin.bindPhoneNum("110");

(17)测试模拟推送,用于测试

/**
* 测试模拟推送,用于测试
* type:模拟消息类型,1、通知测试;2、内推测试;3、定时
* content:模拟发送内容,500字节以内,UTF-8
* space:仅对定时消息有效,单位分钟,默认1分钟
* extras: 附加数据,json字符串
*/
MobpushPlugin.send(int type, String content, int space, String extras).then((Map<String, dynamic> sendMap) {
    String res = sendMap['res'];
    String error = sendMap['error'];
    print("&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; send -&gt; res: $res error: $error");
});

(18)设置点击通知是否跳转默认页(仅Android)

MobpushPlugin.setClickNotificationToLaunchMainActivity(bool enable);

(19)移除本地通知(仅Android)

MobpushPlugin.removeLocalNotification(int notificationId);

(20)清空本地通知(仅Android)

MobpushPlugin.clearLocalNotifications();

(21)设置通知栏icon,不设置默认取应用icon(仅Android)

MobpushPlugin.setNotifyIcon(String resId);

(22)设置应用在前台时是否隐藏通知不进行显示,不设置默认不隐藏通知(仅Android)

MobpushPlugin.setAppForegroundHiddenNotification(bool hidden);

(23)设置通知静音时段(推送选项)(仅Android)

/**
* 设置通知静音时段(推送选项)(仅Android)
* @param startHour   开始时间[0~23] (小时)
* @param startMinute 开始时间[0~59](分钟)
* @param endHour     结束时间[0~23](小时)
* @param endMinute   结束时间[0~59](分钟)
*/
MobpushPlugin.setSilenceTime(int startHour, int startMinute, int endHour, int endMinute);

(24)设置角标(仅iOS)

MobpushPlugin.setBadge(int badge);

(25)清空角标,不清除通知栏消息记录(仅iOS)

MobpushPlugin.clearBadge();

(26)获取注册Id

MobpushPlugin.getRegistrationId().then((Map<String, dynamic> ridMap) {
    print(ridMap);
    String regId = ridMap['res'].toString();
    print('------&gt;#### registrationId: ' + regId);
});

技术支持

如有问题请联系技术支持:

服务电话: 400-685-2216
QQ: 4006852216
节假日值班电话:
iOS:185-1664-1951
Android: 185-1664-1950
电子邮箱: support@mob.com
市场合作: 021-54623100


示例代码

import 'dart:convert';
import 'dart:ffi';
import 'dart:io';

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

import 'package:flutter/services.dart';
import 'package:mobpush_plugin/mobpush_plugin.dart';
import 'package:mobpush_plugin/mobpush_custom_message.dart';
import 'package:mobpush_plugin/mobpush_notify_message.dart';
import 'app_notify_page.dart';
import 'click_container.dart';
import 'local_notify_page.dart';
import 'notify_page.dart';
import 'other_api_page.dart';
import 'timing_notify_page.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: MainApp(),
    );
  }
}

class MainApp extends StatefulWidget {
  [@override](/user/override)
  _MainAppState createState() {
    return _MainAppState();
  }
}

class _MainAppState extends State<MainApp> {
  String _sdkVersion = 'Unknown';
  String _registrationId = 'Unknown';

  [@override](/user/override)
  void initState() {
    super.initState();
    // 上传隐私协议许可
    MobpushPlugin.updatePrivacyPermissionStatus(true).then((value) {
      print("&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;updatePrivacyPermissionStatus:" + value.toString());
    });
    if (Platform.isIOS) {
      // 设置地区:regionId 默认0(国内),1:海外
      MobpushPlugin.setRegionId(1);
      MobpushPlugin.registerApp("3276d3e413040", "4280a3a6df667cfce37528dec03fd9c3");
    }

    initPlatformState();

    if (Platform.isIOS) {
      MobpushPlugin.setCustomNotification();
      MobpushPlugin.setAPNsForProduction(true);
    }
    MobpushPlugin.addPushReceiver(_onEvent, _onError);

  }

  void _onEvent(dynamic event) {
    print('&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;onEvent:' + event.toString());
    setState(() {
      Map<String, dynamic> eventMap = json.decode(event as String);
      Map<String, dynamic> result = eventMap['result'];
      int action = eventMap['action'];

      switch (action) {
        case 0:
          MobPushCustomMessage message = new MobPushCustomMessage.fromJson(result);
          showDialog(
              context: context,
              builder: (context) {
                return AlertDialog(
                  content: Text(message.content),
                  actions: <Widget>[
                    TextButton(
                      onPressed: () {
                        Navigator.pop(context);
                      },
                      child: Text("确定")
                    )
                  ],
                );
          });
          break;
        case 1:
          MobPushNotifyMessage message = new MobPushNotifyMessage.fromJson(result);
          break;
        case 2:
          MobPushNotifyMessage message = new MobPushNotifyMessage.fromJson(result);
          break;
      }
    });
  }

  void _onError(dynamic event) {
    setState(() {
      print('&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;onError:' + event.toString());
    });
  }

  void _onAppNotifyPageTap() {
    setState(() {
      Navigator.push(context,
          new MaterialPageRoute(builder: (context) => new AppNotifyPage()));
    });
  }

  void _onNotifyPageTap() {
    setState(() {
      Navigator.push(context,
          new MaterialPageRoute(builder: (context) => new NotifyPage()));
    });
  }

  void _onTimingNotifyPageTap() {
    setState(() {
      Navigator.push(context,
          new MaterialPageRoute(builder: (context) => new TimingNotifyPage()));
    });
  }

  void _onLocalNotifyPageTap() {
    setState(() {
      Navigator.push(context,
          new MaterialPageRoute(builder: (context) => new LocalNotifyPage()));
    });
  }

  void _onOtherAPITap() {
    setState(() {
      Navigator.push(context,
          new MaterialPageRoute(builder: (context) => new OtherApiPage()));
    });
  }

  Future<void> initPlatformState() async {
    String sdkVersion;
    try {
      sdkVersion = await MobpushPlugin.getSDKVersion();
    } on PlatformException {
      sdkVersion = 'Failed to get platform version.';
    }
    try {
      Future.delayed(Duration(milliseconds: 500),(){
        MobpushPlugin.getRegistrationId().then((Map<String, dynamic> ridMap) {
          print(ridMap);
          setState(() {
            _registrationId = ridMap['res'].toString();
            print('------&gt;#### registrationId: ' + _registrationId);
          });
        });
      });

    } on PlatformException {
      _registrationId = 'Failed to get registrationId.';
    }

    // 如果窗口在异步平台消息飞行时被从树中移除,我们想丢弃回复而不是调用
    // 更新我们的不存在的外观。
    if (!mounted) return;

    setState(() {
      _sdkVersion = sdkVersion;
    });
  }

  // 复制到剪切板
  void _onCopyButtonClicked() {
    // 写入剪切板
    Clipboard.setData(ClipboardData(text: _registrationId));
    // 验证是否写入成功
    Clipboard.getData(Clipboard.kTextPlain).then((data) {
      if (data != null) {
        String? text = data.text;
        print('------&gt;#### copyed registrationId: $text');
        if (text == _registrationId) {
          showDialog(
              context: context,
              builder: (context) {
                return AlertDialog(
                  title: Text("恭喜🎉"),
                  content: Container(
                    margin: EdgeInsets.only(top: 10, bottom: 30),
                    child: Text('复制成功!'),
                  ),
                  actions: <Widget>[
                    new TextButton(onPressed: () {
                      Navigator.pop(context);
                    }, child: Text("OK"))
                  ],
                );
              }
          );
        }
      }
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('MobPushPlugin Demo'),
        ),
        body: Column(
          children: <Widget>[
            Expanded(
              child: Row(
                children: <Widget>[
                  Expanded(
                    child: ClickContainer(
                      content: 'App内推送',
                      res: 'assets/images/ic_item_app_nitify.png',
                      left: 15.0,
                      top: 15.0,
                      right: 7.5,
                      bottom: 7.5,
                      onTap: _onAppNotifyPageTap,
                    ),
                  ),
                  Expanded(
                    child: ClickContainer(
                      content: '通知',
                      res: 'assets/images/ic_item_notify.png',
                      left: 7.5,
                      top: 15.0,
                      right: 15.0,
                      bottom: 7.5,
                      onTap: _onNotifyPageTap,
                    ),
                  ),
                ],
              ),
            ),
            Expanded(
              child: Row(
                children: <Widget>[
                  Expanded(
                    child: ClickContainer(
                      content: '定时推送',
                      res: 'assets/images/ic_item_timing.png',
                      left: 15.0,
                      top: 7.5,
                      right: 7.5,
                      bottom: 7.5,
                      onTap: _onTimingNotifyPageTap,
                    ),
                  ),
                  Expanded(
                    child: ClickContainer(
                      content: '本地通知',
                      res: 'assets/images/ic_item_local.png',
                      left: 7.5,
                      top: 7.5,
                      right: 15.0,
                      bottom: 7.5,
                      onTap: _onLocalNotifyPageTap,
                    ),
                  ),
                ],
              ),
            ),
            Expanded(
              child: Row(
                children: <Widget>[
                  Expanded(
                    child: ClickContainer(
                      content: '其他API接口',
                      res: 'assets/images/ic_item_media.png',
                      left: 15.0,
                      top: 7.5,
                      right: 15.0,
                      bottom: 7.5,
                      onTap: _onOtherAPITap,
                    ),
                  ),
                ],
              ),
            ),
            Container(
              margin: EdgeInsets.only(left: 15.0, right: 15.0, bottom: 15.0),
              height: 60,
              child: Row(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: <Widget>[
                  Text(
                    'SDK Version: $_sdkVersion\nRegistrationId: $_registrationId',
                    style: TextStyle(fontSize: 12),
                  ),
                  ElevatedButton(
                    child: Text('复制'),
                    onPressed: _onCopyButtonClicked,
                  )
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用mobpush_plugin来实现推送服务的代码示例。请注意,这只是一个基本示例,具体实现可能需要根据你的项目需求进行调整。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  mobpush_plugin: ^最新版本号  # 请替换为实际的最新版本号

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

2. 配置Android和iOS

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.RECEIVE_BOOT_COMPLETED"/>
    <uses-permission android:name="android.permission.VIBRATE"/>

    <!-- MobPush配置 -->
    <application
        ...>
        
        <!-- MobPush接收推送消息的服务 -->
        <service
            android:name="com.mob.push.android.receivers.MobPushMessageReceiver"
            android:exported="true">
            <intent-filter>
                <action android:name="com.mob.push.ACTION_MESSAGE" />
            </intent-filter>
        </service>
        
        <!-- 其他配置 -->
        ...
    </application>
</manifest>
  • android/app/build.gradle中添加必要的配置(例如,申请推送权限等,具体配置请参考MobPush官方文档)。

iOS配置

  • ios/Runner/Info.plist中添加必要的配置,如推送权限请求等。
<key>UIBackgroundModes</key>
<array>
    <string>remote-notification</string>
</array>
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
  • 在Xcode中配置推送证书和MobPush相关的配置(具体步骤请参考MobPush官方文档)。

3. 初始化并使用MobPush

在你的Flutter代码中初始化并使用mobpush_plugin

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

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

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

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    // 初始化MobPush
    _initMobPush();
  }

  Future<void> _initMobPush() async {
    try {
      // 替换为你的AppKey和AppSecret
      String appKey = "你的AppKey";
      String appSecret = "你的AppSecret";
      await MobPushPlugin.init(appKey: appKey, appSecret: appSecret);

      // 监听推送消息
      MobPushPlugin.onMessageReceived.listen((message) {
        print("收到推送消息: $message");
        // 在这里处理推送消息,例如显示通知等
      });

      // 注册推送服务(对于iOS,这一步是必需的)
      if (Platform.isIOS) {
        await MobPushPlugin.registerDevice();
      }
    } catch (e) {
      print("MobPush初始化失败: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('MobPush Demo'),
        ),
        body: Center(
          child: Text('MobPush已初始化'),
        ),
      ),
    );
  }
}

注意事项

  1. AppKey和AppSecret:确保你使用的是正确的AppKey和AppSecret,这些是在MobPush控制台申请的。
  2. 权限请求:在Android和iOS上,你需要在运行时请求必要的权限(例如推送权限)。
  3. 错误处理:在实际项目中,你应该添加更多的错误处理和日志记录,以便更好地调试和维护。

这个示例展示了如何在Flutter项目中集成和使用mobpush_plugin。根据你的项目需求,你可能需要进一步的配置和功能实现。请参考MobPush的官方文档以获取更多信息和高级功能。

回到顶部