IOS 13 AppleがAPIを導入 DeviceOrientationEvent.requestPermission 。ユーザーアクション(クリック、タップ、または同等のもの)でトリガーする必要があります。ここでの問題は結果ですキャッシュされているように見えるので、ユーザーが許可を拒否した場合、アクセスを再度要求することはできません(Promiseはキャッシュされた値で自動的に実行されます)。キャッシュされた値をデバイスに強制的に忘れさせ、ユーザーに再度要求する方法はありますか?方向データへのアクセス許可(つまり、ユーザーがアクセスを許可または拒否できるポップアップウィンドウを再度表示する必要があることを意味します)?
これは関連するコードです:
if (DeviceOrientationEvent && typeof(DeviceOrientationEvent.requestPermission) === "function") {
const permissionState = await DeviceOrientationEvent.requestPermission();
if (permissionState === "granted") {
// Permission granted
} else {
// Permission denied
}
}
IOS 13 Safariでも同じ動作が見られます。許可が必要な特定のサイトのWebサイトデータを削除する必要があります。 [設定]> [Safari]> [詳細]> [ウェブサイトデータ]に移動し、サイトを検索してすべてのデータを削除します。その後、許可を求めると、プロンプトが再び表示されます。
キャッシングの問題ですか? iOS 13でシークレットモードのSafariに「許可された」権限で応答することができません。 「拒否されました」という応答がすぐに表示される-プロンプトなし。
次のコードを使用して結果をテストしていますが、Promptイベントが表示されずに常にすぐに「拒否」されます。 ( 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;
}
Drawmote.appはこのように機能しているようですが、JSがコンパイルされているため、ロジックをリバースエンジニアリングするのに時間がかかります。
単にSafariを終了して、もう一度起動してみてください。プロンプトが戻ってきます。