Flutter未插件ppg_core的使用方法分享

ppg_core - PushPushGo Core SDK for Flutter

GitHub tag (latest) Discord

Packages are published on pub.dev with same version as github releases tags

支持平台:

  • iOS
  • Android

要求:

  • 访问 Apple Developer Account。
  • 访问 HMS/FCM Developer Account。

产品信息:

PushPushGo Core 是推送通知的构建模块:

  • 发送推送通知 - 我们处理批量请求,聚合反馈事件并通知您的 webhook。
  • 图片存储与流量 - 我们处理、裁剪并提供您的推送图片。
  • 快速实现 - 我们覆盖了支持推送通知的 iOS、Web。
  • 您拥有自己的数据库和凭据 - 无供应商锁定 - 我们提供基础设施、SDK 和支持。
  • 简单的 API - 我们提供一个适用于所有提供商的 API。

联系邮箱: support+core@pushpushgo.comDiscord

注意: PushPushGo Core 不同于 PushPushGo 产品 - 如果您正在寻找 PushPushGo - 推送通知管理平台,请访问该链接。

如何工作

![IMAGE HERE]

当您向我们的 API 请求发送消息时,我们准备图片并连接到不同的提供商。

当消息被设备接收并与用户交互时,我们收集事件并将它们传递给我们的 API。

在短时间内,您将通过 webhook 收到包含事件的包:

{
    "messages": [
        {
            "messageId": "8e3075f1-6b21-425a-bb4f-eeaf0eac93a2",
            "foreignId": "my_id",
            "result": {
                "kind": "sent"
            },
            "ts": 1685009020243
        },
        {
            "messageId": "8e3075f1-6b21-425a-bb4f-eeaf0eac93a2",
            "foreignId": "my_id",
            "result": {
                "kind": "delivered"
            },
            "ts": 1685009020564
        }
    ]
}

使用这些数据,您可以计算统计数据或执行一些业务逻辑。

环境设置

确保已安装 flutter,并且 flutter doctor 命令通过。

$ flutter doctor

如果没有任何异常,则可以继续下一步。


1. 将 SDK 添加到现有应用程序

1.1 安装 flutter 包

$ flutter pub add ppg_core

1.2 向 main.dart 文件添加代码

1.2.1 导入库

import 'package:ppg_core/ppg_core.dart';

1.2.2 初始化客户端并运行

  final _ppgCorePlugin = PpgCore();

  [@override](/user/override)
  void initState() {
    super.initState();
    initializePpgCore();
  }

  // 平台消息是异步的,因此我们在异步方法中初始化。
  Future<void> initializePpgCore() async {
    // 初始化逻辑待定
    _ppgCorePlugin.initialize(
      iosLabels: ["点击我", "显示我"], // 仅限 iOS - 默认标签
      onToken: (String tokenJSON) {
        // 将此令牌上传到您的服务器后端 - 您需要此令牌来使用我们的 API 向该用户发送推送通知
        // 这是一个包含所有必要信息的 JSON 格式字符串。
        log(tokenJSON);
      },
    );

    if (!mounted) return;

    _ppgCorePlugin.registerForNotifications();
  }

2. iOS 支持

2.1 在 ios/ 目录的 podfile 中指定平台

platform :ios, '14.0'

2.2 使用 XCode 打开 ios/ 目录

$ xed ios/

2.2.1 在项目目标中启用推送通知功能

  1. 在文件树中选择带有蓝色图标的根项 <strong>your_project_name</strong>,并在 <strong>Target</strong> 部分选择 <strong>your_project_name</strong>
  2. 转到 Signing & Capabilities 选项卡,点击 <strong>+ Capability</strong> 下的选项卡。
  3. 选择 <strong>Push Notifications</strong><strong>Background Modes</strong>
  4. <strong>Background Modes</strong> 中选择以下项:
    • Remote notifications
    • Background fetch

2.2.2 添加 NotificationServiceExtension

  1. 转到文件 -> 新建 -> 目标。
  2. 搜索 <strong>Notification Service Extension</strong>,并选择产品名称(例如 <strong>NSE</strong>)。
  3. 完成过程,并在提示 <strong>Activate “NSE” scheme?</strong> 时点击 <strong>Cancel</strong>
  4. 打开 NotificationService.swift 文件。
  5. 粘贴以下代码:
import UserNotifications
import PpgCoreSDK

class NotificationService: PpgCoreNotificationServiceExtension {
  
}
  1. 在之前使用的 <strong>NSE</strong> 目标中添加以下内容到 Podfile
