Skip to content

Commit 561d323

Browse files
committed
Phase 1: Restructure iOS plugin directory for SPM compatibility
- Created SPM-compliant directory structure (Sources/permission_handler_apple/) - Copied source files to new SPM location (keeping originals for compatibility) - Updated podspec to reference new file locations - Maintained backward compatibility with existing CocoaPods setup
1 parent d842345 commit 561d323

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+2290
-3
lines changed
Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
//
2+
// PermissionHandlerEnums.h
3+
// permission_handler
4+
//
5+
// Created by Razvan Lung on 15/02/2019.
6+
//
7+
8+
// ios: [PermissionGroupCalendar, PermissionGroupCalendarWriteOnly]
9+
// Info.plist: [NSCalendarsUsageDescription, NSCalendarWriteOnlyAccessUsageDescription]
10+
// dart: PermissionGroup.calendar
11+
#ifndef PERMISSION_EVENTS
12+
#define PERMISSION_EVENTS 0
13+
#endif
14+
15+
// ios: PermissionGroupReminders
16+
// Info.plist: NSRemindersFullAccessUsageDescription
17+
// dart: PermissionGroup.reminders
18+
#ifndef PERMISSION_REMINDERS
19+
#define PERMISSION_REMINDERS 0
20+
#endif
21+
22+
// ios: PermissionGroupContacts
23+
// Info.plist: NSContactsUsageDescription
24+
// dart: PermissionGroup.contacts
25+
#ifndef PERMISSION_CONTACTS
26+
#define PERMISSION_CONTACTS 0
27+
#endif
28+
29+
// ios: PermissionGroupCamera
30+
// Info.plist: NSCameraUsageDescription
31+
// dart: PermissionGroup.camera
32+
#ifndef PERMISSION_CAMERA
33+
#define PERMISSION_CAMERA 0
34+
#endif
35+
36+
// ios: PermissionGroupMicrophone
37+
// Info.plist: NSMicrophoneUsageDescription
38+
// dart: PermissionGroup.microphone
39+
#ifndef PERMISSION_MICROPHONE
40+
#define PERMISSION_MICROPHONE 0
41+
#endif
42+
43+
// ios: PermissionGroupSpeech
44+
// Info.plist: NSSpeechRecognitionUsageDescription
45+
// dart: PermissionGroup.speech
46+
#ifndef PERMISSION_SPEECH_RECOGNIZER
47+
#define PERMISSION_SPEECH_RECOGNIZER 0
48+
#endif
49+
50+
// ios: PermissionGroupPhotos
51+
// Info.plist: NSPhotoLibraryUsageDescription
52+
// dart: PermissionGroup.photos
53+
#ifndef PERMISSION_PHOTOS
54+
#define PERMISSION_PHOTOS 0
55+
#endif
56+
57+
// ios: PermissionGroupPhotosAddOnly
58+
// Info.plist: NSPhotoLibraryAddUsageDescription
59+
// dart: PermissionGroup.photosAddOnly
60+
#ifndef PERMISSION_PHOTOS_ADD_ONLY
61+
#define PERMISSION_PHOTOS_ADD_ONLY 0
62+
#endif
63+
64+
// ios: [PermissionGroupLocation, PermissionGroupLocationAlways, PermissionGroupLocationWhenInUse]
65+
// Info.plist: [NSLocationUsageDescription, NSLocationAlwaysAndWhenInUseUsageDescription, NSLocationWhenInUseUsageDescription]
66+
// dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse]
67+
#ifndef PERMISSION_LOCATION
68+
#define PERMISSION_LOCATION 0
69+
#endif
70+
71+
// ios: PermissionGroupNotification
72+
// dart: PermissionGroup.notification
73+
#ifndef PERMISSION_NOTIFICATIONS
74+
#define PERMISSION_NOTIFICATIONS 0
75+
#endif
76+
77+
// ios: PermissionGroupMediaLibrary
78+
// Info.plist: [NSAppleMusicUsageDescription, kTCCServiceMediaLibrary]
79+
// dart: PermissionGroup.mediaLibrary
80+
#ifndef PERMISSION_MEDIA_LIBRARY
81+
#define PERMISSION_MEDIA_LIBRARY 0
82+
#endif
83+
84+
// ios: PermissionGroupSensors
85+
// Info.plist: NSMotionUsageDescription
86+
// dart: PermissionGroup.sensors
87+
#ifndef PERMISSION_SENSORS
88+
#define PERMISSION_SENSORS 0
89+
#endif
90+
91+
// ios: PermissionGroupBluetooth
92+
// Info.plist: [NSBluetoothAlwaysUsageDescription, NSBluetoothPeripheralUsageDescription]
93+
// dart: PermissionGroup.bluetooth
94+
#ifndef PERMISSION_BLUETOOTH
95+
#define PERMISSION_BLUETOOTH 0
96+
#endif
97+
98+
// ios: PermissionGroupAppTrackingTransparency
99+
// Info.plist: [NSUserTrackingUsageDescription]
100+
// dart: PermissionGroup.appTrackingTransparency
101+
#ifndef PERMISSION_APP_TRACKING_TRANSPARENCY
102+
#define PERMISSION_APP_TRACKING_TRANSPARENCY 0
103+
#endif
104+
105+
// ios: PermissionGroupCriticalAlerts
106+
// Info.plist: UNAuthorizationOptionCriticalAlert
107+
// dart: PermissionGroup.criticalAlerts
108+
#ifndef PERMISSION_CRITICAL_ALERTS
109+
#define PERMISSION_CRITICAL_ALERTS 0
110+
#endif
111+
112+
// ios: PermissionGroupAssistant
113+
// Info.plist: [NSSiriUsageDescription]
114+
// dart: PermissionGroup.assistant
115+
#ifndef PERMISSION_ASSISTANT
116+
#define PERMISSION_ASSISTANT 0
117+
#endif
118+
119+
// ios: PermissionGroupCalendarFullAccess
120+
// Info.plist: [NSCalendarsFullAccessUsageDescription]
121+
// dart: PermissionGroup.calendarFullAccess
122+
#ifndef PERMISSION_EVENTS_FULL_ACCESS
123+
#define PERMISSION_EVENTS_FULL_ACCESS 0
124+
#endif
125+
126+
typedef NS_ENUM(int, PermissionGroup) {
127+
PermissionGroupCalendar = 0,
128+
PermissionGroupCamera,
129+
PermissionGroupContacts,
130+
PermissionGroupLocation,
131+
PermissionGroupLocationAlways,
132+
PermissionGroupLocationWhenInUse,
133+
PermissionGroupMediaLibrary,
134+
PermissionGroupMicrophone,
135+
PermissionGroupPhone,
136+
PermissionGroupPhotos,
137+
PermissionGroupPhotosAddOnly,
138+
PermissionGroupReminders,
139+
PermissionGroupSensors,
140+
PermissionGroupSms,
141+
PermissionGroupSpeech,
142+
PermissionGroupStorage,
143+
PermissionGroupIgnoreBatteryOptimizations,
144+
PermissionGroupNotification,
145+
PermissionGroupAccessMediaLocation,
146+
PermissionGroupActivityRecognition,
147+
PermissionGroupUnknown,
148+
PermissionGroupBluetooth,
149+
PermissionGroupManageExternalStorage,
150+
PermissionGroupSystemAlertWindow,
151+
PermissionGroupRequestInstallPackages,
152+
PermissionGroupAppTrackingTransparency,
153+
PermissionGroupCriticalAlerts,
154+
PermissionGroupAccessNotificationPolicy,
155+
PermissionGroupBluetoothScan,
156+
PermissionGroupBluetoothAdvertise,
157+
PermissionGroupBluetoothConnect,
158+
PermissionGroupNearbyWifiDevices,
159+
PermissiongroupVideos,
160+
PermissionGroupAudio,
161+
PermissionGroupScheduleExactAlarm,
162+
PermissionGroupSensorsAlways,
163+
PermissionGroupCalendarWriteOnly,
164+
PermissionGroupCalendarFullAccess,
165+
PermissionGroupAssistant,
166+
PermissionGroupBackgroundRefresh
167+
};
168+
169+
typedef NS_ENUM(int, PermissionStatus) {
170+
PermissionStatusDenied = 0,
171+
PermissionStatusGranted = 1,
172+
PermissionStatusRestricted = 2,
173+
PermissionStatusLimited = 3,
174+
PermissionStatusPermanentlyDenied = 4,
175+
PermissionStatusProvisional = 5,
176+
};
177+
178+
typedef NS_ENUM(int, ServiceStatus) {
179+
ServiceStatusDisabled = 0,
180+
ServiceStatusEnabled,
181+
ServiceStatusNotApplicable,
182+
};
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#import <Flutter/Flutter.h>
2+
#import "PermissionManager.h"
3+
4+
@interface PermissionHandlerPlugin : NSObject<FlutterPlugin>
5+
- (instancetype)initWithPermissionManager:(PermissionManager *)permissionManager;
6+
@end
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
#import "PermissionHandlerPlugin.h"
2+
3+
4+
@implementation PermissionHandlerPlugin {
5+
PermissionManager *_Nonnull _permissionManager;
6+
_Nullable FlutterResult _methodResult;
7+
}
8+
9+
- (instancetype)initWithPermissionManager:(PermissionManager *)permissionManager {
10+
self = [super init];
11+
if (self) {
12+
_permissionManager = permissionManager;
13+
}
14+
15+
return self;
16+
}
17+
18+
+ (void)registerWithRegistrar:(NSObject <FlutterPluginRegistrar> *)registrar {
19+
FlutterMethodChannel *channel = [FlutterMethodChannel
20+
methodChannelWithName:@"flutter.baseflow.com/permissions/methods"
21+
binaryMessenger:[registrar messenger]];
22+
PermissionManager *permissionManager = [[PermissionManager alloc] initWithStrategyInstances];
23+
PermissionHandlerPlugin *instance = [[PermissionHandlerPlugin alloc] initWithPermissionManager:permissionManager];
24+
[registrar addMethodCallDelegate:instance channel:channel];
25+
}
26+
27+
- (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result {
28+
if ([@"checkPermissionStatus" isEqualToString:call.method]) {
29+
PermissionGroup permission = [Codec decodePermissionGroupFrom:call.arguments];
30+
[PermissionManager checkPermissionStatus:permission result:result];
31+
} else if ([@"checkServiceStatus" isEqualToString:call.method]) {
32+
PermissionGroup permission = [Codec decodePermissionGroupFrom:call.arguments];
33+
[PermissionManager checkServiceStatus:permission result:result];
34+
} else if ([@"requestPermissions" isEqualToString:call.method]) {
35+
if (_methodResult != nil) {
36+
result([FlutterError errorWithCode:@"ERROR_ALREADY_REQUESTING_PERMISSIONS" message:@"A request for permissions is already running, please wait for it to finish before doing another request (note that you can request multiple permissions at the same time)." details:nil]);
37+
return;
38+
}
39+
40+
_methodResult = result;
41+
NSArray *permissions = [Codec decodePermissionGroupsFrom:call.arguments];
42+
43+
[_permissionManager
44+
requestPermissions:permissions completion:^(NSDictionary *permissionRequestResults) {
45+
if (self->_methodResult != nil) {
46+
self->_methodResult(permissionRequestResults);
47+
}
48+
49+
self->_methodResult = nil;
50+
} errorHandler:^(NSString *errorCode, NSString *errorDescription) {
51+
self->_methodResult([FlutterError errorWithCode:errorCode message:errorDescription details:nil]);
52+
self->_methodResult = nil;
53+
}
54+
];
55+
56+
} else if ([@"shouldShowRequestPermissionRationale" isEqualToString:call.method]) {
57+
result(@false);
58+
} else if ([@"openAppSettings" isEqualToString:call.method]) {
59+
[PermissionManager openAppSettings:result];
60+
} else {
61+
result(FlutterMethodNotImplemented);
62+
}
63+
}
64+
65+
@end
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
//
2+
// PermissionManager.h
3+
// permission_handler
4+
//
5+
// Created by Razvan Lung on 15/02/2019.
6+
//
7+
8+
#import <Flutter/Flutter.h>
9+
#import <Foundation/Foundation.h>
10+
#import <UIKit/UIKit.h>
11+
12+
#import "AudioVideoPermissionStrategy.h"
13+
#import "AppTrackingTransparencyPermissionStrategy.h"
14+
#import "BackgroundRefreshStrategy.h"
15+
#import "BluetoothPermissionStrategy.h"
16+
#import "ContactPermissionStrategy.h"
17+
#import "EventPermissionStrategy.h"
18+
#import "LocationPermissionStrategy.h"
19+
#import "MediaLibraryPermissionStrategy.h"
20+
#import "PermissionStrategy.h"
21+
#import "PhonePermissionStrategy.h"
22+
#import "PhotoPermissionStrategy.h"
23+
#import "SensorPermissionStrategy.h"
24+
#import "SpeechPermissionStrategy.h"
25+
#import "StoragePermissionStrategy.h"
26+
#import "UnknownPermissionStrategy.h"
27+
#import "NotificationPermissionStrategy.h"
28+
#import "CriticalAlertsPermissionStrategy.h"
29+
#import "AssistantPermissionStrategy.h"
30+
#import "PermissionHandlerEnums.h"
31+
#import "Codec.h"
32+
33+
typedef void (^PermissionRequestCompletion)(NSDictionary *permissionRequestResults);
34+
35+
@interface PermissionManager : NSObject
36+
37+
- (instancetype)initWithStrategyInstances;
38+
- (void)requestPermissions:(NSArray *)permissions completion:(PermissionRequestCompletion)completion errorHandler:(PermissionErrorHandler)errorHandler;
39+
40+
+ (void)checkPermissionStatus:(enum PermissionGroup)permission result:(FlutterResult)result;
41+
+ (void)checkServiceStatus:(enum PermissionGroup)permission result:(FlutterResult)result;
42+
+ (void)openAppSettings:(FlutterResult)result;
43+
44+
@end

0 commit comments

Comments
 (0)