payfrit-app/lib/services/beacon_permissions.dart
John Mizerek ef5609ba57 Fix iOS beacon permissions for location and Bluetooth
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>
2026-01-08 15:05:11 -08:00

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();
}
}