target 'NSE' do
  use_frameworks!
  use_modular_headers!
  pod 'PpgCoreSDK', '~> 0.0.11'
end
  1. Info.plist 中添加以下内容以启用深度链接:
<key>FlutterDeepLinkingEnabled</key>
<true/>

2.3 在调试控制台中尝试运行应用并获取推送通知令牌

$ flutter run

2.4 (可选) 如果您想覆盖端点或创建新的通知通道,请创建 PpgCore.plist 文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>PpgCoreSDKEndpoint</key>
	<string>https://api-core.pushpushgo.com/v1</string>
	<key>PpgCoreChannels</key>
	<array>
		<dict>
			<key>name</key>
			<string>testing_channel</string>
			<key>sound</key>
			<string>Submarine.aiff</string>
			<key>actions</key>
			<array>
				<string>Reply</string>
			</array>
		</dict>
		<dict>
			<key>name</key>
			<string>testing_channel_nowy</string>
			<key>sound</key>
			<string>sub.caf</string>
			<key>actions</key>
			<array>
				<string>Open</string>
				<string>Show more</string>
			</array>
		</dict>
	</array>
</dict>
</plist>

3. Android 支持

3.1 如果尚未配置,添加到根目录的 build.gradle 中 jitpack

// build.gradle (root) 或 settings.gradle (dependencyResolutionManagement)
allprojects {
    repositories {
        // jitpack
        maven { url 'https://jitpack.io' }
        // 仅当使用 hms 时
        maven { url 'https://developer.huawei.com/repo/' }
    }
}

3.1.1 在根目录的 build.gradle 文件中添加 classpath 依赖项

如果您已经配置了 fcm,请跳过此步骤。

3.1.1.1 对于 FCM:
classpath 'com.google.gms:google-services:4.3.15'
3.1.1.2 对于 HMS:
classpath 'com.huawei.agconnect:agcp:1.6.0.300'

3.2 将 google-services.json 文件放置在 android/app 目录下

3.3 在 android/app/src/main/res/values/ 文件中添加名为 ppgcore.xml 的文件,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- 必填字段 -->
    <string name="default_fcm_project_id">从 google-services.json 获取值</string> 
    <string name="default_hms_app_id">从 hms 开发者账户获取值</string>
    <!-- 选择 HMS 或 FCM - 移除其他选项,根据您使用的平台 -->
    <drawable name="default_notification_icon">@drawable/ic_launcher_foreground</drawable>
    <!-- 可选字段 -->
    <string name="default_channel_id">ppg_core_default</string>
    <string name="default_channel_name">PPG Core 默认通道</string>
    <bool name="default_channel_badge_enabled">true</bool>
    <bool name="default_channel_vibration_enabled">true</bool>
    <string-array name="default_vibration_pattern">0, 1000, 500, 1500, 1000</string-array>
    <bool name="default_channel_lights_enabled">true</bool>
    <color name="default_lights_color">#ff00ff</color>
    <string name="default_channel_sound">magic_tone</string>
</resources>

3.4 修改 AndroidManifest.xml

此文件位于 android/app/src/main/

3.4.1 权限 (根级)

<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<!-- 如果您想要支持振动 -->
<uses-permission android:name="android.permission.VIBRATE"/>

3.4.2 服务 (应用级)

根据您要使用的提供商,请选择可用选项之一。

3.4.2.1 对于 FCM
<service
    android:name=".FirebaseMessagingService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

创建名为 FirebaseMessagingService 的文件,内容如下:

import com.pushpushgo.core_sdk.sdk.fcm.FcmMessagingService  

class FirebaseMessagingService : FcmMessagingService() {}
3.4.2.2 对于 HMS
<service
  android:name=".service.MyHmsMessagingService"
  android:exported="false">
  <intent-filter>
    <action android:name="com.huawei.push.action.MESSAGING_EVENT" />
  </intent-filter>
</service>

创建名为 MyHmsMessagingService 的文件,内容如下:

import com.pushpushgo.core_sdk.sdk.hms.HmsMessagingService  

class MyHmsMessagingService : HmsMessagingService() {}

3.4.3 活动 (主活动级)

<meta-data android:name="flutter_deeplinking_enabled" android:value="true" />

<intent-filter android:autoVerify="true">
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE"/>
    <data android:host="com.example.packagename"
        android:scheme="app" />
    <data android:scheme="https" />
    <data android:scheme="http" />
</intent-filter>

<intent-filter>
    <action android:name="PUSH_CLICK" />
</intent-filter>

3.4 修改 build.gradlelocal.properties

