使iPhone震动
iPhone如何设置振动一次?
例如,当玩家失去生命或游戏结束时,iPhone应该振动。
从“ iPhone教程:更好的方式来检查iOS设备的function ”:
有两个表面上看起来类似的函数需要一个参数kSystemSoundID_Vibrate
:
1) AudioServicesPlayAlertSound(kSystemSoundID_Vibrate); 2) AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
这两个function振动iPhone。 但是,当您在不支持振动的设备上使用第一个function时,会发出嘟嘟声。 另一方面,第二个function在不支持的设备上不做任何事情。 所以,如果你要持续震动设备,作为一个警报,常识说,使用function2。
首先,在构build阶段将AudioToolbox框架AudioToolbox.framework
添加到您的目标。
然后,导入这个头文件:
#import <AudioToolbox/AudioServices.h>
一个简单的方法是使用audio服务:
#import <AudioToolbox/AudioToolbox.h> ... AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
Swift 3.0
和2.0一样,没有变化。
Swift 2.0
AudioToolbox现在将kSystemSoundID_Vibrate
为SystemSoundID
types,所以代码是:
import AudioToolbox.AudioServices AudioServicesPlaySystemSound(kSystemSoundID_Vibrate) AudioServicesPlayAlertSound(kSystemSoundID_Vibrate)
而不必经过额外的铸造步骤
(道具到@Dov)
原始答案(Swift 1.x)
而且,这里是你如何在Swift上做的(如果你遇到同样的麻烦)
链接到AudioToolbox.framework
(转到您的项目,select您的目标,构build阶段,链接二进制与库,在那里添加库)
一旦完成:
import AudioToolbox.AudioServices // Use either of these AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate)) AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))
typealias
, SystemSoundID
基本上是一个UInt32
的typealias
(花式swift typedef
),而kSystemSoundID_Vibrate
是一个常规的Int
。 编译器给你一个错误,试图从Int
到UInt32
,但错误读作“无法转换为SystemSoundID”,这是混乱。 为什么苹果没有把它变成一个Swift枚举超越了我。
@ aponomarenko的细节,我的答案只是在那里的Swifters。
对于以某种方式closures振动的设备,我遇到了很大的麻烦,但我们需要它的工作,因为它对于我们的应用程序function至关重要,而且由于它只是一个整数forms的logging方法调用,所以它会通过validation。 所以我尝试了一些声音,这些声音在这里是有据可查的: TUNER88 / iOSSystemSoundsLibrary
然后,我偶然发现了1352,无论静音开关还是设备上的设置(Settings->vibrate on ring, vibrate on silent)
,1352都在工作。
- (void)vibratePhone; { if([[UIDevice currentDevice].model isEqualToString:@"iPhone"]) { AudioServicesPlaySystemSound (1352); //works ALWAYS as of this post } else { // Not an iPhone, so doesn't have vibrate // play the less annoying tick noise or one of your own AudioServicesPlayAlertSound (1105); } }
重要提示:未来弃用警报。
截至iOS 9.0 , API函数描述为:
AudioServicesPlaySystemSound(inSystemSoundID: SystemSoundID) AudioServicesPlayAlertSound(inSystemSoundID: SystemSoundID)
包括以下说明:
This function will be deprecated in a future release. Use AudioServicesPlayAlertSoundWithCompletion or AudioServicesPlaySystemSoundWithCompletion instead.
正确的方法将使用以下任何一个:
AudioServicesPlayAlertSoundWithCompletion(kSystemSoundID_Vibrate, nil)
要么
AudioServicesPlayAlertSoundWithCompletion(kSystemSoundID_Vibrate) { //your callback code when the vibration is done (it may not vibrate in iPod, but this callback will be always called) }
记得
import AVFoundation
如果你使用Xamarin(monotouch)框架,只需打电话
SystemSound.Vibrate.PlayAlertSound()
在我的旅行中,我发现如果在录制audio时尝试以下任一操作,即使启用了设备,设备也不会振动。
1) AudioServicesPlayAlertSound(kSystemSoundID_Vibrate); 2) AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
我的方法在设备运动测量的特定时间被调用。 我必须停止录音,然后在震动发生后重新开始录音。
看起来像这样
-(void)vibrate { [recorder stop]; AudioServicesPlaySystemSound (kSystemSoundID_Vibrate); [recorder start]; }
recorder
是一个AVRecorder实例。
希望这能帮助其他曾经有过同样问题的人。
在Swift中:
import AVFoundation ... AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
在我的情况下,我正在使用AVCaptureSession。 AudioToolbox在项目的构build阶段,它被导入,但仍然无法正常工作。 为了使它工作,我在振动之前停止了这个工作,然后继续工作。
#import <AudioToolbox/AudioToolbox.h> ... @property (nonatomic) AVCaptureSession *session; ... - (void)vibratePhone; { [self.session stopRunning]; NSLog(@"vibratePhone %@",@"here"); if([[UIDevice currentDevice].model isEqualToString:@"iPhone"]) { AudioServicesPlaySystemSound (kSystemSoundID_Vibrate); } else { AudioServicesPlayAlertSound (kSystemSoundID_Vibrate); } [self.session startRunning]; }
您可以使用
1)AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
为iPhone和less数较新的iPod。
2)AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
为iPad。