使用flutter firebase_messaging插件发送通知声音

时间:2019-01-04 13:08:13

标签: flutter apple-push-notifications firebase-cloud-messaging

我正在尝试让我的应用程序向用户发送通知,该通知将以默认通知声音提醒用户。

到目前为止,我正在使用具有以下代码的插件firebase_messaging

Message firebaseMessage = Message()
..to = token
..body = body
..title = title;
firebaseCloudMessage.send(firebaseMessage);

这使我可以向选定的用户发送通知,并将其显示在其主屏幕上。唯一的问题是,通知发出后,它无法在iOS上播放声音或给Apple Watch触觉。

如何使用firebase_messaging框架播放声音?

如果有帮助,这是我的配置:

_firebaseMessaging.requestNotificationPermissions(
  IosNotificationSettings(
    sound: true,
    badge: true,
    alert: true
  )
);

如果我直接从firebase发送消息并在选项中启用声音,则声音和触觉会起作用,我只是无法弄清楚如何使用此框架。

2 个答案:

答案 0 :(得分:2)

也许为时已晚。 但是我一直在为iOS中的通知声音而苦苦挣扎。 问题是我使用Firebase发送通知,并且使用了最新的API,因此我必须在通知消息中添加“ apns ”部分:

     const payload = {
                      notification: {
                          title: "title",
                          body: "message",

                      },
                      data: {
                          info: "any data",
                          click_action: "FLUTTER_NOTIFICATION_CLICK",
                        },
                      apns:{
                        payload:{
                            aps:{
                             sound:"default"
                            }
                        }
                     },
                      condition:condition //if using topics
                 };

答案 1 :(得分:1)

我假设您正在使用fcm_push软件包。您需要在邮件中添加其他标签。试试:

firebaseMessage.data = [Tuple2('sound', 'default')];

这适用于Android。您可能需要弄清楚如何获取fcm_push才能为APNS消息发送正确的有效负载。请参见API documentationAPNS payload reference

(我自己不使用fcm_push-我发现使用HTTP直接写入FCM API一样容易。例如......

final String url = 'https://fcm.googleapis.com/fcm/send';

Map<String, dynamic> notification = {
  'body': 'some body',
  'title': 'some title',
};

Map<String, dynamic> data = {
  //'click_action': 'FLUTTER_NOTIFICATION_CLICK',
  'someKey': 'someValue',
  'sound': 'default',
};

Map<String, dynamic> message = {
  'notification': notification,
  'priority': 'high',
  'data': data,
  'to': '', // this is optional - used to send to one device
};

Map<String, String> headers = {
  'authorization': auth,
  'content-type': 'application/json',
};

void sendNotification() async {
  message['to'] = testToken; // todo - set the relevant values
  http.Response r =
      await http.post(url, headers: headers, body: json.encode(message));
  print(r.statusCode);
  print(r.body);
}