自定义iPhone震动强度

8

这是一个关于iOS是否有自定义振动的API?的问题。

我能够创建自定义的振动模式,但无法控制其强度。

以下是从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);

该行代码添加了键@"Intensity"和一个int值,但并没有起作用,我不知道如何查看AudioServicesPlaySystemSoundWithVibration方法的内部以找出问题所在。我需要传递什么参数才能改变震动强度呢?目前,无论我传递1、1000、0.4或0.0001,都是相同的强度(在iOS7上的iPhone 4上)。有人能重新创建这个问题吗? 我希望不仅能够创建振动模式,还能创建平滑的振动信号。怎么做?
(由于这是一个仪器设计研究项目,我目前不关心App Store的限制。)

1
我不确定,但我怀疑iPhone硬件目前根本不支持可变振动强度。如果它存在的话,我肯定从未见过它使用该功能。 - user149341
1个回答

3
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标记了开头。使用它可以更好地组织代码。希望能有所帮助!


你可能已经注意到我一直在使用数组/数字字面量。你有什么特别的原因偏爱dictionaryWithObjects: forKeys:而不是@{}吗? - James Webster
@JamesWebster 我忘记了如何使用字典字面量。 - DDPWNAGE
这只是一个 @{ key : value, key : value, ... } - James Webster
1
@DDPWNAGE,我遇到了语句错误,提示“在C99中隐式声明的函数AudioServicesPlaySystemSoundWithVibration无效”。请问有没有替代方法?你能帮忙吗?我需要运行大约500毫秒的振动,不超过这个时间。 - Sathish
我猜他们正在使用私有API..是否有iOS API可以改变震动的强度和持续时间? - Dharasis Behera
应该是 time += [x doubleValue] / 1000.0; 吧? - Teivaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接