ios - sonido - vibracion iphone 6
Haciendo vibrar el iPhone (12)
¿Cómo se puede configurar el iPhone para que vibre una vez?
Por ejemplo, cuando un jugador pierde una vida o el juego termina, el iPhone debería vibrar.
Nota Importante: Alerta de Depreciación Futura.
A partir de iOS 9.0 , la descripción de las funciones de la API para:
AudioServicesPlaySystemSound(inSystemSoundID: SystemSoundID)
AudioServicesPlayAlertSound(inSystemSoundID: SystemSoundID)
Incluye la siguiente nota:
This function will be deprecated in a future release.
Use AudioServicesPlayAlertSoundWithCompletion or
AudioServicesPlaySystemSoundWithCompletion instead.
La forma correcta de hacerlo será usar cualquiera de estos dos:
AudioServicesPlayAlertSoundWithCompletion(kSystemSoundID_Vibrate, nil)
o
AudioServicesPlayAlertSoundWithCompletion(kSystemSoundID_Vibrate) {
//your callback code when the vibration is done (it may not vibrate in iPod, but this callback will be always called)
}
recuerde
import AVFoundation
Swift 3.0
Igual que 2.0, sin cambios.
Swift 2.0
AudioToolbox ahora presenta el kSystemSoundID_Vibrate
como un tipo de SystemSoundID
, por lo que el código es:
import AudioToolbox.AudioServices
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate)
En lugar de tener que pasar por el paso extra del elenco
(Props a @Dov)
Respuesta original (Swift 1.x)
Y, así es como lo haces en Swift (en caso de que te encuentres con los mismos problemas que yo)
Enlace contra AudioToolbox.framework
(Vaya a su proyecto, seleccione su objetivo, construya fases, Enlace binario con bibliotecas, agregue la biblioteca allí)
Una vez que se completa:
import AudioToolbox.AudioServices
// Use either of these
AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))
Lo cursi es que SystemSoundID
es básicamente un typealias
(fancy swift typedef
) para un UInt32
, y el kSystemSoundID_Vibrate
es un Int
normal. El compilador le da un error al intentar convertir desde Int
a UInt32
, pero el error se lee como "No se puede convertir a SystemSoundID", lo cual es confuso. ¿Por qué Apple no lo hizo simplemente una enumeración Swift?
@ aponomarenko entra en los detalles, mi respuesta es solo para los Swifters.
En Swift:
import AVFoundation
...
AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
En iOS 10, y en los iPhones más nuevos, también puede utilizar la API háptica. Esta retroalimentación táctil es más suave que la API de AudioToolbox.
Para el escenario de GAME OVER, una respuesta de impacto de IU pesada debería ser adecuada.
UIImpactFeedbackGenerator(style: .heavy).impactOccurred()
Podrías usar los otros estilos de retroalimentación háptica .
En mi caso estaba usando el AVCaptureSession. AudioToolbox estaba en las fases de compilación del proyecto y se importó pero aún no funcionó. Para que funcione, detuve la sesión antes de la vibración y continué después de eso.
#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];
}
En mis viajes descubrí que si prueba alguno de los siguientes mientras graba audio, el dispositivo no vibrará aunque esté activado.
1) AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
2) AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
Mi método fue llamado en un momento específico en la medición de los movimientos de los dispositivos. Tuve que detener la grabación y luego reiniciarla después de que ocurrió la vibración.
Se veía así.
-(void)vibrate {
[recorder stop];
AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);
[recorder start];
}
recorder
es una instancia de AVRecorder.
Espero que esto ayude a otros que han tenido el mismo problema antes.
Puedes usar
1) AudioServicesPlayAlertSound (kSystemSoundID_Vibrate);
para iPhone y algunos iPods más nuevos.
2) AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);
para iPads.
Tenía muchos problemas con esto para los dispositivos que tenían la vibración desactivada de alguna manera, pero necesitábamos que funcionara independientemente, ya que es fundamental para el funcionamiento de nuestra aplicación y, dado que es solo un número entero para una llamada de método documentada, se aprobará. validación. Así que he intentado algunos sonidos que estaban fuera de los bien documentados aquí: TUNER88/iOSSystemSoundsLibrary
Luego me he topado con el 1352, que funciona independientemente del interruptor silencioso o la configuración del dispositivo (Settings->vibrate on ring, vibrate on silent)
.
- (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);
}
}
Todos los dispositivos tienen un motor incorporado para crear efectos de vibración, y si solo quieres una vibración rápida.
extension UIDevice {
static func vibrate() {
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
}
}
Ahora puedes llamar cuando sea necesario.
UIDevice.vibrate()
Una forma sencilla de hacerlo es con los servicios de audio:
#import <AudioToolbox/AudioToolbox.h>
...
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
Y si está usando el framework Xamarin (monotouch), simplemente llame
SystemSound.Vibrate.PlayAlertSound()
De " Tutorial de iPhone: Mejor manera de verificar las capacidades de los dispositivos iOS ":
Hay dos funciones aparentemente similares que toman un parámetro kSystemSoundID_Vibrate
:
1) AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
2) AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
Ambas funciones vibran el iPhone. Pero, cuando usa la primera función en dispositivos que no admiten vibración, suena un pitido. La segunda función, por otro lado, no hace nada en dispositivos no compatibles. Entonces, si va a hacer vibrar el dispositivo continuamente, como alerta, dice el sentido común, use la función 2.
Primero, agregue el marco de AudioToolbox.framework
a su objetivo en las fases de compilación.
Luego, importa este archivo de encabezado:
#import <AudioToolbox/AudioServices.h>