我正在开发一个基于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警告:用户抛出了异常 打回来。 TypeError:expo.isExpoPushToken不是函数 在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
}
非常感谢任何帮助。
答案 0 :(得分:1)
快速浏览Expo服务器sdk,看起来isExpoPushToken
是一个类方法而不是实例方法,因此你应该在类Expo
上调用方法而不是实例{{1 (注意大写与小写)。
来自Expo server sdk github page:
expo