【问题标题】:How do I add a file to the main bundle's /Library/Sounds directory?如何将文件添加到主包的 /Library/Sounds 目录?
【发布时间】:2016-05-26 22:20:47
【问题描述】:

根据Apple's documentation,当尝试播放声音时,系统会搜索~/Library/Sounds 中的声音文件。如何将声音文件添加到此文件夹?

我尝试在运行时写入文件夹,但没有权限。我在 xcode 中添加了一个 Library/Sounds 文件夹,但它似乎没有复制过来。

xcode -> 窗口 -> 设备,选择我的应用程序并显示容器,文件夹不存在

为了添加一些上下文,我正在为解析推送通知做自定义声音。服务员告诉我,当向许多用户广播时,在有效载荷中为每个用户发送自定义声音字符串太难了。作为一种变通方法,我尝试使用单个声音文件,每次用户选择新声音时都会动态覆盖该文件。

因此,声音文件需要系统自动检测,并且可以在应用程序运行时进行修改。将文件添加到主包将不起作用,因为它是只读的。我希望 ~/Library/Sound 中的文件是可编辑的。

我现在不知道如何进行。任何帮助将不胜感激。

更新: 我错误地尝试使用

在运行时创建目录
        try fileManager.createDirectoryAtPath("Library/Sounds", withIntermediateDirectories: true, attributes: nil)

正确的代码应该是

        let libraryDir = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.LibraryDirectory, NSSearchPathDomainMask.UserDomainMask, true)
        let directoryPath = "\(libraryDir.first!)/Sounds"
        try fileManager.createDirectoryAtPath(directoryPath, withIntermediateDirectories: true, attributes: nil)

My solution to the custom sound problem.

【问题讨论】:

  • 对于任何可更新/可编辑的资源,您应该使用缓存文件夹
  • 问题是缓存文件夹中的声音文件不会被苹果检测到推送通知声音

标签: ios xcode apple-push-notifications


【解决方案1】:

我也为此苦苦挣扎。您必须以编程方式创建 Library/Sounds 目录并将您的自定义声音移动到其中。

let soundsDirectoryURL = fileManager.urls(for: .libraryDirectory, in: .userDomainMask).first!.appendingPathComponent("Sounds")

//attempt to create the folder
do {
    try fileManager.createDirectory(atPath: soundsDirectoryURL.path,
                                    withIntermediateDirectories: true, attributes: nil)
} catch let error as NSError {
    print("Error: \(error.localizedDescription)")
}

【讨论】:

    【解决方案2】:

    您拥有的链接适用于 Mac! iOS 的正确文档应该是here

    总之,您可以将声音文件作为应用程序包的非本地化资源添加到您的项目中。

    【讨论】:

    • 感谢艾伦的指正。将文件直接添加到主包将不起作用,因为该文件不可编辑。您链接的网页表明数据容器的 Library/Sounds 文件夹也将被苹果自动检测到,我希望该目录中的文件是可编辑的。因此,我的问题是询问如何将文件添加到此目录。即使库/声音中的文件不可编辑,我也会将答案标记为正确,只要有人能告诉我该怎么做。
    • @Cymric 如果你正在寻找在库中运行时创建文件,那么你应该看看这个 SO 帖子:stackoverflow.com/questions/27216189/…
    • 我从那个问题中发现了在库中创建目录时我做错了什么,这是为我指出的
    • 链接已过期。 404 页面。
    【解决方案3】:

    我在工作中遇到了完全相同的问题。我会建议 -

    1. 您的项目中有多个声音文件。
    2. 保留用户的声音选择。
    3. 当您收到推送通知时,使用您在第 2 步中坚持的内容播放声音。

    【讨论】:

    • 设备播放的声音由推送通知payload中的字符串控制,例如,如果服务器发送sound1.caf,则应用无法播放sound2.caf。正如我的问题所述,服务器无法向不同的用户发送不同的声音字符串。
    • 您说它由推送通知有效负载中的字符串“控制”。但是,服务器无法向不同的用户发送不同的声音字符串。那么,推送通知负载中的字符串是如何控制它的呢?为什么你没有多个声音文件,并且在客户端有一些可以播放声音的逻辑。为什么要编辑文件?
    • 当手机收到远程推送通知时,操作系统会自动搜索通知payload中指定的声音文件并播放。应用程序无法修改此过程。当通知到达时,应用程序甚至可能没有运行。
    • 要使用同一个文件播放不同的声音,我需要覆盖该文件的内容。如果我解释得不够清楚,我在上面的问题中添加了一个指向我的解决方案的链接。
    猜你喜欢
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    • 2020-03-11
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多