在后台模式下接收远程推送通知是不是可以多次振动?

Posted

技术标签:

【中文标题】在后台模式下接收远程推送通知是不是可以多次振动?【英文标题】:Is it possible to vibrate multiple times on receiving remote push notification in background mode?在后台模式下接收远程推送通知是否可以多次振动? 【发布时间】:2019-07-18 10:49:18 【问题描述】:

我想通过远程通知通知护士患者发生了一些不好的事情。所以我想在她/他收到通知时振动 8 次。

当我的应用收到远程推送通知时,它会触发我的通知服务扩展的

func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void)  

在那个函数中,我调用

AudioservicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))
sleep(1)      
AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))

但是只触发了一次默认的振动。

收到推送通知时是否可以多次振动? 或者我可以使用自定义振动模式使其振动多次吗? 如果不可能,您能否提供一些表明这一点的官方文件?很难证明一件事是不可能的。

【问题讨论】:

您是否尝试过安排 7 次本地通知,但安排间隔很小? 也许这个答案会有所帮助:***.com/questions/45101474/… @Scriptable 抱歉。正如那里的提问者所说“这个答案与我的问题无关”那里提供的答案与如何使用自定义振动进行通知完全无关。 @Vladlex 我的 SA 表示,不止一份通知会误导护士,认为不止一名患者有问题。 好的。你能说一下你在哪个线程上尝试睡觉/播放声音吗? 【参考方案1】:

您是否尝试在不同的队列中播放声音和睡眠?

我编写了一个简单的类来播放系统声音,就我而言,它运行良好(但我没有尝试在扩展目标中使用它):

import Foundation
import AudioToolbox

public class SoundPlayer 

    private let sound: SystemSoundID

    private var playing = false

    private let limit: Int

    public init(sound: SystemSoundID = kSystemSoundID_Vibrate,
                limit: Int = 8) 
        self.sound = sound
        self.limit = limit
    

    public func play() 
        guard !playing else 
            return
        
        playing = true

        play(idx: 0)
    

    private func play(idx: Int) 
        guard idx < limit else 
            return
        
        AudioServicesPlayAlertSound(sound)
        DispatchQueue.main.asyncAfter(deadline: .now() + 1)  [weak self] in
            self?.play(idx: idx + 1)
        
    

【讨论】:

【参考方案2】:

在您的应用委托中

       func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) 
        switch UIApplication.shared.applicationState 
        case .active:

            break
        case .inactive: //phone off
           AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))
sleep(1)      
AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))
            break
        case .background: //not inside the app
            AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))
    sleep(1)      
    AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))
            break
        default:  //while using the app
            break
        
            completionHandler()
        

评价它很有用,谢谢

【讨论】:

根据 UNUserNotificationCenterDelegate 的官方文档,“使用 UNUserNotificationCenterDelegate 协议的方法来处理用户从通知中选择的操作,并处理当您的应用在前台运行时到达的通知。”此方法只会在用户选择的前台或通知中触发。我希望它在“背景”中振动。我试过了,但是在后台收到远程推送时它没有被触发。好吧,无论如何,谢谢。

以上是关于在后台模式下接收远程推送通知是不是可以多次振动?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 重新上线后如何接收远程通知?

如何接收应用程序停止或设备关闭时发送的 GCM 推送通知?

iOS推送通知和远程通知的区别?

通话期间未调用远程通知回调

是否可以仅在 iOS 中的推送通知上振动?

当应用程序处于后台时接收 Apple 推送通知