Android推送通知的自定义声音不起作用(FCM)

时间:2019-09-07 03:11:46

标签: android ionic-framework firebase-cloud-messaging capacitor

我有通过云功能使用FCM进行的推送通知。这适用于iOS和Android,并显示适当的图标并在iOS上播放自定义声音。

除了适用于Android的自定义声音,其他所有功能都可以正常运行,只是播放默认声音。

我已经创建了一个文件夹,并将我的声音文件添加到其中,如下所示:android\app\src\main\res\raw\mp3_example.mp3

此mp3长度为27s。我还尝试了.wav和.aiff。

我读到我可能必须为更高版本的Android创建一个推送通知通道,因此它可能与此相关。我尝试创建一个通道并使用云功能中的channelID,它可以正常工作,但是声音只是振动而已。

测试设备是运行Android 8的Moto G6。 我在用: 流式细胞仪 Firebase云功能 离子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:

如果Android版本为<8,则自定义声音有效。仅在模拟器上对此进行测试。

2 个答案:

答案 0 :(得分:0)

@MadMac这些天来,我遇到了同样的问题,阅读了FCM文档和Capacitor Java代码后,我明白了。

有必要将可见性设置为1,将文件放置在res / raw文件夹中。

function myFunction(clicked_id) {   
    d3.select('g')
        .append('rect')
        .attr('id','node_block')
        .attr('x',50)
        .attr('y',20)
        .attr('rx',20)
        .attr('ry',20)
        .attr('width',145)
        .attr('height',95)
        .attr('transform','translate(0,-15)')
        .attr('fill','white')
        .style('stroke','black')
        .style('stroke-width',5);

    d3.select('g')
        .append('text')
        .text(clicked_id)
        .attr('id','node_name')
        .attr('x',0)
        .attr('y',15)
        .attr('transform','translate(105,43)');
}

我正在Firestore函数中使用此有效负载来发送通知

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);
        });

答案 1 :(得分:0)

这是一个很好的问题,帮助我找到了答案。所以我在这里发布我的答案。创建频道时,请尝试将通知声音设置为通知频道本身。我想根据您的信息,旧的Android版本将根据通知有效负载中的声场播放声音,但是在新版本中,您必须将其直接设置为通知通道本身,因为这是控件的当前位置目前打算由Google提供。我必须卸载并重新安装应用程序才能使此代码更改生效,因为我的频道先前已初始化,并且在第一次初始化后不会更新频道。

The VALID UNTIL clause defines an expiration time for a password only, 
not for the role per se. In particular, the expiration time is 
not enforced when logging in using a non-password-based authentication method.