Flutter未插件ppg_core的使用方法分享
ppg_core - PushPushGo Core SDK for Flutter
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.com 或 Discord
注意: 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 在项目目标中启用推送通知功能
- 在文件树中选择带有蓝色图标的根项
<strong>your_project_name</strong>
,并在<strong>Target</strong>
部分选择<strong>your_project_name</strong>
。 - 转到 Signing & Capabilities 选项卡,点击
<strong>+ Capability</strong>
下的选项卡。 - 选择
<strong>Push Notifications</strong>
和<strong>Background Modes</strong>
。 - 在
<strong>Background Modes</strong>
中选择以下项:- Remote notifications
- Background fetch
2.2.2 添加 NotificationServiceExtension
- 转到文件 -> 新建 -> 目标。
- 搜索
<strong>Notification Service Extension</strong>
,并选择产品名称(例如<strong>NSE</strong>
)。 - 完成过程,并在提示
<strong>Activate “NSE” scheme?</strong>
时点击<strong>Cancel</strong>
。 - 打开
NotificationService.swift
文件。 - 粘贴以下代码:
import UserNotifications
import PpgCoreSDK
class NotificationService: PpgCoreNotificationServiceExtension {
}
- 在之前使用的
<strong>NSE</strong>
目标中添加以下内容到Podfile
:
target 'NSE' do
use_frameworks!
use_modular_headers!
pod 'PpgCoreSDK', '~> 0.0.11'
end
- 在
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.gradle
和 local.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 准备证书
- 转到 Apple Developer Portal - Identifiers 并进入
<strong>Identifiers</strong>
部分。 - 从列表中选择您的 appBundleId,例如
<code>com.example.your_project_name</code>
。 - 查看 PushNotifications 并点击
<strong>Configure</strong>
按钮。 - 选择您的
<strong>Certificate Singing Request</strong>
文件。 - 下载证书并在 KeyChain Access 中打开(双击 macOS)。
- 在列表中找到此证书,右键单击并选择导出为
.p12
格式的文件并设置密码。
2. 准备配置
- 使用命令将导出的证书用 Base64 编码包裹:
$ cat Certificate.p12 | base64
- 准备包含提供程序配置的 JSON 文件:
{
"type": "apns_cert",
"payload": {
"p12": "编码后的 Base64 Certficiate.p12",
"passphrase": "PASSWORD",
"production": false,
"appBundleId": "com.example.your_product_name",
}
2. Android
- 转到 Firebase Developer Console。
- 选择您的项目并转到
<strong>Settings</strong>
。 - 在
<strong>Service Accounts</strong>
部分点击<strong>Generate Credentials</strong>
。 - 准备包含提供程序配置的 JSON 文件:
{
"type": "fcm_v1",
"payload": {
// service account 文件内容
}
}
3. 查看示例文档
在示例中,请使用准备好的 "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
更多关于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'),
),
);
}
}