web-dev-qa-db-fra.com

ios 13 DeviceOrientationEvent.requestPermission: comment forcer l'appareil à demander à nouveau l'autorisation de l'utilisateur

Dans iOS 13 Apple a introduit l'API DeviceOrientationEvent.requestPermission . Elle doit être déclenchée sur action de l'utilisateur (clic, tap ou équivalent). Mon problème ici est que le résultat semble être mis en cache, donc dans le cas où l'utilisateur refuse l'autorisation, je ne peux pas demander à nouveau l'accès (la promesse est automatiquement remplie avec la valeur en cache). Existe-t-il un moyen de forcer l'appareil à oublier la valeur en cache et de demander à nouveau l'utilisateur l'autorisation d'accéder aux données d'orientation (je veux dire qu'il devrait afficher à nouveau la fenêtre contextuelle où l'utilisateur peut autoriser ou refuser l'accès)?

Voici le code pertinent:

if (DeviceOrientationEvent && typeof(DeviceOrientationEvent.requestPermission) === "function") {
    const permissionState = await DeviceOrientationEvent.requestPermission();

    if (permissionState === "granted") {
        // Permission granted    
    } else {
        // Permission denied
    }
}
3
revy

Je vois le même comportement sur iOS 13 Safari. Vous devez supprimer les données du site Web pour le site particulier qui a besoin d'une autorisation. Accédez à Paramètres> Safari> Avancé> Données du site Web, recherchez le site et supprimez toutes les données. Ensuite, l'invite devrait réapparaître lorsque vous demandez la permission.

1
Danny Moerkerke

Êtes-vous sûr que c'est un problème de mise en cache? Je ne peux pas faire incognito Safari dans iOS 13 pour répondre avec une autorisation "accordée". Je reçois une réponse "refusée" immédiatement - pas d'invite.

J'utilise le code suivant pour tester le résultat, mais il est toujours "refusé" immédiatement sans qu'un événement d'invite ne s'affiche. ( https://codepen.io/ejarnutowski/pen/WNePqmM )

<button onclick="testDeviceOrientation()">Test Device Orientation</button>
function testDeviceOrientation() {
  if (typeof DeviceOrientationEvent !== 'function') {
    return setResult('DeviceOrientationEvent not detected')
  }
  if (typeof DeviceOrientationEvent.requestPermission !== 'function') {
    return setResult('DeviceOrientationEvent.requestPermission not detected')
  }
  DeviceOrientationEvent.requestPermission().then(function(result) {
    return setResult(result);
  });
}

function setResult(result) {
  document.getElementById('result').innerHTML = 'RESULT: ' + result;
}

On dirait que drawmote.app fonctionne, mais le JS est compilé et il me faut du temps pour inverser la logique de leur logique.

0
Elliott Jarnutowski

Essayez simplement de quitter Safari et de le relancer. L'invite reviendra.

0
lsmpascal