Могу ли я использовать Javascript для получения заголовка компаса для iOS и Android?
Могу ли я использовать Javascript кросс-платформенным способом для получения заголовка компаса в iOS и Android (с Chrome), не используя что-то вроде PhoneGap? Я знаю, что в iOS есть DeviceOrientationEvent, но я не могу найти аналога в Chrome для Android.
4 ответа
Да, ты можешь! К сожалению alpha
не работает на iPhone / iPad. С Мобильным Сафари, alpha
основывается на направлении, на которое указывало устройство, когда была впервые запрошена ориентация устройства. Прилагаемый веб-комплект предлагает вам заголовок компаса. Чтобы это работало для всех других браузеров (которые все поддерживают alpha
как compassheading
) вы можете использовать следующий код Javascript:
if (window.DeviceOrientationEvent) {
// Listen for the deviceorientation event and handle the raw data
window.addEventListener('deviceorientation', function(eventData) {
var compassdir;
if(event.webkitCompassHeading) {
// Apple works only with this, alpha doesn't work
compassdir = event.webkitCompassHeading;
}
else compassdir = event.alpha;
});
}
Android также поддерживает Webkit, поэтому также будет использовать event.webkitCompassHeading, но это нормально.
Кстати: "oncompassneedscalibration
"также не поддерживается для iPhone и iPad.
В качестве учебного пособия вы должны просмотреть этот предыдущий связанный ответ Stackru и ознакомиться с общими практическими соображениями по использованию событий DeviceOrientation в веб-приложениях.
Простое решение, которое я предоставил в предыдущем ответе Stackru, применимо только к браузерам, которые реализуют absolute
события ориентации устройства (т. е. браузеры, в которых ориентация устройства alpha
свойство ориентировано на компас). Это означает, что решение, предоставленное там, в настоящее время работает только в браузерах Android, а не в браузерах на базе iOS или любых других браузерах, которые не предоставляют absolute
данные событий на основе устройства.
Чтобы надежно получить текущий курс компаса в браузерах Android и iOS сегодня, вам необходимо работать с обоими absolute
и не absolute
реализации, которые обеспечивают дополнительный webkitCompassHeading
и убедитесь, что учитывает любые текущие изменения ориентации экрана как часть этого. AFAIK единственная библиотека, которая в настоящее время делает это, является Full Tilt JS (отказ от ответственности: я являюсь автором этой библиотеки).
Следующий код даст вам одинаковый правильный заголовок компаса во всех браузерах iOS и Android, учитывая различия в реализациях ориентации устройства и применяя любые необходимые преобразования ориентации экрана во время выполнения:
<!-- Include the Full Tilt JS library from https://github.com/richtr/Full-Tilt-JS -->
<script src="fulltilt-min.js"></script>
<script>
// Obtain a new *world-oriented* Full Tilt JS DeviceOrientation Promise
var promise = FULLTILT.getDeviceOrientation({ 'type': 'world' });
// Wait for Promise result
promise.then(function(deviceOrientation) { // Device Orientation Events are supported
// Register a callback to run every time a new
// deviceorientation event is fired by the browser.
deviceOrientation.listen(function() {
// Get the current *screen-adjusted* device orientation angles
var currentOrientation = deviceOrientation.getScreenAdjustedEuler();
// Calculate the current compass heading that the user is 'looking at' (in degrees)
var compassHeading = 360 - currentOrientation.alpha;
// Do something with `compassHeading` here...
});
}).catch(function(errorMessage) { // Device Orientation Events are not supported
console.log(errorMessage);
// Implement some fallback controls here...
});
</script>
Вот демонстрация, которая демонстрирует эту технику, чтобы получить направление к компасу, с которым сталкивается пользователь. Он должен хорошо работать в браузерах iOS и Android.
Реализация кода в этой демонстрации такая же, как показано выше, и ее можно посмотреть на Github по адресу ./scripts/compass.js:L268-L272.
На Chrome для Android вы можете использовать 'deviceorientationabsolute'
слушатель события:
if ('ondeviceorientationabsolute' in window) {
// Chrome 50+ specific
window.addEventListener('deviceorientationabsolute', handleOrientation);
} else if ('ondeviceorientation' in window) {
window.addEventListener('deviceorientation', handleOrientation);
}
function handleOrientation(event) {
var alpha;
if (event.absolute) {
alpha = event.alpha;
} else if (event.hasOwnProperty('webkitCompassHeading')) {
// get absolute orientation for Safari/iOS
alpha = 360 - event.webkitCompassHeading; // conversion taken from a comment on Google Documentation, not tested
} else {
console.log('Could not retrieve absolute orientation');
}
console.log('Absolute orientation: ' + alpha);
}
См. Эту статью в документации для веб-разработчиков Google.
Проверено на Chrome 63 для Android.
Я полагаю, что вы можете использовать поле "заголовок" объекта местоположения, из navigator.geolocation, пожалуйста, смотрите здесь:
https://developer.mozilla.org/en-US/docs/WebAPI/Using_geolocation
Я не знаю другого пути.
Надеюсь, это поможет, А.