下面的场景
我想开发一个颤振应用程序,允许在按下按钮(类似于门铃)后接收推送通知。 此按钮已连接到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写入数据
我期待着任何答案
谢谢
我自己解决了这个问题
在实时数据库环境中操作时,
snapshot.data();
函数不可用您必须将触发器函数更改为
functions.database.ref()
,然后将快照引用为snapshot.val()
,这样您就可以从实时数据库获取更改并将数据推送到设备相关问题 更多 >
编程相关推荐