RNFirebase Messaging:及时发布发送设备令牌
RNFirebase Messaging: Issue Sending Device Token in Time
我在及时上传设备令牌时遇到问题。问题似乎是因为如果没有足够快地授予权限,我的数据库就不会更新任何内容。但是当我重新启动应用程序时(在授予权限后),设备令牌会按预期上传到我的数据库。
这是我使用的代码,componentWillMount()
时是运行。
FCM = firebase.messaging();
DB = firebase.database().ref('deviceTokens/');
getPushToken() {
FCM.requestPermissions();
FCM.getToken().then(token => {
DB.push(token);
});
}
我有办法解决这个问题吗?我不希望用户在授予权限后必须重新启动应用程序才能让我获得设备令牌。
授予权限需要与用户进行交互,这需要时间。所以你不能假设权限在你调用 requestPermissions()
之后就已经存在了。相反,您必须等待授予权限,然后才能获取令牌。
您可以通过等待 requestPermissions
返回的承诺来执行此操作:
FCM = firebase.messaging();
DB = firebase.database().ref('deviceTokens/');
getPushToken() {
FCM.requestPermissions().then(() => {
FCM.getToken().then(token => {
DB.push(token);
});
});
}
requestPermissions
方法 returns promise 所以你需要等到函数完成它工作或失败,有两种方法可以解决你的问题
#1:使用 await
try{
await FCM.requestPermissions();
FCM.getToken().then(token => {
DB.push(token);
});
}catch(e){/*DO SOMETHING*/}
#2 : 使用 then 方法
FCM.requestPermissions().then(() => {
FCM.getToken().then(token => {
DB.push(token);
});
}).catch(e => {/*DO SOMETHING*/} );
我在及时上传设备令牌时遇到问题。问题似乎是因为如果没有足够快地授予权限,我的数据库就不会更新任何内容。但是当我重新启动应用程序时(在授予权限后),设备令牌会按预期上传到我的数据库。
这是我使用的代码,componentWillMount()
时是运行。
FCM = firebase.messaging();
DB = firebase.database().ref('deviceTokens/');
getPushToken() {
FCM.requestPermissions();
FCM.getToken().then(token => {
DB.push(token);
});
}
我有办法解决这个问题吗?我不希望用户在授予权限后必须重新启动应用程序才能让我获得设备令牌。
授予权限需要与用户进行交互,这需要时间。所以你不能假设权限在你调用 requestPermissions()
之后就已经存在了。相反,您必须等待授予权限,然后才能获取令牌。
您可以通过等待 requestPermissions
返回的承诺来执行此操作:
FCM = firebase.messaging();
DB = firebase.database().ref('deviceTokens/');
getPushToken() {
FCM.requestPermissions().then(() => {
FCM.getToken().then(token => {
DB.push(token);
});
});
}
requestPermissions
方法 returns promise 所以你需要等到函数完成它工作或失败,有两种方法可以解决你的问题
#1:使用 await
try{
await FCM.requestPermissions();
FCM.getToken().then(token => {
DB.push(token);
});
}catch(e){/*DO SOMETHING*/}
#2 : 使用 then 方法
FCM.requestPermissions().then(() => {
FCM.getToken().then(token => {
DB.push(token);
});
}).catch(e => {/*DO SOMETHING*/} );