在 iOS 12 上从 FCM 接收远程推送通知时播放自定义声音

问题描述 投票:0回答:2

我试图在应用程序完全关闭或在后台时收到REMOTE通知时播放自定义声音,但我尝试过的所有方法都不起作用。

我使用的音频文件是受支持的.caf 文件,它的长度为 20 秒,在苹果的限制内。该文件位于主应用程序包中,而不是在特定方案中。我的远程通知注册器已注册到 .Sound。

这是我的 XCode 项目管理器的屏幕截图,显示了我的自定义声音所在的位置。 BundleScreenshot

从 firebase 函数发送远程通知的代码:

userData.tokens.forEach(async token => {
    console.log("Token: "+token);
    const message = {
        data: {
            type: "type"
        },
        android: {
            priority: "high"
        },                  
        notification: {
            "title": "Title of message",
            "sound": "customSound.caf"
        },
        apns: {
            headers: {
                "apns-priority": "10"
            },
            payload: {
                aps: {
                    sound: "customSound.caf"
                },
                    sound: "customSound.caf"
                }
            },
            token: token
        };
    console.log(message);
    await admin.messaging().send(message);
});

这是我的 AppDelegate 中的注册代码:

if #available(iOS 10.0, *) {
// For iOS 10 display notification (sent via APNS)
    UNUserNotificationCenter.current().delegate = self
    Messaging.messaging().delegate = self
} else {
    let settings: UIUserNotificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
    application.registerUserNotificationSettings(settings)
}

application.registerForRemoteNotifications()

我什至尝试过重新启动我的设备,因为这是我在另一个 Stack Overflow 上读到的一个错误,但没有做任何事情。如果有帮助的话,我正在第六代 iPad 上运行 iOS 12.1.4。

感谢您的任何建议。

编辑 只是忘记了,我的 info.plist 文件中也有这个

<key>UILocalNotificationDefaultSoundName</key>
    <string>OnceAgainNotification.caf</string>  
ios swift firebase apple-push-notifications
2个回答
3
投票

通过 Firebase 发送的声音名称必须与声音文件的名称及其扩展名相匹配。

此外,请确保从构建阶段开始在项目中正确实现这些文件。

关于默认声音,iOS 10 后不推荐通过 info.plist 更改默认声音名称。

https://developer.apple.com/documentation/uikit/uilocalnotificationdefaultsoundname


0
投票

您可以通过为您的应用程序创建 UNNotificationServiceExtension 来播放来自 FCM 的自定义通知声音。

创建NotificationServiceExtention后,在NotificationService类中更新代码如下。

override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
        self.contentHandler = contentHandler
        bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
        
        if bestAttemptContent?.userInfo["soundName"] != nil{
            let soundName = bestAttemptContent?.userInfo["soundName"] as! String
            bestAttemptContent?.sound =  UNNotificationSound(named: UNNotificationSoundName(soundName))
        }

        Messaging.serviceExtension().populateNotificationContent(self.bestAttemptContent!, withContentHandler: contentHandler)

    }

并在 FCM 控制台中添加您的声音文件名。 FCM console example image

确保您的声音文件位于应用程序资源中且采用 .wav 格式。此外,声音文件必须可供 UNNotificationServiceExtension 目标使用。

© www.soinside.com 2019 - 2024. All rights reserved.