Skip to content

Capacitor Motion docs: requestPermission only works on Safari #1480

@kalnode

Description

@kalnode

Bug Report

1. The doc page for Capacitor Motion provides a recommended snippet, however it doesn't work on Chrome (or other non-Safari browsers) because technically only Safari iOS supports requestPermission. The logic needs to be different, see below for a different approach.

2. Secondly, these lines gave me trouble; I presume because I don't use Typescript? It's not mentioned in the doc page one way or another. I understand TS popularity, but... is it good to assume everyone knows it? I've just excluded the lines completely.

import { PluginListenerHandle } from '@capacitor/core';
let accelHandler: PluginListenerHandle;

In any case, this plugin is working better than my old custom sensor code. The advantage the plugin delivers is agnostic standard values (am I right?). Previously I had run different math based on output I was getting (depending on browser).

Working implementation:
I see other threads where people have trouble with sensors. Below is my working implementation of Capacitor Motion (web output works; haven't tested native mobile builds yet). Works on Safari (iPhone), Chrome (Android, Ubuntu), Firefox (Android, Ubuntu).

(Vue component)

import { Motion } from '@capacitor/motion'

export default {
    data() {
        return {
            myOrientationHandler: null,
            myAccelerationHandler: null,
        }
    },

    mounted() {
        this.setupMotionListeners()
    }

    methods: {
        async setupMotionListeners() {

            // Check existence of requestPermission; if so, use it
            if (typeof DeviceOrientationEvent.requestPermission === 'function') {

                 // Technically there's DeviceOrientationEvent and DeviceMotionEvent, however I believe it would always be one permission controlling both?

                // This opens a permission prompt to the user
                await DeviceOrientationEvent.requestPermission()
                .catch( (error) => {
                    console.log("Error requestPermission: ", error)
                    return // Exit logic if user denies permission or other error
                })
            }

            // SET LISTENERS
            // Safari iOS (or any other browser that uses requestPermission): At this point, permission is approved
            // Other browsers: Presumably they'll automatically prompt the user for permission if required (?)

            // ORIENTATION
            this.myOrientationHandler = await Motion.addListener('orientation', event => {
                console.log('Device orientation event: ', event)
                // Syncs a 3d object to the device tilt
                if (!this.myCube.spinning) {
                    const x = event.beta / 180 ?? 0
                    const y = event.gamma / 90 ?? 0
                    this.my3dCube.orientation = [x, y]
                }
            })

            // SHAKE
            this.myAccelerationHandler = await Motion.addListener('accel', event => {
                console.log('Device acceleration event: ', event)
                // Spins a 3d object when user shakes their device
                // These are velocity readings, so we just observe if velocity on any axis ever goes above a threshold (e.g. 256)
                if ((event.rotationRate.alpha > 256 || event.rotationRate.beta > 256 || event.rotationRate.gamma > 256)) {
                    this.spinTheCube()
                }
            })
        }

    }
}

Plugin(s)

Capacitor Motion 4.0.2

Capacitor Version

Latest Dependencies:

@capacitor/cli: 4.7.0
@capacitor/core: 4.7.0
@capacitor/android: 4.7.0
@capacitor/ios: 4.7.0

Installed Dependencies:

@capacitor/cli: 4.7.0
@capacitor/core: 4.7.0
@capacitor/android: 4.7.0
@capacitor/ios: 4.7.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions