ios 如何使用documents目录中的声音文件进行本地通知?

f4t66c6m  于 2023-04-08  发布在  iOS
关注(0)|答案(4)|浏览(142)

在我的iOS应用程序中,如何播放存储在应用程序文档目录中的声音文件以进行本地通知,而不是应用程序包中的声音文件?
我在App Store上看到过几个应用程序可以做到这一点,我想知道这是如何实现的。

vof42yt1

vof42yt11#

实际上,可以在应用程序的主包(NSBundle)中没有的本地通知中播放自定义声音。
声音必须存储在Library/Sounds目录中,例如:/var/mobile/Containers/Data/Application/DD7E6BA0-2FC0-4DE0-95BF-C2E9C9A94E08/Library/Sounds/mySound.caf
在UILocalNotification soundName属性中引用声音文件时,只需写入文件名,而不是完整的目录路径:

alert.soundName = @"mySound.caf";

在iOS9.3.5上测试和工作。我还没有尝试过其他iOS版本。

脚注:

我碰巧在搜索苹果文档中关于远程通知Here的信息时发现了这一信息--具体来说,是“有效载荷键”部分,其中提到了声音。
Apple的本地和远程通知文档(此处)还提到,如果声音文件位于应用程序的主包或数据容器中,则可以使用它们:
要播放声音,请将声音分配给soundName属性。您可以在应用的主包(或数据容器)中分配未本地化的自定义声音的文件名,也可以分配UILocalNotificationDefaultSoundName以获取默认系统声音。声音应始终伴随警报消息或图标标记的显示;在没有其它通知类型的情况下不应播放声音。

4ioopgfo

4ioopgfo2#

不可以,您不能播放不在捆绑包中的音频文件,也不能在运行时修改应用程序捆绑包。Apple要求本地通知的所有声音与应用程序捆绑的一个原因可能是出于安全原因,这将使所有捆绑文件在审查过程中检查安全风险成为可能。

ki1q1bka

ki1q1bka3#

没错...

You can not play audio file stored in document directory for alarm as a local push notification.

这些应用程序基本上看起来像从本地推送通知的文档目录中播放自定义音频,但事实并非如此。使用推送通知,当通知到来时,当我们单击该通知的查看按钮时,生成本地推送通知的应用程序将被调用,最后选择的音频文件将被播放。
通过这种方式,应用程序看起来像是使用文档目录中的自定义音频文件的自定义推送通知

tct7dpnv

tct7dpnv4#

支持iOS 10及以上

从iOS 10开始,您可以使用UNMutableNotificationContent与自定义声音,即使它不在主应用程序包中。
1.将声音文件添加到您的自定义包中,在我的示例中,它是动态Test.Framework中的“watch_me_request_notification.wav”

1.将声音文件注册到/Library/Sounds(参考:https://developer.apple.com/documentation/usernotifications/unnotificationsound/1649031-soundnamed

let libraryDirectory = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask)[0]
 let soundDirectory = libraryDirectory.appendingPathComponent("Sounds")

 do {
     try? FileManager.default.createDirectory(atPath: soundDirectory.path,
                                              withIntermediateDirectories: true,
                                              attributes: nil)

     let destFile = soundDirectory.appendingPathComponent("watch_me_request_notification.wav")

     if let sourceFile = Bundle(for: type(of: self)).url(forResource: "watch_me_request_notification", withExtension: "wav") {
         try FileManager.default.copyItem(at: sourceFile, to: destFile)
     }
 } catch let error as NSError {
     print("Error: \(error.localizedDescription)")
 }

1.创建应用内通知时在UNMutableNotificationContent中注册自定义声音

let content = UNMutableNotificationContent()
 content.sound = UNNotificationSound(named: UNNotificationSoundName("watch_me_request_notification.wav"))
 let request = UNNotificationRequest(identifier: "1", content: content, trigger: nil)

相关问题