Flutter阿里云推送服务插件aliyun_push_flutter的使用

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

Flutter阿里云推送服务插件aliyun_push_flutter的使用

1. 快速入门

1.1 创建应用 在 EMAS 平台创建应用,请参见 快速入门

1.2.1 Android 配置 在 Flutter 工程的 android 模块下的 AndroidManifest.xml 文件中设置 AppKey、AppSecret:

<application android:name="*****">
    <!-- 请填写你自己的 appKey -->
    <meta-data android:name="com.alibaba.app.appkey" android:value="*****"/>
    <!-- 请填写你自己的appSecret -->
    <meta-data android:name="com.alibaba.app.appsecret" android:value="****"/>
</application>

注意: AppKey 和 AppSecret 请务必写在 <application> 标签下,否则 SDK 会报找不到 AppKey 的错误。

1.1.2 接收推送消息 Receiver 配置 将该 receiver 添加到 AndroidManifest.xml 文件中:

&lt;receiver
    android:name="com.aliyun.ams.push.AliyunPushMessageReceiver"
    android:exported="false"&gt;
    &lt;intent-filter&gt;
        &lt;action android:name="com.alibaba.push2.action.NOTIFICATION_OPENED" /&gt;
    &lt;/intent-filter&gt;
    &lt;intent-filter&gt;
        &lt;action android:name="com.alibaba.push2.action.NOTIFICATION_REMOVED" /&gt;
    &lt;/intent-filter&gt;
    &lt;intent-filter&gt;
        &lt;action android:name="com.alibaba.sdk.android.push.RECEIVE" /&gt;
    &lt;/intent-filter&gt;
&lt;/receiver&gt;

注意: android:exported=true 必须配置

1.1.3 辅助弹窗 Activity 配置 将辅助弹窗 Activity 添加到 AndroidManifest.xml 文件中:

&lt;activity
    android:name="com.aliyun.ams.push.PushPopupActivity"
    android:exported="true"&gt;
    &lt;intent-filter&gt;
        &lt;action android:name="android.intent.action.VIEW" /&gt;
        &lt;category android:name="android.intent.category.DEFAULT" /&gt;
        &lt;category android:name="android.intent.category.BROWSABLE" /&gt;

        &lt;data
            android:host="${applicationId}"
            android:path="/thirdpush"
            android:scheme="agoo" /&gt;
    &lt;/intent-filter&gt;
&lt;/activity&gt;

注意: android:exported=true 必须配置

1.1.4 混淆配置 如果您的项目中使用 Proguard 等工具做了代码混淆,请保留以下配置:

-keepclasseswithmembernames class ** {
    native &lt;methods&gt;;
}
-keepattributes Signature
-keep class sun.misc.Unsafe { *; }
-keep class com.taobao.** {*;}
-keep class com.alibaba.** {*;}
-keep class com.alipay.** {*;}
-keep class anet.**{*;}
-keep class anetwork.**{*;}
-keep class org.android.spdy.**{*;}
-keep class org.android.agoo.**{*;}
-keep class android.os.**{*;}
-keep class org.json.**{*;}
-dontwarn com.taobao.**
-dontwarn com.alibaba.**
-dontwarn com.alipay.**
-dontwarn anet.**
-dontwarn org.android.spdy.**
-dontwarn org.android.agoo.**
-dontwarn anetwork.**
-dontwarn com.ut.**
-dontwarn com.ta.**
-dontwarn anet.**
-dontwarn org.android.spdy.**
-dontwarn org.android.agoo.**
-dontwarn anetwork.**
-dontwarn com.ut.**
-dontwarn com.ta.**

3.1.2 辅助通道集成 在国内 Android 生态中,推送通道都是由终端与云端之间的长链接来维持,非常依赖于应用进程的存活状态。如今一些手机厂家会在自家 ROM 中做系统级别的推送通道,再由系统分发给各个 App,以此提高在自家 ROM 上的推送送达率。

