Espero que esto no te llegue demasiado tarde, pero ¿no es frustrante que Safari para iOS 4.2+ registre DeviceOrientationEvent en un iPhone 3GS (u otros dispositivos sin giroscopio)?
Conclusión, DeviceOrientation no funciona con el iPhone 3GS. Pero como alguien mencionó, DeviceMotionEvent funciona, pero tienes que acceder a los datos del evento de una manera diferente a como lo harías con un dispositivo con un giroscopio (¡qué tonto lo sé!).
Primer paso: Agregué una variable en la mezcla para capturar si el OrientationEvent estaba o no disparando datos no nulos (como lo haría si hubiera un giroscopio).
var canHandleOrientation;
if (window.DeviceOrientationEvent) {
window.addEventListener("deviceorientation", handleOrientation, false);
}
function handleOrientation(event){
console.log("Orientation:" + event.alpha + ", " + event.beta + ", " + event.gamma);
canHandleOrientation = event; // will be either null or with event data
}
¡Ahora ya sabes si el evento en realidad tiene datos de giroscopio o no! Por lo tanto, si desea usar otra cosa de manera predeterminada (es decir, window.DeviceMotionEvent), puede usar un condicional.
if (!canHandleOrientation) {
console.log("There is no gyroscope")
}
He probado esto en Safari Mobile para iPhone 3GS (sin giroscopio) y iPad 2 (giroscopio) y Chrome en mi Macbook Pro (giroscopio). Parece funcionar.
Ahora, si desea obtener los datos DeviceMotionEvent como alternativa, si los datos de orientación no está disponible, entonces ...
if (window.DeviceMotionEvent && !canHandleOrientation) {
window.addEventListener('devicemotion', handleMotion, false);
}
function handleMotion(event){
if(event.acceleration){
//requires a gyroscope to work.
console.log("Motion Acceleration: " + event.acceleration.x + ", " + event.acceleration.y + ", " + event.acceleration.z);
}
else{
//this is for iPhone 3GS or a device with no gyroscope, and includes gravity.
console.log("Motion AccelerationGravity: " + event.accelerationIncludingGravity.x + ", " + event.accelerationIncludingGravity.y + ", " + event.accelerationIncludingGravity.z);
}
}
Esto debería cubrir sus bases para la mayoría de dispositivos con un navegador WebKit .. . Espero. Havent lo probó en cualquier dispositivo Android.
Cabe señalar que cada evento devuelve números diferentes, por lo que es posible que deba hacer algún trabajo para normalizarlos. Pero estos son los conceptos básicos de cómo acceder a ellos.
¡Avíseme si esto es útil!
Hola, sólo puedo detectar el dispositivo de movimiento ** ** Evento con el 3GS! El código escrito anteriormente, con DeviceOrientationEvent Listener, funciona bien con un iPhone 4 y iPad 2 pero no funciona en iPhone 3GS. – MavBzh