使用Python在颤振应用程序上触发推送通知

2024-09-28 22:29:26 发布

您现在位置:Python中文网/ 问答频道 /正文

下面的场景

我想开发一个颤振应用程序,允许在按下按钮(类似于门铃)后接收推送通知。 此按钮已连接到internet

到目前为止我所拥有的

主飞镖

import 'package:flutter/material.dart';
import "FireBaseMessaging.dart";

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: FirebaseMessagingDemo(),
    );
  }
}

FirebaseMessagingDemo.dart

import "package:flutter/material.dart";
import "package:firebase_messaging/firebase_messaging.dart";

class FirebaseMessagingDemo extends StatefulWidget {
  FirebaseMessagingDemo() : super();

  final String title = 'Firebase Messaging Demo';

  @override
  State<StatefulWidget> createState() => _FirebaseMessagingDemoState();
}

class _FirebaseMessagingDemoState extends State<FirebaseMessagingDemo> {
  final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();

  _getToken() {
    _firebaseMessaging.getToken().then((deviceToken) {
      print("Device Token: $deviceToken");
    });
  }

  List<Message> messagesList;

  _configureFirebaseListeners() {
    _firebaseMessaging.configure(
      onMessage: (Map<String, dynamic> message) async {
        print('onMessage: $message');
        _setMessage(message);
      },
      onLaunch: (Map<String, dynamic> message) async {
        print('onLaunch: $message');
        _setMessage(message);
      },
      onResume: (Map<String, dynamic> message) async {
        print('onResume: $message');
        _setMessage(message);
      },
    );
  }

  _setMessage(Map<String, dynamic> message) {
    final notification = message['notification'];
    final data = message['data'];
    final String title = notification['title'];
    final String body = notification['body'];
    String mMessage = data['message'];
    print("Title: $title, body: $body, message: $mMessage");
    setState(() {
      Message msg = Message(title, body, mMessage);
      messagesList.add(msg);
    });
}

  @override
  void initState() {
    super.initState();
    messagesList = List<Message>();
    _getToken();
    _configureFirebaseListeners();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: ListView.builder(
        itemCount: messagesList == null ?
        0
        : messagesList.length,
        itemBuilder: (context, index) {
          return Card(
            child: Text(messagesList[index].message),
          );
        },
      )
    );
  }
}

class Message {
  String title;
  String body;
  String message;
  Message(title, body, message) {
    this.title = title;
    this.body = body;
    this.message = message;
  }
}

为此,Firebase中有一个云函数,用于查询云Firestore中的写入操作,并在创建新条目时向设备发送推送通知

const functions = require('firebase-functions');

const admin = require('firebase-admin');

admin.initializeApp(functions.config().functions);

var newData;
exports.myTrigger = functions.firestore.document('Messages/{messageID}').onCreate(async (snapshot, context) => {
    //

    if (snapshot.empty) {
        console.log('No Devices');
        return;
    }

    var tokens = ['$$DeviceToken$$'];
    newData = snapshot.data();

    var payload = {
        notification: {
            title: 'Push Title',
            body: 'Push Body',
            sound: 'default',
        },
        data: {
            click_action: 'FLUTTER_NOTIFICATION_CLICK',
            message: newData.message,
        },
    };
    try {
        const response = await admin.messaging().sendToDevice(tokens, payload);
        console.log('Notification sent successfully');
    } catch (err) {
        console.log(err);
    }
});

到目前为止,它是有效的

我的计划是使用Rasberry Pi设置一个按钮,触发Python脚本,该脚本在Cloud Firestore集合中生成一个条目,从而通过云函数向手机发送推送通知

我看到的唯一可能性是写入实时数据库,但这不会触发云功能。所以对我来说不可能,除非云功能可以检查实时数据库中的更改

我对各种解决方案持开放态度。也许完全不需要云功能或firebase就可以做到这一点。 或者可以通过Python向云Firestore写入数据

我期待着任何答案

谢谢


Tags: importmessagedatastringtitlebodynotificationfunctions
1条回答
网友
1楼 · 发布于 2024-09-28 22:29:26

我自己解决了这个问题

在实时数据库环境中操作时,snapshot.data();函数不可用

您必须将触发器函数更改为functions.database.ref(),然后将快照引用为snapshot.val(),这样您就可以从实时数据库获取更改并将数据推送到设备

相关问题 更多 >