自定义 iPhone 振动的强度

Posted

技术标签:

【中文标题】自定义 iPhone 振动的强度【英文标题】:Intensity of custom iPhone vibration 【发布时间】:2013-11-06 20:37:19 【问题描述】:

这是一个与Are there APIs for custom vibrations in ios? 相关的问题。 我能够创建自定义振动模式,但无法控制强度。

这是从 Kevin Cao 启用自定义振动模式的答案中复制而来的:

NSMutableDictionary* dict = [NSMutableDictionary dictionary];
NSMutableArray* arr = [NSMutableArray array ];

[arr addObject:[NSNumber numberWithBool:YES]]; //vibrate for 2000ms
[arr addObject:[NSNumber numberWithInt:2000]];

[arr addObject:[NSNumber numberWithBool:NO]];  //stop for 1000ms
[arr addObject:[NSNumber numberWithInt:1000]];

[arr addObject:[NSNumber numberWithBool:YES]];  //vibrate for 1000ms
[arr addObject:[NSNumber numberWithInt:1000]];

[arr addObject:[NSNumber numberWithBool:NO]];    //stop for 500ms
[arr addObject:[NSNumber numberWithInt:500]];

[dict setObject:arr forKey:@"VibePattern"];
[dict setObject:[NSNumber numberWithInt:1] forKey:@"Intensity"];


AudioServicesPlaySystemSoundWithVibration(4095,nil,dict);

int 值添加键@"Intensity" 的代码行没有解决问题,我不知道如何查看AudioServicesPlaySystemSoundWithVibration 方法来找出答案。我必须传递给它什么才能真正改变强度? 现在,我是否通过 1、1000、0.4 或 0.0001 并不重要,它始终是相同的强度(在带有 iOS7 的 iPhone 4 上)。 谁能重现这个?

我希望不仅能够创建振动模式,还希望能够创建平滑的振动包络。 怎么做?


(由于这是一个仪器设计研究项目,我(还)不关心应用商店的限制。)

【问题讨论】:

我不确定,但我怀疑 iPhone 硬件此时根本不支持可变振动强度。我当然从未见过它使用这种功能,如果它存在的话。 【参考方案1】:

numberWithInt 调用更改为 numberWithFloat,并将强度更改为介于 0 和 1 之间。当他们使用 int 而不是 float 时,我觉得这很奇怪。


编辑:这是一个复制/粘贴,应该适用于您的代码调用自定义振动:

#pragma mark - Custom vibration methods
-(void)invokeCustomVibrationWithStartStopTimes:(NSArray*)startStopTimes andIntensity:(float)intensity 
    BOOL startOrStop = YES;
    NSMutableArray* arr = [@[] mutableCopy];
    double time = 0;
    for (NSNumber *x in stopStartTimes) 
        [arr addObject:x]
        startOrStop = !startOrStop;
        [arr addObject:@(startOrStop)];
        time = [x doubleValue] / 1000.0;
    
    AudioServicesPlaySystemSoundWithVibration(4095,nil,@"VibePattern":arr,@"Intensity":@(intensity))
    [self performSelector:@selector(stop) withObject:nil afterDelay:time];


-(void)stop 
    AudioServicesStopSystemSound(4095); // stop buzzing the phone

对于startStopTimes,它应该在开始时间和停止时间之间交替。传入这个数组:

@[@(2000), @(1000), @(1000), @(500)]

将执行示例代码所做的操作。在这种情况下,它将启动 2000 毫秒,停止 1000 毫秒,启动 1000 毫秒,停止 500 毫秒。

stop 被调用来停止声音。按照我的设置方式,它会在发送的总时间后停止发声。

您可能已经注意到我一直在使用数组/数字字面量,而不是使用 [NSArray arrayWithObjects: ... , nil];[NSNumber numberWith...];。这使您的代码更短。另外,我用#pragma mark 标记了开头。用它来更好地组织它。希望对您有所帮助!

【讨论】:

You may have noticed I've been using array/number literals.. 你有什么特别的理由喜欢dictionaryWithObjects: forKeys:而不是@ @JamesWebster 我忘记了如何使用字典文字。 只是@ key : value, key : value, ... @DDPWNAGE 我收到语句错误,例如“函数 AudioServicesPlaySystemSoundWithVibration 的隐式声明在 C99 中无效”。这种方法的替代方法是什么。你能帮忙吗?我需要运行振动大约 500 毫秒,不超过这个。 我猜这是他们使用的私有 API。是否有任何 IOS api 也可以改变振动强度和持续时间

以上是关于自定义 iPhone 振动的强度的主要内容,如果未能解决你的问题,请参考以下文章

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

iOS8中的自定义振动

如何为特定来电提供自定义振动

iOS 8 中的自定义振动 - Swift

iOS 带有振动的自定义键盘

自定义view实现阻尼效果的加载动画