3.4.1 在 android/app/local.properties 中添加

flutter.minSdkVersion=21

3.4.2 在 android/app/build.gradle 中添加

def flutterMinSdkVersion = localProperties.getProperty('flutter.minSdkVersion')
if (flutterMinSdkVersion == null) {
    flutterMinSdkVersion = 21
}

3.4.3 修改默认配置

android/app/build.gradle 中的 defaultConfig 中添加 minSdkVersion:

defaultConfig {
    minSdkVersion flutterMinSdkVersion
}

3.4.5 添加依赖项 (应用级) 并应用插件

3.4.5.1 对于 FCM
// build.gradle (:app)
dependencies {  
  ...  
  implementation "com.github.ppgco:ppg-core-android-sdk:0.0.33"
  implementation 'com.google.firebase:firebase-messaging-ktx:23.1.2'  
  implementation platform('com.google.firebase:firebase-bom:31.2.3')  
}

在顶部添加 <strong>apply plugin</strong>:

apply plugin: 'com.google.gms.google-services'
3.4.5.2 对于 HMS
dependencies {
  ...
  implementation 'com.github.ppgco:ppg-core-android-sdk:0.0.33'
  implementation 'com.huawei.agconnect:agconnect-core:1.7.2.300'  
  implementation 'com.huawei.hms:push:6.7.0.300'   
}

在顶部添加 <strong>apply plugin</strong>

<code>com.android.library</code> 下面粘贴以下内容:

apply plugin: 'com.huawei.agconnect'

3.4 在调试控制台中尝试运行应用并获取推送通知令牌

$ flutter run

发送通知

1. iOS

1.1 准备证书

  1. 转到 Apple Developer Portal - Identifiers 并进入 <strong>Identifiers</strong> 部分。
  2. 从列表中选择您的 appBundleId,例如 <code>com.example.your_project_name</code>
  3. 查看 PushNotifications 并点击 <strong>Configure</strong> 按钮。
  4. 选择您的 <strong>Certificate Singing Request</strong> 文件。
  5. 下载证书并在 KeyChain Access 中打开(双击 macOS)。
  6. 在列表中找到此证书,右键单击并选择导出为 .p12 格式的文件并设置密码。

2. 准备配置

  1. 使用命令将导出的证书用 Base64 编码包裹:
$ cat Certificate.p12 | base64
  1. 准备包含提供程序配置的 JSON 文件:
{
   "type": "apns_cert",
   "payload": {
   "p12": "编码后的 Base64 Certficiate.p12",
   "passphrase": "PASSWORD",
   "production": false,
   "appBundleId": "com.example.your_product_name",
}

2. Android

  1. 转到 Firebase Developer Console
  2. 选择您的项目并转到 <strong>Settings</strong>
  3. <strong>Service Accounts</strong> 部分点击 <strong>Generate Credentials</strong>
  4. 准备包含提供程序配置的 JSON 文件:
{
   "type": "fcm_v1",
   "payload": {
      // service account 文件内容
   }
}

3. 查看示例文档

SenderSDK

在示例中,请使用准备好的 "providerConfig" 和返回的令牌来发送通知。


支持与生产运行

所有 API 密钥允许您测试服务,但有非常低的速率限制。如果您需要生产凭证或集成帮助,请访问我们的 Discord 或发送邮件至 support@pushpushgo.com


示例代码

以下是一个完整的示例代码,展示了如何使用 ppg_core 插件:

import 'dart:developer';

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

import 'package:ppg_core/ppg_core.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> {
  final _ppgCorePlugin = PpgCore();

  [@override](/user/override)
  void initState() {
    super.initState();
    initializePpgCore();
  }

  // 平台消息是异步的,因此我们在异步方法中初始化。
  Future<void> initializePpgCore() async {
    // 初始化逻辑待定
    _ppgCorePlugin.initialize(
      iosLabels: ["点击我", "显示我"], // 仅限 iOS - 默认标签
      onToken: (String tokenJSON) {
        // 将此令牌上传到您的服务器后端 - 您需要此令牌来使用我们的 API 向该用户发送推送通知
        // 这是一个包含所有必要信息的 JSON 格式字符串。
        log(tokenJSON);
      },
    );

    if (!mounted) return;

    _ppgCorePlugin.registerForNotifications();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      routes: {
        '/': (context) => const HomeScreen(),
        '/details': (context) => const DetailScreen(),
      },
    );
  }
}

