Skip to content

Permissions

In Android permissions are declared in the Manifest, read more in → uses-permission section.

When all permissions are declared you can request them at runtime.

Activity has built-in support for requesting permissions:

Async/Await

The most Swiftly way to request permissions is using async/await:

let results = await self.requestPermissions(.camera, .bluetooth)
for result in results {
    print("\(result.permission): \(result.granted)")
}

Closure Callback

If async/await is not an option you can use closure callback:

self.requestPermissions(.camera, .bluetooth) { results in
    for result in results {
        print("\(result.permission): \(result.granted)")
    }
}

Random requestCode is generated internally to identify the request, but you can also provide your own.

Classic Experience

This way is exactly like in native Android development: you check permission, request it, and handle the result in onRequestPermissionsResult method.

final class MyActivity: AppCompatActivity {
    override var body: any Body {
        Button("Request Camera")
            .onClick { [weak self] in
                guard let self else { return }
                if self.checkPermission(.camera) {
                    print("Permission already granted")
                } else {
                    self.requestPermissions(.camera, requestCode: 123)
                }
            }
    }

    override func onRequestPermissionsResult(
        requestCode: Int,
        results: [ActivityPermissionResult],
        deviceId: Int
    ) {
        super.onRequestPermissionsResult(
            requestCode: requestCode,
            results: results,
            deviceId: deviceId
        )
        Log.d("""onRequestPermissionsResult 
            requestCode: \(requestCode)
            deviceId: \(deviceId)
            results.count: \(results.count)
        """)
        for result in results {
            Log.i("Permission for \(result.permission): \(result.granted)")
        }
    }
}

When checkPermission called it also checks if the permission is declared in the Manifest. If not, a warning is logged.

⚠️ You forgot to add `.usesPermissions(.camera)` to your `DroidApp` manifest!

Read more how to fix it in → uses-permission section.