带有自定义声音的UNMutableNotificationContent

时间:2019-01-05 16:39:16

标签: ios swift

我试图创建一个简单的演示,单击一个按钮,然后显示自定义通知以及自定义声音。

发生的行为:

  • 该通知会在模拟器和连接的设备(iPhone SE)上正确显示
  • 标准声音在模拟器上播放,但不在设备上播放。
  • 完全不播放自定义声音。在模拟器上,我收到默认的通知声音,而在设备上,我什么都听不到。

声音文件“ alert.caf”已添加到Assets.xcassets。

这是我的课程(访问权限已在应用启动回调中处理):

import UIKit
import UserNotifications

class HomeViewController: UIViewController, UNUserNotificationCenterDelegate {

    @IBOutlet weak var btnNotification: UIButton!

    @IBAction func triggerNotification(_ sender: Any) {
        /* let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertController.Style.alert)
        alert.addAction(UIAlertAction(title: "Click", style: UIAlertAction.Style.default, handler: nil))
        self.present(alert, animated: true, completion: nil) */
        execNotification()

    }

    override func viewDidLoad() {
        super.viewDidLoad()
        UNUserNotificationCenter.current().delegate = self

    }

    func userNotificationCenter(
        _ center: UNUserNotificationCenter,
        willPresent notification: UNNotification,
        withCompletionHandler completionHandler:
        @escaping (UNNotificationPresentationOptions) -> Void) {
        completionHandler([.alert,.sound])
    }

    private func execNotification() {
        let notificationContent = UNMutableNotificationContent()
        notificationContent.title = "UNUserNotification Sample"
        notificationContent.body = "Sample test msg"
        notificationContent.badge = 0
        notificationContent.sound = UNNotificationSound(named: UNNotificationSoundName(rawValue: "alert.caf"))
        notificationContent.categoryIdentifier = "GENERAL"

        let notificationTrigger = UNTimeIntervalNotificationTrigger(timeInterval: 0.2, repeats: false)
        let notificationRequest = UNNotificationRequest(identifier: "general", content: notificationContent, trigger: notificationTrigger)

        // Add Request to User Notification Center
        UNUserNotificationCenter.current().add(notificationRequest) { (error) in
            if let error = error {
                print("Unable to Add Notification Request (\(error), \(error.localizedDescription))")
            }
        }

    }

}

注意:我检查了所有可能导致警报无法播放的设置,但实际上没有任何理由。应用程序设置正确,没有启用“请勿打扰”模式。

我使用Xcode 10.1

2 个答案:

答案 0 :(得分:1)

一些提示:

  • 确保声音文件位于当前可执行文件的主捆绑包中或当前应用容器目录(source)的Library / Sounds目录中。

  • 确保声音文件少于30秒。如果声音文件超过30秒,则系统将播放默认声音(source)。

  • 确保在构建阶段将声音文件添加到目标的“副本捆绑资源”中。

  • 选择声音文件,并确保在其“ Target Membership”中正确选择了应用程序的目标。

答案 1 :(得分:1)

我也无法设置自定义声音,唯一不同的是我正在为 macOS 开发应用程序。

我的设置: macOS 大苏尔 11.4 Xcode 12.5

解决办法: 自定义声音只能通过将“wav”文件添加到项目中(“caf”不起作用)然后重新启动 mac 来播放。

考虑到 iOS 和 mac 平台之间的相似性,我建议将“wav”文件添加到项目中并重启 iPhone。