class HomeScreen extends StatelessWidget {
  const HomeScreen({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('插件示例应用'),
        ),
        body: Center(
            child: ElevatedButton(
                child: const Text("前往详细屏幕"),
                onPressed: () {
                  Navigator.of(context).push(
                    MaterialPageRoute(
                      builder: (context) => const DetailScreen(),
                    ),
                  );
                })),
      ),
    );
  }
}

class DetailScreen extends StatelessWidget {
  const DetailScreen({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('插件示例应用'),
        ),
        body: const Center(child: Text("详细屏幕")),
      ),
    );
  }
}

更多关于Flutter未插件ppg_core的使用方法分享的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter未插件ppg_core的使用方法分享的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


ppg_core 是一个 Flutter 插件,用于与 PPG(Photoplethysmography,光电容积描记法)相关的功能进行交互。PPG 是一种通过光学方法测量心率和其他生理信号的技术,通常用于智能手表、健身追踪器等设备中。

由于 ppg_core 可能是一个特定于某个项目或公司的插件,公开的文档和资源可能有限。以下是一些探索和使用 ppg_core 插件的步骤和建议:

1. 查找文档

  • 官方文档: 首先查看插件的官方文档(如果有的话)。通常,插件的 GitHub 仓库或发布页面会提供使用说明和示例代码。
  • README 文件: 如果插件是通过 GitHub 或其他代码托管平台发布的,通常会在项目的根目录下有一个 README.md 文件,其中包含基本的使用说明。

2. 查看示例代码

  • 示例项目: 许多插件会附带一个示例项目,展示如何使用插件的各种功能。你可以在插件的 example 目录下找到这些代码。
  • 代码注释: 查看插件的源代码,特别是公共 API 的注释,了解每个方法的作用和参数。

3. 集成插件

  • 添加依赖: 在 pubspec.yaml 文件中添加 ppg_core 插件的依赖项。例如:
    dependencies:
      ppg_core: ^1.0.0
    
  • 导入插件: 在 Dart 文件中导入插件:
    import 'package:ppg_core/ppg_core.dart';
    

4. 初始化插件

  • 初始化: 根据插件的文档,初始化插件。通常,这涉及到创建一个实例或调用一个初始化方法。
    PpgCore ppgCore = PpgCore();
    ppgCore.initialize();
    

5. 使用插件功能

  • 获取数据: 使用插件提供的方法获取 PPG 数据。例如,获取心率数据:
    double heartRate = await ppgCore.getHeartRate();
    print('Heart Rate: $heartRate');
    
  • 监听数据流: 如果插件支持数据流,你可以监听实时数据:
    ppgCore.heartRateStream.listen((double heartRate) {
      print('Heart Rate: $heartRate');
    });
    

6. 处理错误和异常

  • 错误处理: 确保在使用插件时处理可能的错误和异常。例如,使用 try-catch 块捕获异常:
    try {
      double heartRate = await ppgCore.getHeartRate();
      print('Heart Rate: $heartRate');
    } catch (e) {
      print('Error: $e');
    }
    

7. 调试和测试

  • 调试: 使用 Flutter 的调试工具(如 print 语句、断点等)来调试插件的使用。
  • 测试: 编写单元测试或集成测试,确保插件在不同场景下正常工作。

8. 社区和资源

  • GitHub Issues: 如果遇到问题,可以查看插件的 GitHub Issues 页面,看看是否有其他人遇到类似的问题或解决方案。
  • 社区论坛: 在 Flutter 社区论坛(如 Stack Overflow、Reddit 等)上提问,寻求帮助。

9. 自定义和扩展

  • 自定义功能: 如果插件不满足你的需求,可以考虑扩展或修改插件的源代码。确保你理解插件的内部工作原理,并在修改前备份代码。

10. 保持更新

  • 更新插件: 定期检查插件的更新,确保你使用的是最新版本,以获取最新的功能和修复。

示例代码

以下是一个简单的示例,展示如何使用 ppg_core 插件获取心率数据:

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

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

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

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

class _PpgCoreExampleState extends State<PpgCoreExample> {
  PpgCore ppgCore = PpgCore();
  double heartRate = 0.0;

  [@override](/user/override)
  void initState() {
    super.initState();
    initializePpgCore();
  }

  Future<void> initializePpgCore() async {
    try {
      await ppgCore.initialize();
      ppgCore.heartRateStream.listen((double rate) {
        setState(() {
          heartRate = rate;
        });
      });
    } catch (e) {
      print('Error initializing PPG Core: $e');
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('PPG Core Example'),
      ),
      body: Center(
        child: Text('Heart Rate: $heartRate'),
      ),
    );
  }
}
回到顶部