Flutter推送服务插件appmetrica_push的使用

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

Flutter AppMetrica Push 使用指南

SDK 功能

  • 接收和显示推送通知
  • 接收静默推送通知
  • 处理通知中的负载数据
  • 在通知中显示图片
  • 支持通过打开通知触发深链接(Deep Link)操作
  • 支持通过打开通知触发 URL 操作

设置

  1. 添加依赖项
    pubspec.yaml 文件中添加以下依赖项:

    dependencies:
      firebase_core: ^latest_version
      firebase_analytics: ^latest_version
      appmetrica_plugin: ^latest_version
      appmetrica_push: ^latest_version
    
  2. 创建项目

    • AppMetrica 中创建一个项目。
    • Firebase Console 中创建一个项目,添加 Android 应用并上传 google-services.json 配置文件。
    • 在 AppMetrica 项目设置中获取 API key
    • 在 Firebase Console 的 Cloud Messaging API (Legacy) 中获取 Server key
    • 配置 AppMetrica 以与 FCM 和 APNs 一起工作。
  3. 启用推送令牌更新(可选) FCM 服务可能会撤回设备的推送令牌,例如当用户长时间未启动应用时。AppMetrica 在服务器上存储推送令牌,并且无法向具有过期令牌的设备发送推送通知。为了自动收集当前的推送令牌,可以在 AppMetrica 界面的应用设置中启用“使用静默推送通知更新令牌”选项。

连接 AppMetrica Push SDK

Android
  1. build.gradle 文件中设置 minSdkVersion 19

  2. 使用 Google Services Plugin

    • google-services.json 文件放置在项目的模块目录中。

    • build.gradle 文件中添加以下内容:

      buildscript {
        dependencies {
          classpath 'com.google.gms:google-services:4.3.13'
        }
      }
      
    • build.gradle 文件中添加以下内容:

      apply plugin: 'com.google.gms.google-services'
      
  3. 不使用插件

    • 修改 AndroidManifest.xml 文件中的 application 元素:

      <meta-data android:name="ymp_firebase_default_app_id" android:value="APP_ID"/>
      <meta-data android:name="ymp_gcm_default_sender_id" android:value="number:SENDER_ID"/>
      <meta-data android:name="ymp_firebase_default_api_key" android:value="API_KEY"/>
      <meta-data android:name="ymp_firebase_default_project_id" android:value="PROJECT_ID"/>
      
    • APP_ID:Firebase 中应用的 ID。可以在 Firebase 控制台的“项目设置”中找到。

    • SENDER_ID:Firebase 中发送者的唯一 ID。可以在 Firebase 控制台的“项目设置”→“Cloud Messaging”中找到。

    • API_KEY:Firebase 中应用的 API 密钥。可以在 google-services.json 文件的 current_key 字段中找到。

    • PROJECT_ID:Firebase 中应用的项目 ID。可以在 google-services.json 文件的 project_id 字段中找到。

iOS
  1. GoogleService-Info.plist 文件放置在 <project>/ios/Runner/ 目录中。

  2. 创建通知服务扩展

    • 在 Xcode 中选择 File → New → Target
    • 在 iOS Extensions 部分,选择 Notification Service Extension 并点击 Next
    • Product Name 字段中输入扩展名称,然后点击 Finish
  3. 创建共享 App Groups

    • 在 Xcode 项目设置中,进入 Capabilities 标签页。
    • 为创建的扩展和应用启用 App Groups 选项。
    • 在 App Groups 部分使用 + 按钮创建一个组。您需要在后续配置中使用该组名称。
    • 为应用和扩展选择您创建的组。
  4. 修改 Notification Service Extension 中的代码

    import UserNotifications
    import YandexMobileMetricaPush
    
    class YourNotificationServiceName: UNNotificationServiceExtension {
        
        private var contentHandler: ((UNNotificationContent) -> Void)?
        private var bestAttemptContent: UNMutableNotificationContent?
        private let syncQueue = DispatchQueue(label: "YourNotificationServiceName.syncQueue")
        
        override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
            self.contentHandler = contentHandler
            bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
            
            if bestAttemptContent != nil {
                // 修改通知内容
                YMPYandexMetricaPush.setExtensionAppGroup("your.app.group.name")
                YMPYandexMetricaPush.handleDidReceive(request)
            }
            
            YMPYandexMetricaPush.downloadAttachments(for: request) { [weak self] attachments, error in
                if let error = error {
                    print("Error: \(error)")
                }
                
                self?.completeWithBestAttempt(attachments: attachments)
            }
        }
        
        override func serviceExtensionTimeWillExpire() {
            completeWithBestAttempt(attachments: nil)
        }
        
        func completeWithBestAttempt(attachments: [UNNotificationAttachment]?) {
            syncQueue.sync { [weak self] in
                if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent {
                    if let attachments = attachments {
                        bestAttemptContent.attachments = attachments
                    }
                    
                    contentHandler(bestAttemptContent)
                    self?.bestAttemptContent = nil
                    self?.contentHandler = nil
                }
            }
        }
    }
    
  5. AppDelegate.swift 中添加以下代码

    YMPYandexMetricaPush.setExtensionAppGroup("your.app.group.name")
    
  6. 修改 Podfile 文件

    platform :ios, '10.0'
    
    target 'YourNotificationServiceName' do
      use_frameworks!
      
      pod 'YandexMobileMetricaPush'
    end
    
    post_install do |installer|
      installer.pods_project.targets.each do |target|
        if target.name == 'YandexMobileMetrica-Static_Core'
          target.remove_from_project
        end
        flutter_additional_ios_build_settings(target)
      end
    end
    

初始化 AppMetrica Push SDK

