我有来自云函数的 FCM 的推送通知。这适用于iOS和Android,并在iOS上显示适当的图标并播放自定义声音。
除了Android的自定义声音外,一切都在工作,它只是播放默认声音。
我创建了一个文件夹并将我的声音文件添加到其中,如下所示:androidappsrcmainresrawmp3_example.mp3
这个mp3是27s长。 我也尝试了.wav和.aiff。
我读到我可能必须为更高版本的 Android 创建一个推送通知通道,因此它可能与此相关。 我尝试创建一个频道并使用云函数中的频道 ID,它可以工作,但没有声音,只有振动。
测试设备是运行Android 8的Moto G6。 我正在使用: FCM Firebase Cloud Functions 离子 4 电容器 https://github.com/stewwan/capacitor-fcm
云功能:
const notification: admin.messaging.Notification = {
title: title,
body: body
}
const message: admin.messaging.Message = {
notification,
topic: 'QMTBC',
android:{
notification:{
sound: 'mp3_example.mp3',
icon: 'push_logo',
color: '#000000'
}
},
apns:{
payload:{
aps: {
sound: 'gears-short.wav'
}
}
}
}
return admin.messaging().send(message)
app.component.ts
import { FCM } from 'capacitor-fcm';
const fcm = new FCM();
const { PushNotifications } = Plugins;
initializeApp() {
this.platform.ready().then(() => {
PushNotifications.register();
PushNotifications.addListener('registration', (token: PushNotificationToken) => {
console.log('token ' + token.value);
fcm
.subscribeTo({ topic: 'QMTBC' })
.then(r => console.log(`subscribed to topic`))
.catch(err => console.log(err));
});
PushNotifications.addListener('registrationError', (error: any) => {
console.log('error on register ' + JSON.stringify(error));
});
PushNotifications.addListener('pushNotificationReceived', (notification: PushNotification) => {
console.log('notification ' + JSON.stringify(notification));
this.pushNotificationService.notifications.push(notification);
});
PushNotifications.addListener('pushNotificationActionPerformed', (notification: PushNotificationActionPerformed) => {
console.log('notification ' + JSON.stringify(notification));
this.pushNotificationService.notifications.push(notification);
});
fcm.getToken()
.then(r => console.log(`Token ${r.token}`))
.catch(err => console.log(err));
});
}
更新:
我尝试创建一个频道,如下所示。 如果我使用该通道,我只会获得默认声音。 如果我指定没有频道或不存在的频道,我也会获得默认声音(默认声道(。
云功能:
const message: admin.messaging.Message = {
notification,
topic: 'QMTBC',
android:{
notification:{
sound: 'punch.mp3',
icon: 'push_logo',
color: '#000000',
channelId: 'QMTBC'
}
}
app.component.ts
const channel: PushNotificationChannel = {
description: 'QMTBC',
id : 'QMTBC',
importance: 5,
name : 'QMTBC'
};
PushNotifications.createChannel(channel).then(channelResult => {
console.log(channelResult);
console.log('Channel created');
// PushNotifications.listChannels().then(channels => {
// console.log('Channels');
// console.log(channels);
// });
}, err => {
console.log('Error Creating channel');
console.log(err);
});
});
更新 2:
我可以看到我在设备上为该应用程序创建的频道,它说声音是默认的。 我可以手动将其更改为另一个内置的android声音,这有效。 但我仍然无法使用我的自定义声音。
更新 3:
如果安卓版本是 <8,则自定义声音有效。 仅在模拟器上对此进行了测试。
@MadMac这些天我遇到了同样的问题,在阅读了FCM文档和Capacitor Java代码后,我明白了。
有必要将可见性设置为 1,将您的文件放在 res/raw 文件夹中。
PushNotifications.createChannel({
description: 'General Notifications',
id: 'fcm_default_channel',
importance: 5,
lights: true,
name: 'My notification channel',
sound: 'notifications.wav',
vibration: true,
visibility: 1
}).then(()=>{
console.log('push channel created: ');
}).catch(error =>{
console.error('push channel error: ', error);
});
我正在我的火库函数中使用此有效负载来发送通知
{
android: {
notification: {
defaultSound: true,
notificationCount: 1,
sound: 'notifications.wav',
channelId: 'fcm_default_channel'
},
ttl: 20000,
collapseKey
},
apns: {
payload: {
aps: {
badge: 1,
sound: 'default'
}
}
},
notification: {
title,
body: message,
},
token: token
};
这是一个非常好的问题,帮助我找到了答案。所以我在这里发布我的答案。尝试在创建频道时将通知的声音设置为通知频道本身。我想,根据您的信息,旧的Android版本将根据通知有效负载中的声音场播放声音,但是在新版本中,您必须将其直接设置为通知通道本身,因为这是Google当前打算控制的地方。我必须卸载并重新安装应用程序才能使此代码更改正常工作,因为我的频道之前已初始化,并且频道在第一次初始化后不会更新。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && !notificationChannelsInitialized) {
val newMessagesChannel = NotificationChannel(NEW_MESSAGES_NOTIFICATION_CHANNEL_ID, "New Messages", NotificationManager.IMPORTANCE_HIGH)
val notificationSoundUri =
Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE.toString() + "://" + context.packageName + "/" + R.raw.ns) // ns.wav is my notification sound file in the res/raw folder in Android Studio
val notificationSoundUriAttributes = AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_NOTIFICATION)
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.build()
newMessagesChannel.setSound(notificationSoundUri, notificationSoundUriAttributes)
val notificationManager: NotificationManager =
context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannels(listOf( newMessagesChannel)) // and other channels
}
我能够使用react-native-push-notification
库(这里(让它为React Native工作。解决的关键是必须在应用内创建频道。(我以为通道是在后端创建的,但这是不对的(。将 mp3 文件放在我的应用程序android
文件夹的res/raw
目录中后,我在 React Native 中添加了以下代码(从上述库中的文档复制(,它起作用了:
import PushNotification, {Importance} from 'react-native-push-notification';
...
PushNotification.createChannel(
{
channelId: "channel-id", // (required)
channelName: "My channel", // (required)
channelDescription: "A channel to categorise your notifications", // (optional) default: undefined.
playSound: true, // (optional) default: true
soundName: "mp3_example", // (optional) See `soundName` parameter of `localNotification` function
importance: Importance.HIGH, // (optional) default: Importance.HIGH. Int value of the Android notification importance
vibrate: true, // (optional) default: true. Creates the default vibration pattern if true.
},
(created) => console.log(`createChannel returned '${created}'`) // (optional) callback returns whether the channel was created, false means it already existed.
);