用户通知:自定义振动模式

Posted

技术标签:

【中文标题】用户通知:自定义振动模式【英文标题】:User Notification: Custom Vibration pattern 【发布时间】:2017-07-14 11:07:45 【问题描述】:

是否可以为用户通知警报创建自定义振动模式?例如,我们可以为用户通知选择不同的音频。是否也可以有自定义的振动模式?

我的意思是在 ios 上使用 swift 以编程方式执行此操作。

【问题讨论】:

【参考方案1】:

用于在 iOS 中创建自定义振动。使用 AudioServicesPlaySystemSoundWithVibration 和 AudioServicesStopSystemSound。

心跳振动示例

NSMutableDictionary* pulsePatternsDict = [@ mutableCopy];
        NSMutableArray* pulsePatternsArray = [@[] mutableCopy];

        // beat for 100 times
        for (NSInteger i=0; i<100; i++)
            [pulsePatternsArray addObject:@(YES)]; // vibrate for 100ms
            [pulsePatternsArray addObject:@(100)];

            [pulsePatternsArray addObject:@(NO)];  //stop for 1200ms * 0.3
            [pulsePatternsArray addObject:@(1200*0.3)];

            [pulsePatternsArray addObject:@(YES)];  //vibrate for 100ms
            [pulsePatternsArray addObject:@(100)];

            [pulsePatternsArray addObject:@(NO)];    //stop for 1200ms * 0.5
            [pulsePatternsArray addObject:@(1200*0.5)];
        

        [pulsePatternsDict setObject:pulsePatternsArray forKey:@"VibePattern"];
        [pulsePatternsDict setObject:[NSNumber numberWithInt:1.0] forKey:@"Intensity"];

        AudioServicesPlaySystemSoundWithVibration(kSystemSoundID_Vibrate, nil, pulsePatternsDict);

但只有调用它 (AudioServicesPlaySystemSoundWithVibration ) 才会使振动永不停止。所以我必须找到一些函数来阻止它。

答案是AudioServicesStopSystemSound。也是 AudioToolbox 框架中的私有函数。

函数的声明是这样的

void AudioServicesStopSystemSound(SystemSoundID inSystemSoundID)

注意:AudioServicesPlaySystemSoundWithVibration 仅适用于 iOS6

iOS 9 和 iOS 9.1 目前没有公开可用的 API。

而在 iOS 10 中,有一个名为 UIFeedbackGenerator 的新 API。有关更多详细信息,请参阅此post。它目前仅适用于 iPhone 7 和 iPhone 7 Plus。

免责声明:有一种方法可以直接与 Taptic Engine (iOS 9) 交互,但有一种私有方法。您不应在 App Store 应用程序中使用它。

【讨论】:

此方法只能在应用处于前台时“播放”自定义模式。我的问题是与用户通知相关的模式,但在应用程序处于前台时不播放振动。 是的,只有在后台和前台应用时才有效。函数应用程序:didReceiveRemoteNotification:fetchCompletionHandler:它可能会或可能不会调用该方法。如果用户禁用了后台更新,则该方法永远不会被调用,并且当应用处于终止状态时,无法创建自定义振动模式。 这个答案与我的问题无关。 直接与 Taptic Engine 交互的方式是什么?它可能对内部项目有所帮助。【参考方案2】:

你可以试试这个。在下面的代码中,您可以获得不同类型的带音频和不带音频的振动。确保你已经导入了这些(导入 AudioToolbox,导入 AVFoundation)

if(selectedRow == 0)
          AudioServicesPlaySystemSound(SystemSoundID(1304))
        else if(selectedRow == 1)
             AudioServicesPlaySystemSound(SystemSoundID(1329))
        else if(selectedRow == 2)
            AudioServicesPlaySystemSound(SystemSoundID(1301))
        else if(selectedRow == 3)
           AudioServicesPlaySystemSound(SystemSoundID(1027))
        else if(selectedRow == 4)
           AudioServicesPlaySystemSound(SystemSoundID(1028))
        else if(selectedRow == 5)
            let alert = SystemSoundID(1011)
            AudioServicesPlaySystemSoundWithCompletion(alert, nil)
        else if(selectedRow == 6)
           AudioServicesPlaySystemSound(SystemSoundID(1333))
        else if(selectedRow == 7)
           AudioServicesPlaySystemSound(SystemSoundID(4095))
        

【讨论】:

以上是关于用户通知:自定义振动模式的主要内容,如果未能解决你的问题,请参考以下文章

自定义 iPhone 振动的强度

iOS8中的自定义振动

在静音模式下播放声音,应用程序终止状态

在 iPhone 上振动时播放自定义声音

iOS 8 中的自定义振动 - Swift

iOS 带有振动的自定义键盘