await Firebase.initializeApp();
await FirebaseAnalytics.instance.setAnalyticsCollectionEnabled(true);

// AppMetrica.activate 必须在 AppmetricaPush.activate 之前调用
await AppMetrica.activate(AppMetricaConfig('<AppMetrica API key>'));
await AppmetricaPush.instance.activate();
await AppmetricaPush.instance.requestPermission(PermissionOptions(
    alert: true,
    badge: true,
    sound: true,
));

使用 AppMetrica Push SDK

// 获取 PUSH 服务令牌
await AppmetricaPush.instance.getTokens();

// 监听 PUSH 服务令牌变化
// 注意这是一个广播流
AppmetricaPush.instance.tokenStream.listen((Map<String, String?> data) => print('token: $data'));

// 监听静默推送,接收 payload 数据
// 注意这是一个广播流
AppmetricaPush.instance.onMessage.listen((String data) => print('onMessage: $data'));

// 监听推送,接收 payload 数据
// 注意这是一个广播流
AppmetricaPush.instance.onMessageOpenedApp.listen((String data) => print('onMessageOpenedApp: $data'));

示例代码

以下是一个完整的示例代码,展示了如何在 Flutter 项目中使用 AppMetrica Push SDK。

import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_analytics/firebase_analytics.dart';
import 'package:appmetrica_plugin/appmetrica_plugin.dart';
import 'package:appmetrica_push/appmetrica_push.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  await FirebaseAnalytics.instance.setAnalyticsCollectionEnabled(true);

  // AppMetrica.activate 必须在 AppmetricaPush.activate 之前调用
  await AppMetrica.activate(AppMetricaConfig('<AppMetrica API key>'));
  await AppmetricaPush.instance.activate();
  await AppmetricaPush.instance.requestPermission(PermissionOptions(
    alert: true,
    badge: true,
    sound: true,
  ));

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'AppMetrica Push Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  void initState() {
    super.initState();

    // 监听 PUSH 服务令牌变化
    AppmetricaPush.instance.tokenStream.listen((Map<String, String?> data) {
      print('token: $data');
    });

    // 监听静默推送
    AppmetricaPush.instance.onMessage.listen((String data) {
      print('onMessage: $data');
    });

    // 监听推送打开应用
    AppmetricaPush.instance.onMessageOpenedApp.listen((String data) {
      print('onMessageOpenedApp: $data');
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('AppMetrica Push Demo'),
      ),
      body: Center(
        child: Text('等待推送通知...'),
      ),
    );
  }
}

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

1 回复

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


在Flutter中集成并使用appmetrica_push插件来实现推送服务,需要按照以下步骤进行配置和实现。这里是一个基本的代码案例来帮助你理解如何在Flutter应用中集成和使用这个插件。

第一步:添加依赖

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

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

然后运行flutter pub get来安装依赖。

第二步:配置Android项目

2.1 在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.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

    <!-- AppMetrica PushReceiver -->
    <receiver android:name="com.yandex.metrica.push.PushReceiver"
        android:exported="true"
        android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="com.example.yourapp" />
        </intent-filter>
    </receiver>

    <!-- 其他配置 -->

</manifest>

2.2 在android/app/build.gradle文件中添加Google服务依赖:

dependencies {
    implementation 'com.google.firebase:firebase-messaging:最新版本号'
    // 其他依赖
}

确保你已经配置了Firebase项目,并下载了google-services.json文件放置在android/app/目录下。

第三步:配置iOS项目(如果需要)

对于iOS项目,你需要配置Firebase和AppMetrica的相关设置,这通常涉及到在Xcode中设置推送通知权限和Firebase SDK。由于iOS的配置相对复杂且依赖于具体的Firebase和AppMetrica SDK版本,这里不详细展开,但你可以参考Firebase和Yandex AppMetrica的官方文档来完成iOS的配置。

第四步:在Flutter代码中集成AppMetrica Push

在你的Flutter项目中,你需要初始化AppMetrica Push并处理推送通知。以下是一个简单的示例:

import 'package:flutter/material.dart';
import 'package:appmetrica_push/appmetrica_push.dart';
import 'package:firebase_messaging/firebase_messaging.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化Firebase Messaging(用于处理FCM消息)
  FirebaseMessaging.instance.configure(
    onMessage: (RemoteMessage message) async {
      print('Got a message whilst in the foreground!');
      print('Message data: ${message.data}');
    },
    onBackgroundMessage: myBackgroundMessageHandler,
    onLaunch: (RemoteMessage message) async {
      print('Got a message when launched!');
      print('Message data: ${message.data}');
    },
    onResume: (RemoteMessage message) async {
      print('Got a message when resumed!');
      print('Message data: ${message.data}');
    },
  );

  // 初始化AppMetrica Push(注意:这里的初始化代码可能需要根据实际插件的API进行调整)
  AppMetricaPush.initialize();

  runApp(MyApp());
}

Future<void> myBackgroundMessageHandler(RemoteMessage message) async {
  print('Handling a background message: ${message.data}');
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter AppMetrica Push Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

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

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter AppMetrica Push Demo'),
      ),
      body: Center(
        child: Text('Check the console for push notifications.'),
      ),
    );
  }
}

注意

  • 上述代码中的AppMetricaPush.initialize();是一个假设的初始化方法,实际使用时请参考插件的官方文档和API。
  • 对于处理推送通知的部分,firebase_messaging插件被用来处理Firebase Cloud Messaging(FCM)消息。如果你的AppMetrica Push配置依赖于FCM,那么这一步是必要的。
  • iOS的配置和代码处理可能会有所不同,请参考相关文档进行适配。

请确保你已经阅读并理解了appmetrica_push插件的官方文档,因为插件的API和初始化方法可能会随着版本的更新而发生变化。

回到顶部