nativeprems 0.1.0
nativeprems: ^0.1.0 copied to clipboard
A Flutter permissions plugin with native iOS Swift Package Manager support.
nativeprems #
nativeprems is a Flutter permissions plugin with native iOS Swift Package
Manager support.
Use it when your Flutter app needs to check permission status, request runtime permissions, inspect service availability, or open the platform app settings screen from Dart.
Preview #
| Camera permission | Nearby devices permission |
|---|---|
![]() |
![]() |
| Calendar permission | Microphone permission |
![]() |
![]() |
| Demo permission list | |
![]() |
Features #
- Simple Dart API for checking, requesting, and handling permissions.
- Single public import:
package:nativeprems/nativeprems.dart. - Check one permission or request multiple permissions at once.
- Service status checks for permissions backed by a device service, such as location, bluetooth, and phone.
openAppSettings()helper for guiding users after a permanent denial.- Flutter plugin support for Android, iOS, web, and Windows.
- Native iOS implementation is available through Swift Package Manager.
Installation #
Add the package to your Flutter app:
dependencies:
nativeprems: ^0.1.0
Then import it:
import 'package:nativeprems/nativeprems.dart';
Swift Package Manager availability #
The iOS implementation is packaged as an SPM package in:
ios/nativeprems/Package.swift
The package exposes a nativeprems library target and requires iOS 12.0 or
newer. Flutter users normally do not need to add this package manually; Flutter
registers the plugin from your pubspec.yaml dependency.
SPM support is useful when you need native iOS tooling to resolve the plugin source cleanly, or when your iOS build flow prefers Swift Package Manager over manually managed native source.
Platform setup #
Declare only the permissions your app actually requests.
Android #
Add the matching permissions to your app manifest:
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
</manifest>
Some Android permissions are version-specific. For example, media permissions changed on Android 13, and notification permission is runtime-gated on Android 13 and newer.
iOS #
Add the required usage descriptions to your app Info.plist:
<key>NSCameraUsageDescription</key>
<string>We need camera access so you can take a profile photo.</string>
<key>NSMicrophoneUsageDescription</key>
<string>We need microphone access for voice messages.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>We use your location to show nearby stores.</string>
iOS will terminate the app if you request a protected permission without the matching usage description.
Usage #
Check a permission #
final PermissionStatus status = await Permission.camera.status;
if (status.isGranted) {
// Continue with camera-only work.
}
Request a permission #
Future<void> requestCamera() async {
final PermissionStatus status = await Permission.camera.request();
if (status.isGranted) {
// The user granted access.
return;
}
if (status.isPermanentlyDenied) {
await openAppSettings();
}
}
Request multiple permissions #
final Map<Permission, PermissionStatus> statuses = await <Permission>[
Permission.camera,
Permission.microphone,
Permission.locationWhenInUse,
].request();
final bool readyForVideo = statuses[Permission.camera]?.isGranted == true &&
statuses[Permission.microphone]?.isGranted == true;
Check service status #
Some permissions also expose device service status. A simple example is location: permission can be granted, but location services can still be turned off at the system level.
final PermissionStatus permission = await Permission.location.status;
final ServiceStatus service = await Permission.location.serviceStatus;
if (permission.isGranted && service.isEnabled) {
// Location permission is granted and the device service is enabled.
}
Show Android request rationale #
final bool shouldExplain =
await Permission.camera.shouldShowRequestRationale;
if (shouldExplain) {
// Show a small explanation in your UI before requesting again.
}
On iOS, web, and Windows this returns false.
Open app settings #
final bool opened = await openAppSettings();
Use this after a permission is permanently denied and the user must change the permission from system settings.
Supported permissions #
The public API exposes Permission constants including camera, contacts,
location, locationAlways, locationWhenInUse, mediaLibrary, microphone, phone,
photos, photosAddOnly, notification, bluetooth, bluetoothScan,
bluetoothAdvertise, bluetoothConnect, nearbyWifiDevices, videos, audio,
scheduleExactAlarm, calendarWriteOnly, calendarFullAccess, assistant, and
backgroundRefresh.
Platform behavior can differ because Android, iOS, web, and Windows expose different permission models. Always test the permissions you use on the platform versions your app supports.
Migration note #
The package name and public import path are nativeprems.
If you are migrating from an older local package name, update to:
dependencies:
nativeprems: ^0.1.0
import 'package:nativeprems/nativeprems.dart';
The native method channel is also named dev.effdel.nativeprems/methods.
Rebuild the app and embedded plugin artifacts together after upgrading. Do not
mix old Dart artifacts with new native binaries, or old native binaries with
new Dart artifacts.




