在我的应用程序中,我使用以下编码模式来振动我的iPhone设备
包括:AudioToolbox
框架
标题文件:
#import "AudioToolbox/AudioServices.h"
代码:
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
我的问题是,当我运行我的应用程序时,它会振动,但只有第二次,但我希望它会持续振动直到我停止它。
怎么可能?
答案 0 :(得分:22)
幸运的是,无法改变振动的持续时间。触发振动的唯一方法是播放kSystemSoundID_Vibrate
。如果你真的想要,你可以做的是无限期地重复振动,产生脉冲振动效果而不是长连续振动效果。为此,您需要注册一个回调函数,当您播放的振动声音完成时将调用该函数:
AudioServicesAddSystemSoundCompletion (
kSystemSoundID_Vibrate,
NULL,
NULL,
MyAudioServicesSystemSoundCompletionProc,
NULL
);
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
然后你定义你的回调函数再次重放振动声音:
#pragma mark AudioService callback function prototypes
void MyAudioServicesSystemSoundCompletionProc (
SystemSoundID ssID,
void *clientData
);
#pragma mark AudioService callback function implementation
// Callback that gets called after we finish buzzing, so we
// can buzz a second time.
void MyAudioServicesSystemSoundCompletionProc (
SystemSoundID ssID,
void *clientData
) {
if (iShouldKeepBuzzing) { // Your logic here...
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
} else {
//Unregister, so we don't get called again...
AudioServicesRemoveSystemSoundCompletion(kSystemSoundID_Vibrate);
}
}
答案 1 :(得分:4)
有很多示例显示如何通过私有CoreTelephony调用来执行此操作:_CTServerConnectionSetVibratorState
,但由于您的应用将因滥用而被拒绝,因此它确实不是明智的行动方式振动这样的功能。只是不要这样做。
答案 2 :(得分:1)
阅读适用于iPhone的Apple人机交互指南。我认为这不是应用程序中的批准行为。
答案 3 :(得分:0)
iOS 5已实施自定义振动模式。因此在某些情况下可变振动是可以接受的唯一不知道的是什么库处理它(非常肯定不是CoreTelephony)以及它是否对开发人员开放。所以继续搜索。
答案 4 :(得分:0)
上面的答案很好,你也可以用简单的方法来做。
您可以使用递归方法调用。
func vibrateTheDeviceContinuously() throws {
// Added concurrent queue for next & Vibrate device
DispatchQueue.global(qos: .utility).async {
//Vibrate the device
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
self.incrementalCount += 1
usleep(800000) // if you don't want pause in between, remove this line.
do {
if let isKeepBuzzing = self.iShouldKeepBuzzing , isKeepBuzzing == true {
try self.vibrateTheDeviceContinuously()
}
else {
return
}
} catch {
//Exception handle
print("exception")
}
}
}
要停止设备振动,请使用以下行。
self.iShouldKeepBuzzing = false