Levix

Levix's zone

x
telegram

iOS 12.1 +版本 DeviceMotionEvent 和 DeviceOrientationEvent 事件使用問題

在 iOS 12.1 以上版本,已無法正常在瀏覽器或者 webview 中正常使用這兩個事件,以前可以直接對 deviceorientation 進行監聽,然後愉快地去獲取設備的傾斜值,從而應用到實際的項目中,比如可以利用擴展設計器編寫移動端擴展,從而可以在慧編程移動端上編寫適合的小游戏,類似於重力感應可以實現很多有趣的東西。

而在 12.1 版本,官方默認將 Motion & Orientation settings 設置為禁用狀態,可以打開 iPad 或者 iPhone 12.1 + 設備進入 settings - Safari - PRIVACY & SECURITY 中查看 Motion & Orientation Access 是否設置為可用,而在 13 版本中,官方已經將該入口隱藏,反正就是找不到了,一頓爆改。

IMG_0331

但其實不用擔心,iOS 12.1 + 版本提供 DeviceMotionEvent.requestPermission()|DeviceOrientationEvent.requestPermission() 用於獲取動作和方向權限,這樣一調用會彈出系統框,用於獲取該權限,當用戶點了允許後,採取監聽 deviceorientation|devicemotion 方法,這樣問題就解決了,也可以引導用戶去點擊上圖的設置,設置為可用狀態即可,但是只針對 13 以下的版本,13 版本已經找不到該入口。

Untitled

實際的處理代碼,可以參考下面示例。

		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 瀏覽器差不多,只能彈一次,後續只能用戶自己去設置裡進行授權。

Untitled 1

由於 iOS 12.1 + 版本對動作和方向事件的使用變得很嚴格,所以想在 webview 中正常使用該功能,其實就變得很麻煩,首先你通過 getDeviceOrientationEventPermission 想去打開授權窗口,肯定是打不開的,所以如果想在 webview 中使用類似於動作或者方向的事件,不僅要 web 端去獲取權限,而且原生端也要提供對應的支持,iOS 13 版本已經添加了 DeviceMotionEventDeviceOrientation 接口。

綜上所述,如果用戶想在擴展設計器編寫移動端擴展,想用到動作和方向事件,實際上是沒法做到全設備支持的,所以需要做好實際區分,用戶在使用擴展的時候,若用戶實際版本是 12.1 + ,需要告知用戶無法正常使用該功能。

參考鏈接

Safari 12.1 Release Notes

Safari 13 Release Notes

iOS13 にて javascript の devicemotion を取得する

Get device motion and orientation back on iOS 13

解決 ios13 中 safari 等瀏覽器無法啟動陀螺儀 / 重力問題

DeviceMotion and DeviceOrientation in WKWebView iOS 13

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。