【问题标题】:How do I enable sound in Local Notifications?如何在本地通知中启用声音?
【发布时间】:2015-10-03 21:11:05
【问题描述】:

我正在使用 Swift 编码并尝试显示通知。它们确实出现了,但没有播放声音。我确实浏览了这个站点和其他站点,我的代码看起来与建议的解决方案相同,所以我不确定出了什么问题。

这是我的 AppDelegate.swift:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: UIUserNotificationType.Sound | UIUserNotificationType.Alert |
        UIUserNotificationType.Badge, categories: nil
        ))

    return true
}

func application(application: UIApplication, didReceiveLocalNotification notification: UILocalNotification) {

    var alert = UIAlertView()

    alert.title = "Alert"
    alert.message = notification.alertBody
    alert.addButtonWithTitle("Dismiss")

    alert.show()
}

这是我的 ViewConrtoller.swift 中的函数:

override func viewDidLoad() {
    super.viewDidLoad()
    var localNotification: UILocalNotification = UILocalNotification()

    localNotification.soundName = "sample.wav";
    localNotification.fireDate = NSDate(timeIntervalSinceNow: 2)
    localNotification.alertAction = "TEST"
    localNotification.alertBody = "Sound Test"
    localNotification.applicationIconBadgeNumber = 1

    UIApplication.sharedApplication().scheduleLocalNotification(localNotification)
}

【问题讨论】:

标签: ios swift push-notification


【解决方案1】:

环顾四周后,我发现了一些可能有帮助的答案。似乎是问题的第一件事是关闭设备上的声音,请参阅thisthis post 的答案。另一个解决方案是change the audio file format,即使文件类型正确,更改它也解决了问题。您也可能会发现 this post 很有帮助,但没有一个答案被接受。而且,正如 rmaddy 所提到的,您可能想看看Apple docs

对于 iOS 中的远程通知,您可以指定 iOS 在为应用呈现本地或远程通知时播放的自定义声音。声音文件可以位于客户端应用的主包中,也可以位于应用数据容器的 Library/Sounds 文件夹中。

自定义警报声音由 iOS 系统声音工具播放,因此它们必须采用以下音频数据格式之一:

线性 PCM MA4 (IMA/ADPCM) 微定律 一条法律 您可以将音频数据打包到 aiff、wav 或 caf 文件中。然后,在 Xcode 中,将声音文件作为 app bundle 的非本地化资源添加到您的项目中,或者添加到数据容器的 Library/Sounds 文件夹中。

您可以使用 afconvert 工具来转换声音。例如,要将 16 位线性 PCM 系统声音 Submarine.aiff 转换为 CAF 文件中的 IMA4 音频,请在终端应用程序中使用以下命令:

afconvert /System/Library/Sounds/Submarine.aiff ~/Desktop/sub.caf -d ima4 -f caff -v 您可以通过在 QuickTime Player 中打开声音并从“电影”菜单中选择“显示电影检查器”来检查声音以确定其数据格式。

自定义声音在播放时必须少于 30 秒。如果自定义声音超过该限制,则会播放默认系统声音。

编辑:

关于主包:

每个应用程序都有一个主包,即包含应用程序代码的包。当用户启动应用程序时,它会在主包中找到它立即需要的代码和资源,并将它们加载到内存中。此后,应用程序可以根据需要从主包或从属包中动态(和惰性地)加载代码和资源。

NSBundle 类,对于程序代码,Core Foundation 的 CFBundleRef 不透明类型为您的应用程序提供了在包中定位资源的方法。在 Objective-C 中,您首先必须获得一个对应于物理包的 NSBundle 实例。要获取应用程序的主包,请调用类方法 mainBundle。其他 NSBundle 方法在给定文件名、扩展名和(可选)捆绑子目录时返回捆绑资源的路径。获得资源的路径后,可以使用适当的类将其加载到内存中。

要查看此信息,请单击捆绑包,然后单击“更多...”

编辑 2:

尝试将音频文件添加到代码文件所在的位置,没有花哨的音频文件夹,只需将其放在那里即可。

每个应用程序都有一个主包,即包含应用程序代码的包。当用户启动应用程序时,它会在主包中找到它立即需要的代码和资源,并将它们加载到内存中。此后,应用程序可以根据需要从主包或从属包中动态(和惰性地)加载代码和资源。

所以把你的音频文件放在主包中,看看它是否有效。

【讨论】:

  • 谢谢!我确实尝试了文件转换(使用他们给出的与潜艇声音示例完全相同的代码),它只有 1 秒长。但是,我对“客户端应用程序的主包”的含义感到困惑?我尝试了“文件 > 将文件添加到”,但没有成功,然后我尝试将 caf 文件移动到我的代码所在的文件夹中。
  • @user5405324,我在答案中添加了更多信息,是否有意义,或者您需要了解更多有关访问主包的信息吗?
  • 我需要更多信息。我将我的项目命名为“LocalNotification”,并在与 LocalNotification 和 LocalNotificationTests 文件夹相同的文件夹中创建了一个 Resources 文件夹,并且 Resources 文件夹包含 sub.caf,但是当我在 iOS 模拟器中测试它时声音仍然没有响起。
  • 你能在设备上测试吗?如果是这样,它会发出声音吗?
【解决方案2】:

还要检查声音文件是否包含在“目标成员资格”中,您可以在 Xcode 中有关文件的信息的右侧窗格中找到该文件。在此之上,您可以看到它的“完整路径”。添加文件时,您可能忘记将其包含在所需的目标中,因此即使它在项目存档中,它也不在目标的捆绑包中,因此无法找到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    相关资源
    最近更新 更多