iOS Permissions: - Add missing Info.plist keys for location and Bluetooth usage descriptions - Configure Podfile to enable PERMISSION_LOCATION and PERMISSION_BLUETOOTH - Fix beacon_permissions.dart to use correct iOS permission (Permission.bluetooth) instead of Android-only bluetoothScan/bluetoothConnect The permission_handler plugin requires platform-specific handling: - iOS: Uses Permission.bluetooth for Bluetooth access - Android: Uses Permission.bluetoothScan and Permission.bluetoothConnect 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
61 lines
2.2 KiB
Dart
61 lines
2.2 KiB
Dart
import 'dart:io';
|
|
import 'package:flutter/foundation.dart';
|
|
import 'package:permission_handler/permission_handler.dart';
|
|
|
|
class BeaconPermissions {
|
|
static Future<bool> requestPermissions() async {
|
|
try {
|
|
// Request location permission (required for Bluetooth scanning)
|
|
final locationStatus = await Permission.locationWhenInUse.request();
|
|
debugPrint('[BeaconPermissions] Location: $locationStatus');
|
|
|
|
bool bluetoothGranted = true;
|
|
|
|
if (Platform.isIOS) {
|
|
// iOS uses a single Bluetooth permission
|
|
final bluetoothStatus = await Permission.bluetooth.request();
|
|
debugPrint('[BeaconPermissions] Bluetooth (iOS): $bluetoothStatus');
|
|
bluetoothGranted = bluetoothStatus.isGranted;
|
|
} else {
|
|
// Android 12+ requires separate scan/connect permissions
|
|
final bluetoothScan = await Permission.bluetoothScan.request();
|
|
final bluetoothConnect = await Permission.bluetoothConnect.request();
|
|
debugPrint('[BeaconPermissions] BluetoothScan: $bluetoothScan, BluetoothConnect: $bluetoothConnect');
|
|
bluetoothGranted = bluetoothScan.isGranted && bluetoothConnect.isGranted;
|
|
}
|
|
|
|
final allGranted = locationStatus.isGranted && bluetoothGranted;
|
|
|
|
if (allGranted) {
|
|
debugPrint('[BeaconPermissions] ✅ All permissions granted');
|
|
} else {
|
|
debugPrint('[BeaconPermissions] ❌ Permissions denied');
|
|
}
|
|
|
|
return allGranted;
|
|
} catch (e) {
|
|
debugPrint('[BeaconPermissions] Error requesting permissions: $e');
|
|
return false;
|
|
}
|
|
}
|
|
|
|
static Future<bool> checkPermissions() async {
|
|
final locationStatus = await Permission.locationWhenInUse.status;
|
|
|
|
bool bluetoothGranted = true;
|
|
if (Platform.isIOS) {
|
|
final bluetoothStatus = await Permission.bluetooth.status;
|
|
bluetoothGranted = bluetoothStatus.isGranted;
|
|
} else {
|
|
final bluetoothScan = await Permission.bluetoothScan.status;
|
|
final bluetoothConnect = await Permission.bluetoothConnect.status;
|
|
bluetoothGranted = bluetoothScan.isGranted && bluetoothConnect.isGranted;
|
|
}
|
|
|
|
return locationStatus.isGranted && bluetoothGranted;
|
|
}
|
|
|
|
static Future<void> openSettings() async {
|
|
await openAppSettings();
|
|
}
|
|
}
|