移动推送针对小米、华为、荣耀、vivo、OPPO、魅族、谷歌等设备管控较严的情况,分别接入了相应的设备厂商推送辅助通道以提高这些设备上的到达率。

辅助通道的集成可参考 辅助通道集成

在 Flutter 工程的 android 模块下的 AndroidManifest.xml 文件中设置各个辅助通道的配置参数:

<application android:name="*****">
      <!-- 华为通道的参数appid -->
      <meta-data android:name="com.huawei.hms.client.appid" android:value="appid=xxxxx" />

      <!-- vivo通道的参数api_key为appkey -->
      <meta-data android:name="com.vivo.push.api_key" android:value="" />
      <meta-data android:name="com.vivo.push.app_id" android:value="" />

      <!-- honor通道的参数 -->
      <meta-data android:name="com.hihonor.push.app_id" android:value="" />

      <!-- oppo -->
      <meta-data android:name="com.oppo.push.key" android:value="" />
      <meta-data android:name="com.oppop.push.secret" android:value="" />
      <!-- 小米 -->
      <meta-data android:name="com.xiaomi.push.id" android:value="" />
      <meta-data android:name="com.xiaomi.push.key" android:value="" />

      <!-- 魅族 -->
      <meta-data android:name="com.meizu.push.id" android:value="" />
      <meta-data android:name="com.meizu.push.key" android:value="" />

      <!-- fcm -->
      <meta-data android:name="com.gcm.push.sendid" android:value="" />
      <meta-data android:name="com.gcm.push.applicationid" android:value="" />
      <meta-data android:name="com.gcm.push.projectid" android:value="" />
      <meta-data android:name="com.gcm.push.api.key" android:value="" />
</application>

注意:

  1. 华为通道的com.huawei.hms.client.appid参数值的格式是appid=xxxx,有个前缀appid=
  2. 小米通道的com.xiaomi.push.idcom.xiaomi.push.key的值一般都是长数字,如果直接配置原始值,系统读取时会自动判断成 long 类型,但是 AndroidManifest 中的 meta-data 是不支持 long 类型的,这样就会造成插件读取到的值和实际值不一致,进而导致小米通道初始化失败。
  3. fcm 通道的com.gcm.push.sendid值也是长数字,同样会导致插件读取时出错。

解决办法:

  1. 配置时在原始值前方加入id=,插件会自动解析并读取原始值。
<application android:name="*****">
      <!-- 小米 -->
      <meta-data android:name="com.xiaomi.push.id" android:value="id=2222222222222222222" />
      <meta-data android:name="com.xiaomi.push.key" android:value="id=5555555555555" />

      <!-- fcm -->
      <meta-data android:name="com.gcm.push.sendid" android:value="id=999999999999" />
</application>

3.2 iOS 3.2.1 推送配置ios/Runner/Info.plist 中添加推送权限配置:

&lt;key&gt;UIBackgroundModes&lt;/key&gt;
&lt;array&gt;
  &lt;string&gt;fetch&lt;/string&gt;
  &lt;string&gt;remote-notification&lt;/string&gt;
&lt;/array&gt;

3.2.2 Objc 配置 使用 Xcode 打开 Flutter 工程的 iOS 模块,需要做 -Objc 配置,即应用的 TARGETS -> Build Settings -> Linking -> Other Linker Flags ,需添加上 -ObjC 这个属性,否则推送服务无法正常使用。

Other Linker Flags 中设定链接器参数-ObjC,加载二进制文件时,会将 Objective-C 类和 Category 一并载入 ,若工程依赖多个三方库 ,将所有 Category 一并加载后可能发生冲突,可以使用 -force_load 单独载入指定二进制文件,配置如下:

-force_load&lt;framework_path&gt;/CloudPushSDK.framework/CloudPushSDK

2. API 示例

initPush


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

1 回复

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


在Flutter中使用阿里云推送服务插件 aliyun_push_flutter,可以通过以下步骤来实现。以下是一个基本的代码案例,展示了如何集成和使用该插件。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 aliyun_push_flutter 依赖:

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

