在 iOS 12.1 以上版本,已無法正常在瀏覽器或者 webview 中正常使用這兩個事件,以前可以直接對 deviceorientation
進行監聽,然後愉快地去獲取設備的傾斜值,從而應用到實際的項目中,比如可以利用擴展設計器編寫移動端擴展,從而可以在慧編程移動端上編寫適合的小游戏,類似於重力感應可以實現很多有趣的東西。
而在 12.1 版本,官方默認將 Motion & Orientation settings
設置為禁用狀態,可以打開 iPad 或者 iPhone 12.1 + 設備進入 settings - Safari - PRIVACY & SECURITY
中查看 Motion & Orientation Access
是否設置為可用,而在 13 版本中,官方已經將該入口隱藏,反正就是找不到了,一頓爆改。
但其實不用擔心,iOS 12.1 + 版本提供 DeviceMotionEvent.requestPermission()|DeviceOrientationEvent.requestPermission()
用於獲取動作和方向權限,這樣一調用會彈出系統框,用於獲取該權限,當用戶點了允許後,採取監聽 deviceorientation|devicemotion
方法,這樣問題就解決了,也可以引導用戶去點擊上圖的設置,設置為可用狀態即可,但是只針對 13 以下的版本,13 版本已經找不到該入口。
實際的處理代碼,可以參考下面示例。
const getDeviceOrientationEventPermission = function () {
if (DeviceOrientationEvent
&& DeviceOrientationEvent.requestPermission
&& typeof DeviceOrientationEvent.requestPermission === 'function'
) {
DeviceMotionEvent.requestPermission().then(permissionState => {
if(permissionState === "granted") {
window.addEventListener("devicemotion", function (e) {}, false);
} else if(permissionState === "denied") {
console.warn("用戶拒絕授權。");
}
});
}
if (DeviceOrientationEvent
&& DeviceOrientationEvent.requestPermission
&& typeof DeviceOrientationEvent.requestPermission === 'function'
) {
DeviceOrientationEvent.requestPermission().then(permissionState => {
if(permissionState === "granted") {
window.addEventListener("deviceorientation", function (e) {}, false);
} else if(permissionState === "denied") {
console.warn("用戶拒絕授權。");
}
});
}
}
而且需要注意的是,需要的進行授權的網站必須要有合格的 https 證書,否則在觸發的時候,會拋出 Call to requestPermission() failed, reason: Browsing context is not secure.
錯誤,可以直接調試 iPad 端 Safari 打開的網站,直接輸入 DeviceOrientationEvent.requestPermission()
即可知道是否允許授權,但實際應用中還是需要用戶主動去觸發獲取權限,否則會拋出 Unhandled Promise Rejection: NotAllowedError: Requesting device orientation or motion access requires a user gesture to prompt
錯誤,可以直接打開 [baidu.com](http://baidu.com)
模擬一下,例如 document.getElementById('s_logo').onclick = getDeviceOrientationEventPermission
,這樣只要點擊以外的區域就可以正常彈出授權框。如果用戶點了取消授權,會發現無論如何觸發,授權窗口將不會再次喚起,只會輸出 用戶拒絕授權。
這一點跟 chrome 瀏覽器差不多,只能彈一次,後續只能用戶自己去設置裡進行授權。
由於 iOS 12.1 + 版本對動作和方向事件的使用變得很嚴格,所以想在 webview 中正常使用該功能,其實就變得很麻煩,首先你通過 getDeviceOrientationEventPermission
想去打開授權窗口,肯定是打不開的,所以如果想在 webview 中使用類似於動作或者方向的事件,不僅要 web 端去獲取權限,而且原生端也要提供對應的支持,iOS 13 版本已經添加了 DeviceMotionEvent 和 DeviceOrientation 接口。
綜上所述,如果用戶想在擴展設計器編寫移動端擴展,想用到動作和方向事件,實際上是沒法做到全設備支持的,所以需要做好實際區分,用戶在使用擴展的時候,若用戶實際版本是 12.1 + ,需要告知用戶無法正常使用該功能。
參考鏈接
iOS13 にて javascript の devicemotion を取得する
Get device motion and orientation back on iOS 13