我正在开发一个基于Expo的应用程序 – 我决定使用firebase作为后端,但是遇到了阻止程序,我需要向应用程序中的用户发送推送通知 – 但是Expo不适用于Firebase云消息传递( FCM)除非我弹出Expo项目并使用
Android和ios独立工作.
为了解决这个问题,我决定将Expo Notification Tokens存储在firebase中,然后在firebase中编写firebase云功能,从数据库中获取所有这些令牌,并使用expo-server-sdk触发sendPushNotificationAsync().
我知道要做到这一点,我的版本的firebase不能在Spark计划上 – 事实并非如此.
我决定在TypeScript中实现该解决方案,以便符合ES6 / ES7编码标准.
方法是 – 我触发对我的firebase函数url的get请求,这会触发执行的函数.使用下面的代码 – 当我针对提供的谷歌功能URL提出请求时,我收到错误消息:
@firebase/database: FIREBASE WARNING: Exception was thrown by user
callback. TypeError: expo.isExpoPushToken is not a function
at admin.database.ref.once (/user_code/lib/index.js:24:18)
at onceCallback (/user_code/node_modules/firebase-
有什么我做错了它似乎不能初始化和使用Expo导入的功能,虽然我已将其包含在package.json中进行安装,导入和使用.
index.ts – 由firebase生成
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
import * as Expo from 'expo-server-sdk';
admin.initializeApp();
// Create a new Expo SDK client
let expo = new Expo();
exports.pushNotifications = functions.https.onRequest((req,res) => {
if(req.method !== 'GET'){
return res.status(403).send('Forbidden!')
}
let allTokens = [];
let messages = [];
admin.database().ref('/all_user_push_tokens/').once('value', (snapshot) => {
if(expo.isExpoPushToken(snapshot.val())){
allTokens.push(snapshot.val())
} else {
console.log(snapshot.val())
}
})
.then(() => {
for (var token in allTokens){
messages.push({
to: token,
sound: 'default',
title: 'NXET',
body: ' NEW ACTIVITIES ADDED!'
})
}
})
.then(() => {
let chunks = expo.chunkPushNotifications(messages)
async (chunks) => {
for (let chunk of chunks) {
try {
await expo.sendPushNotificationsAsync(chunk);
} catch (error){
console.error(error);
}
}
}
return res.status(200).send('SUCCESS - NOTIFICATIONS SENT!!')
})
.catch(() => {
return res.status(403).send('Forbidden!')
});
return res.status(200).send('Function Executing')
})
的package.json
{
"name": "functions",
"scripts": {
"build": "tsc",
"serve": "npm run build && firebase serve --only functions",
"shell": "npm run build && firebase functions:shell",
"start": "npm run shell",
"deploy": "firebase deploy --only functions",
"logs": "firebase functions:log"
},
"main": "lib/index.js",
"dependencies": {
"expo-server-sdk": "^2.3.3",
"firebase-admin": "~5.12.0",
"firebase-functions": "^1.0.1"
},
"devDependencies": {
"typescript": "^2.5.3"
},
"private": true
}
任何帮助将非常感激.
最佳答案 快速查看Expo服务器sdk,看起来isExpoPushToken是一个类方法而不是实例方法,因此你应该在类Expo上调用方法而不是实例expo(注意大写与小写).
// Check that all your push tokens appear to be valid Expo push tokens
if (!Expo.isExpoPushToken(pushToken)) {
console.error(`Push token ${pushToken} is not a valid Expo push token`);
continue;
}