iOS 无法为远程通知播放自定义声音

Posted

技术标签:

【中文标题】iOS 无法为远程通知播放自定义声音【英文标题】:iOS Unable to play custom sound for remote notifications 【发布时间】:2016-11-08 11:26:37 【问题描述】:

我一直在尝试为 ios 上的通知实现自定义声音。

根据示例 3 here 中的 Apple 文档。我们需要做的就是确保推送通知负载应该是这样的:


"aps" : 
        "alert" : "You got your emails.",
        "badge" : 9,
        "sound" : "bingbong.aiff"
    

而且 bingbong.aiff 必须放在应用程序包中。

此外,如果应用程序处于活动状态,建议我添加以下代码:

- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo

    if (application.applicationState == UIApplicationStateActive)
    
        NSString *path = [[NSBundle mainBundle] pathForResource:@"bingbong" ofType:@"aiff"];
        theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path]error:NULL];

        theAudio.delegate = self;
        [theAudio play];
    

"bingbong.aiff" 放在"SupportingFiles"

我仍然没有收到远程通知的自定义声音。

我已经完成了与此类似的其他 SO 问题,但这些问题与我正在做的事情没有什么不同。

    How to play custom sound file when user get push notification?

    Custom sounds in remote notifications iOS 10, swift 3

    Change push notification sound

【问题讨论】:

向你的脚本展示你是如何从服务器触发通知的。 应用打开时调用didReceiveRemoteNotification函数并收到推送,打开应用时是否听到声音? @iphonic 不,应用打开时我听不到任何声音。在后台播放默认声音。 @Ichthyocentaurs 尝试在didReceiveRemoteNotification 中设置断点,看看是否获得了正确的文件,可能是您的声音文件有问题? 【参考方案1】:

默认声音:

根据苹果文档和指南播放默认声音,您必须在声音文件中发送“默认”值。否则它也不会播放默认声音。

自定义声音

您需要在 php script** 中传递自定义声音文件名来代替 default

    对于自定义声音文件必须存在于您的Xcode 项目中 资源。 确保声音文件的持续时间不超过 30 秒。除此以外 它将播放默认声音。 并且您必须添加以下密钥UILocalNotificationDefaultSoundName.plist 文件中。见下图:

【讨论】:

这种情况下 .mp3 文件是否也可以使用,我尝试了上述方法但不起作用。 这里支持我.waw 工作正常,或者你可以尝试一些苹果支持的扩展,可能.mp3 不支持,请仔细检查你的 php 脚本,这可能会导致问题。 我在项目中放置文件的方式有问题吗?我刚刚添加了条目“UILocalNotificationDefaultSoundName”-字符串-“customsound.aiff”。我通过菜单选项“File”>“Add files to Project”将Xcode中的声音文件添加到文件夹Supporting Files @Ichthyocentaurs 这里一切正常,但扩展名为.aiff 的声音文件看起来很可疑,只需使用.wav.caf(推荐)转换声音文件即可。 让我试试咖啡馆【参考方案2】:

删除didReceiveRemoteNotification 中的AVPlayer 内容。

确保:

声音长度 文件确实是其中一种受支持的格式(aiff、wav、caf) 该文件确实存在于您的捆绑包中(复制捆绑包资源)

您已注册推送通知:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 
    let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
    UIApplication.sharedApplication().registerUserNotificationSettings(settings)
    UIApplication.sharedApplication().registerForRemoteNotifications()

    return true

名称与文件名完全匹配:

 
    "aps" : 
        "alert" : "message",
        "badge" : 1,
        "sound" : "name.aiff"
    

【讨论】:

我把AVPlayer的代码去掉了,已经在applicationDidFinishLaunching:有权限了,但是还是没有解决 文件“目标会员”对我来说是缺失的部分,谢谢【参考方案3】:

Swift 5 答案,您可以使用 AudioToolbox 做到这一点,非常适合短声音剪辑:

    播放默认系统声音(这里是声音代码列表:http://iphonedevwiki.net/index.php/AudioServices)

    导入音频工具箱

    AudioServicesPlaySystemSound(1103)

    播放您之前拖入 Xcode 项目的声音文件:

    var soundID:SystemSoundID = 0

    let filePath = Bundle.main.path(forResource: "file_name", ofType: "wav") // 或者 mp3,这取决于你的声音文件的扩展名

    让 soundURL = URL(fileURLWithPath: filePath!)

    AudioServicesCreateSystemSoundID(soundURL as CFURL, &soundID)

    AudioServicesPlaySystemSound(soundID)

【讨论】:

以上是关于iOS 无法为远程通知播放自定义声音的主要内容,如果未能解决你的问题,请参考以下文章

远程通知音量级别与应用程序中播放的声音不同

IOS推送通知自定义声音不起作用

自定义声音不播放推送通知

收到远程通知时如何播放声音?

本地通知 IONIC 3 中的自定义声音

添加自定义推送通知声音 ios5 不起作用