然后运行 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.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.VIBRATE"/>

    <application
        android:name=".MyApplication" <!-- 替换为你的Application类 -->
        ... >

        <!-- 其他配置 -->

        <meta-data
            android:name="com.aliyun.ams.AppId"
            android:value="你的阿里云AppId" /> <!-- 替换为你的AppId -->
        <meta-data
            android:name="com.taobao.android.auth.TB_APP_KEY"
            android:value="你的淘宝AppKey" /> <!-- 替换为你的淘宝AppKey -->
        <service
            android:name="com.aliyun.ams.CloudPushService"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.aliyun.push.ACTION_MESSAGE_RECEIVED" />
                <action android:name="com.aliyun.push.ACTION_NOTIFICATION_CLICKED" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </service>
        <receiver android:name="com.aliyun.ams.NotificationOpenReceiver"
            android:exported="true">
            <intent-filter>
                <action android:name="com.aliyun.push.ACTION_NOTIFICATION_OPENED" />
            </intent-filter>
        </receiver>

    </application>
</manifest>
  • 创建或修改 MyApplication 类(确保它继承自 Application),并在其中初始化阿里云推送服务:
package com.example.yourapp;

import android.app.Application;
import com.aliyun.ams.CloudPushClient;
import io.flutter.embedding.android.FlutterActivity;

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        CloudPushClient.init(this);
        // 其他初始化代码
    }
}

iOS配置

  • ios/Runner/Info.plist 文件中添加必要的配置:
<dict>
    <!-- 其他配置 -->
    <key>AliyunPushTarget</key>
    <string>your_target</string> <!-- 替换为你的目标值 -->
    <key>LSApplicationQueriesSchemes</key>
    <array>
        <string>msauthv2</string>
        <string>com.aliyun.ams</string>
        <!-- 其他需要的scheme -->
    </array>
</dict>
  • ios/Runner/AppDelegate.swiftAppDelegate.m 中配置阿里云推送服务(这里以Swift为例):
import UIKit
import Flutter
import aliyun_push_flutter  // 导入阿里云推送插件

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
    override func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        GeneratedPluginRegistrant.register(with: self)
        // 初始化阿里云推送服务(具体代码根据阿里云SDK文档调整)
        // AliyunPushClient.shared().init(appKey: "你的AppKey", appSecret: "你的AppSecret")
        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
    }
}

注意:iOS的配置可能需要更多步骤,具体请参考阿里云推送服务的官方文档。

3. 使用aliyun_push_flutter插件

在Flutter代码中,你可以使用 aliyun_push_flutter 插件来注册设备、处理推送消息等。以下是一个简单的示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('aliyun_push_flutter Demo'),
        ),
        body: Center(
          child: MyHomePage(),
        ),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  void initState() {
    super.initState();
    // 注册设备
    _registerDevice();

    // 监听推送消息
    AliyunPushFlutter.onMessageReceived.listen((message) {
      print('Received message: $message');
    });

    // 监听点击通知事件
    AliyunPushFlutter.onNotificationClicked.listen((notification) {
      print('Notification clicked: $notification');
    });
  }

  Future<void> _registerDevice() async {
    try {
      String deviceId = await AliyunPushFlutter.registerDevice();
      print('Device registered with ID: $deviceId');
    } catch (e) {
      print('Error registering device: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Text('Check the console for device registration and push messages.');
  }
}

注意事项

  1. 权限处理:确保在Android和iOS项目中正确处理了所需的权限。
  2. 依赖版本:检查并更新 aliyun_push_flutter 插件到最新版本,以避免兼容性问题。
  3. 详细配置:根据阿里云推送服务的官方文档,可能还需要进行其他详细配置,如安全设置、消息模板等。

通过上述步骤,你应该能够在Flutter应用中成功集成并使用阿里云推送服务插件 aliyun_push_flutter

回到顶部