From e0d108de6aee7054aa34f3040fd514186b58c356 Mon Sep 17 00:00:00 2001 From: ty0x2333 Date: Thu, 26 Dec 2019 12:23:45 +0800 Subject: [PATCH 1/5] Add macro definition in iOS code to remove useless permissions. --- ios/Classes/PermissionHandlerEnums.h | 76 +++++++++++++++++++ ios/Classes/PermissionManager.m | 4 + .../strategies/AudioVideoPermissionStrategy.h | 13 +++- .../strategies/AudioVideoPermissionStrategy.m | 28 ++++++- .../strategies/ContactPermissionStrategy.h | 16 +++- .../strategies/ContactPermissionStrategy.m | 8 ++ .../strategies/EventPermissionStrategy.h | 14 +++- .../strategies/EventPermissionStrategy.m | 26 +++++++ .../strategies/LocationPermissionStrategy.h | 12 ++- .../strategies/LocationPermissionStrategy.m | 8 ++ .../MediaLibraryPermissionStrategy.h | 12 ++- .../MediaLibraryPermissionStrategy.m | 8 ++ .../NotificationPermissionStrategy.h | 13 +++- .../NotificationPermissionStrategy.m | 9 +++ .../strategies/PhotoPermissionStrategy.h | 14 +++- .../strategies/PhotoPermissionStrategy.m | 10 ++- .../strategies/SensorPermissionStrategy.h | 14 +++- .../strategies/SensorPermissionStrategy.m | 8 ++ .../strategies/SpeechPermissionStrategy.h | 13 +++- .../strategies/SpeechPermissionStrategy.m | 8 ++ 20 files changed, 297 insertions(+), 17 deletions(-) diff --git a/ios/Classes/PermissionHandlerEnums.h b/ios/Classes/PermissionHandlerEnums.h index c8ef91f27..24e07de7c 100644 --- a/ios/Classes/PermissionHandlerEnums.h +++ b/ios/Classes/PermissionHandlerEnums.h @@ -5,6 +5,82 @@ // Created by Razvan Lung on 15/02/2019. // +// ios: PermissionGroupCalendar +// Info.plist: NSCalendarsUsageDescription +// dart: PermissionGroup.calendar +#ifndef PERMISSION_EVENTS + #define PERMISSION_EVENTS 1 +#endif + +// ios: PermissionGroupReminders +// Info.plist: NSRemindersUsageDescription +// dart: PermissionGroup.reminders +#ifndef PERMISSION_REMINDERS + #define PERMISSION_REMINDERS 1 +#endif + +// ios: PermissionGroupContacts +// Info.plist: NSContactsUsageDescription +// dart: PermissionGroup.contacts +#ifndef PERMISSION_CONTACTS + #define PERMISSION_CONTACTS 1 +#endif + +// ios: PermissionGroupCamera +// Info.plist: NSCameraUsageDescription +// dart: PermissionGroup.camera +#ifndef PERMISSION_CAMERA + #define PERMISSION_CAMERA 1 +#endif + +// ios: PermissionGroupMicrophone +// Info.plist: NSMicrophoneUsageDescription +// dart: PermissionGroup.microphone +#ifndef PERMISSION_MICROPHONE + #define PERMISSION_MICROPHONE 1 +#endif + +// ios: PermissionGroupSpeech +// Info.plist: NSSpeechRecognitionUsageDescription +// dart: PermissionGroup.speech +#ifndef PERMISSION_SPEECH_RECOGNIZER + #define PERMISSION_SPEECH_RECOGNIZER 1 +#endif + +// ios: PermissionGroupPhotos +// Info.plist: NSPhotoLibraryUsageDescription +// dart: PermissionGroup.photos +#ifndef PERMISSION_PHOTOS + #define PERMISSION_PHOTOS 1 +#endif + +// ios: [PermissionGroupLocation, PermissionGroupLocationAlways, PermissionGroupLocationWhenInUse] +// Info.plist: [NSLocationUsageDescription, NSLocationAlwaysAndWhenInUseUsageDescription, NSLocationWhenInUseUsageDescription] +// dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse] +#ifndef PERMISSION_LOCATION + #define PERMISSION_LOCATION 1 +#endif + +// ios: PermissionGroupNotification +// dart: PermissionGroup.notification +#ifndef PERMISSION_NOTIFICATIONS + #define PERMISSION_NOTIFICATIONS 1 +#endif + +// ios: PermissionGroupMediaLibrary +// Info.plist: [NSAppleMusicUsageDescription, kTCCServiceMediaLibrary] +// dart: PermissionGroup.mediaLibrary +#ifndef PERMISSION_MEDIA_LIBRARY + #define PERMISSION_MEDIA_LIBRARY 1 +#endif + +// ios: PermissionGroupSensors +// Info.plist: NSMotionUsageDescription +// dart: PermissionGroup.sensors +#ifndef PERMISSION_SENSORS + #define PERMISSION_SENSORS 1 +#endif + typedef NS_ENUM(int, PermissionGroup) { PermissionGroupCalendar = 0, PermissionGroupCamera, diff --git a/ios/Classes/PermissionManager.m b/ios/Classes/PermissionManager.m index 28b90839e..e0007faef 100644 --- a/ios/Classes/PermissionManager.m +++ b/ios/Classes/PermissionManager.m @@ -84,7 +84,11 @@ + (id)createPermissionStrategy:(PermissionGroup)permission { case PermissionGroupLocation: case PermissionGroupLocationAlways: case PermissionGroupLocationWhenInUse: + #if PERMISSION_LOCATION return [[LocationPermissionStrategy alloc] initWithLocationManager]; + #else + return [LocationPermissionStrategy new]; + #endif case PermissionGroupMediaLibrary: return [MediaLibraryPermissionStrategy new]; case PermissionGroupMicrophone: diff --git a/ios/Classes/strategies/AudioVideoPermissionStrategy.h b/ios/Classes/strategies/AudioVideoPermissionStrategy.h index 027849beb..8db77d030 100644 --- a/ios/Classes/strategies/AudioVideoPermissionStrategy.h +++ b/ios/Classes/strategies/AudioVideoPermissionStrategy.h @@ -3,10 +3,19 @@ // Copyright (c) 2019 The Chromium Authors. All rights reserved. // -#import #import #import "PermissionStrategy.h" +#if PERMISSION_CAMERA | PERMISSION_MICROPHONE +#import @interface AudioVideoPermissionStrategy : NSObject -@end \ No newline at end of file +@end + +#else + +#import "UnknownPermissionStrategy.h" +@interface AudioVideoPermissionStrategy : UnknownPermissionStrategy +@end + +#endif diff --git a/ios/Classes/strategies/AudioVideoPermissionStrategy.m b/ios/Classes/strategies/AudioVideoPermissionStrategy.m index 819fd49da..4af74f67b 100644 --- a/ios/Classes/strategies/AudioVideoPermissionStrategy.m +++ b/ios/Classes/strategies/AudioVideoPermissionStrategy.m @@ -5,14 +5,23 @@ #import "AudioVideoPermissionStrategy.h" +#if PERMISSION_CAMERA | PERMISSION_MICROPHONE @implementation AudioVideoPermissionStrategy - (PermissionStatus)checkPermissionStatus:(PermissionGroup)permission { if (permission == PermissionGroupCamera) { + #if PERMISSION_CAMERA return [AudioVideoPermissionStrategy permissionStatus:AVMediaTypeVideo]; + #else + return PermissionStatusUnknown; + #endif } else if (permission == PermissionGroupMicrophone) { + #if PERMISSION_MICROPHONE return [AudioVideoPermissionStrategy permissionStatus:AVMediaTypeAudio]; + #else + return PermissionStatusUnknown; + #endif } return PermissionStatusUnknown; } @@ -32,9 +41,19 @@ - (void)requestPermission:(PermissionGroup)permission completionHandler:(Permiss AVMediaType mediaType; if (permission == PermissionGroupCamera) { + #if PERMISSION_CAMERA mediaType = AVMediaTypeVideo; + #else + completionHandler(PermissionStatusUnknown); + return; + #endif } else if (permission == PermissionGroupMicrophone) { + #if PERMISSION_MICROPHONE mediaType = AVMediaTypeAudio; + #else + completionHandler(PermissionStatusUnknown); + return; + #endif } else { completionHandler(PermissionStatusUnknown); return; @@ -66,4 +85,11 @@ + (PermissionStatus)permissionStatus:(AVMediaType const)mediaType { return PermissionStatusUnknown; } -@end \ No newline at end of file +@end + +#else + +@implementation AudioVideoPermissionStrategy +@end + +#endif diff --git a/ios/Classes/strategies/ContactPermissionStrategy.h b/ios/Classes/strategies/ContactPermissionStrategy.h index 9a446317d..1565d3232 100644 --- a/ios/Classes/strategies/ContactPermissionStrategy.h +++ b/ios/Classes/strategies/ContactPermissionStrategy.h @@ -3,11 +3,21 @@ // Copyright (c) 2019 The Chromium Authors. All rights reserved. // -#import -#import #import #import "PermissionStrategy.h" +#if PERMISSION_CONTACTS + +#import +#import @interface ContactPermissionStrategy : NSObject -@end \ No newline at end of file +@end + +#else + +#import "UnknownPermissionStrategy.h" +@interface ContactPermissionStrategy : UnknownPermissionStrategy +@end + +#endif diff --git a/ios/Classes/strategies/ContactPermissionStrategy.m b/ios/Classes/strategies/ContactPermissionStrategy.m index 340be904a..fdec3d0be 100644 --- a/ios/Classes/strategies/ContactPermissionStrategy.m +++ b/ios/Classes/strategies/ContactPermissionStrategy.m @@ -5,6 +5,7 @@ #import "ContactPermissionStrategy.h" +#if PERMISSION_CONTACTS @implementation ContactPermissionStrategy @@ -94,3 +95,10 @@ + (void)requestPermissionsFromAddressBook:(PermissionStatusHandler)completionHan }); } @end + +#else + +@implementation ContactPermissionStrategy +@end + +#endif diff --git a/ios/Classes/strategies/EventPermissionStrategy.h b/ios/Classes/strategies/EventPermissionStrategy.h index f1a89c53a..b5bddc8b9 100644 --- a/ios/Classes/strategies/EventPermissionStrategy.h +++ b/ios/Classes/strategies/EventPermissionStrategy.h @@ -4,9 +4,19 @@ // #import -#import #import "PermissionStrategy.h" +#if PERMISSION_EVENTS | PERMISSION_REMINDERS + +#import @interface EventPermissionStrategy : NSObject -@end \ No newline at end of file +@end + +#else + +#import "UnknownPermissionStrategy.h" +@interface EventPermissionStrategy : UnknownPermissionStrategy +@end + +#endif diff --git a/ios/Classes/strategies/EventPermissionStrategy.m b/ios/Classes/strategies/EventPermissionStrategy.m index d27e77933..2f1e49402 100644 --- a/ios/Classes/strategies/EventPermissionStrategy.m +++ b/ios/Classes/strategies/EventPermissionStrategy.m @@ -5,14 +5,23 @@ #import "EventPermissionStrategy.h" +#if PERMISSION_EVENTS | PERMISSION_REMINDERS @implementation EventPermissionStrategy - (PermissionStatus)checkPermissionStatus:(PermissionGroup)permission { if (permission == PermissionGroupCalendar) { + #if PERMISSION_EVENTS return [EventPermissionStrategy permissionStatus:EKEntityTypeEvent]; + #else + return PermissionStatusUnknown; + #endif } else if (permission == PermissionGroupReminders) { + #if PERMISSION_REMINDERS return [EventPermissionStrategy permissionStatus:EKEntityTypeReminder]; + #else + return PermissionStatusUnknown; + #endif } return PermissionStatusUnknown; @@ -33,9 +42,19 @@ - (void)requestPermission:(PermissionGroup)permission completionHandler:(Permiss EKEntityType entityType; if (permission == PermissionGroupCalendar) { + #if PERMISSION_EVENTS entityType = EKEntityTypeEvent; + #else + completionHandler(PermissionStatusUnknown); + return; + #endif } else if (permission == PermissionGroupReminders) { + #if PERMISSION_REMINDERS entityType = EKEntityTypeReminder; + #else + completionHandler(PermissionStatusUnknown); + return; + #endif } else { completionHandler(PermissionStatusUnknown); return; @@ -69,3 +88,10 @@ + (PermissionStatus)permissionStatus:(EKEntityType)entityType { } @end + +#else + +@implementation EventPermissionStrategy +@end + +#endif diff --git a/ios/Classes/strategies/LocationPermissionStrategy.h b/ios/Classes/strategies/LocationPermissionStrategy.h index a36b7c623..9ca88c012 100644 --- a/ios/Classes/strategies/LocationPermissionStrategy.h +++ b/ios/Classes/strategies/LocationPermissionStrategy.h @@ -3,11 +3,21 @@ // Copyright (c) 2019 The Chromium Authors. All rights reserved. // -#import #import #import "PermissionStrategy.h" +#if PERMISSION_LOCATION + +#import @interface LocationPermissionStrategy : NSObject - (instancetype)initWithLocationManager; @end + +#else + +#import "UnknownPermissionStrategy.h" +@interface LocationPermissionStrategy : UnknownPermissionStrategy +@end + +#endif diff --git a/ios/Classes/strategies/LocationPermissionStrategy.m b/ios/Classes/strategies/LocationPermissionStrategy.m index 3d389353a..6d79865c7 100644 --- a/ios/Classes/strategies/LocationPermissionStrategy.m +++ b/ios/Classes/strategies/LocationPermissionStrategy.m @@ -5,6 +5,7 @@ #import "LocationPermissionStrategy.h" +#if PERMISSION_LOCATION @implementation LocationPermissionStrategy { CLLocationManager *_locationManager; @@ -154,3 +155,10 @@ + (PermissionStatus)determinePermissionStatus:(PermissionGroup)permission author } @end + +#else + +@implementation LocationPermissionStrategy +@end + +#endif diff --git a/ios/Classes/strategies/MediaLibraryPermissionStrategy.h b/ios/Classes/strategies/MediaLibraryPermissionStrategy.h index 032e8c03e..5bab13c5b 100644 --- a/ios/Classes/strategies/MediaLibraryPermissionStrategy.h +++ b/ios/Classes/strategies/MediaLibraryPermissionStrategy.h @@ -4,9 +4,19 @@ // #import -#import #include "PermissionStrategy.h" +#if PERMISSION_MEDIA_LIBRARY + +#import @interface MediaLibraryPermissionStrategy : NSObject @end + +#else + +#import "UnknownPermissionStrategy.h" +@interface MediaLibraryPermissionStrategy : UnknownPermissionStrategy +@end + +#endif diff --git a/ios/Classes/strategies/MediaLibraryPermissionStrategy.m b/ios/Classes/strategies/MediaLibraryPermissionStrategy.m index 778728fe3..df7bac80d 100644 --- a/ios/Classes/strategies/MediaLibraryPermissionStrategy.m +++ b/ios/Classes/strategies/MediaLibraryPermissionStrategy.m @@ -5,6 +5,7 @@ #import "MediaLibraryPermissionStrategy.h" +#if PERMISSION_MEDIA_LIBRARY @implementation MediaLibraryPermissionStrategy @@ -59,3 +60,10 @@ + (PermissionStatus)determinePermissionStatus:(MPMediaLibraryAuthorizationStatus } @end + +#else + +@implementation MediaLibraryPermissionStrategy +@end + +#endif diff --git a/ios/Classes/strategies/NotificationPermissionStrategy.h b/ios/Classes/strategies/NotificationPermissionStrategy.h index 21ea533d1..df5a795d6 100644 --- a/ios/Classes/strategies/NotificationPermissionStrategy.h +++ b/ios/Classes/strategies/NotificationPermissionStrategy.h @@ -6,9 +6,20 @@ // #import -#import #import "PermissionStrategy.h" +#if PERMISSION_NOTIFICATIONS + +#import + @interface NotificationPermissionStrategy : NSObject @end + +#else + +#import "UnknownPermissionStrategy.h" +@interface NotificationPermissionStrategy : UnknownPermissionStrategy +@end + +#endif diff --git a/ios/Classes/strategies/NotificationPermissionStrategy.m b/ios/Classes/strategies/NotificationPermissionStrategy.m index c917585a9..bea7707d1 100644 --- a/ios/Classes/strategies/NotificationPermissionStrategy.m +++ b/ios/Classes/strategies/NotificationPermissionStrategy.m @@ -7,6 +7,8 @@ #import "NotificationPermissionStrategy.h" +#if PERMISSION_NOTIFICATIONS + @implementation NotificationPermissionStrategy - (PermissionStatus)checkPermissionStatus:(PermissionGroup)permission { @@ -73,3 +75,10 @@ + (PermissionStatus)permissionStatus { } @end + +#else + +@implementation NotificationPermissionStrategy +@end + +#endif diff --git a/ios/Classes/strategies/PhotoPermissionStrategy.h b/ios/Classes/strategies/PhotoPermissionStrategy.h index 8c3fd9809..3ffb6a3f3 100644 --- a/ios/Classes/strategies/PhotoPermissionStrategy.h +++ b/ios/Classes/strategies/PhotoPermissionStrategy.h @@ -5,8 +5,18 @@ #import #import "PermissionStrategy.h" -#import +#if PERMISSION_PHOTOS + +#import @interface PhotoPermissionStrategy : NSObject -@end \ No newline at end of file +@end + +#else + +#import "UnknownPermissionStrategy.h" +@interface PhotoPermissionStrategy : UnknownPermissionStrategy +@end + +#endif diff --git a/ios/Classes/strategies/PhotoPermissionStrategy.m b/ios/Classes/strategies/PhotoPermissionStrategy.m index 632aa7081..ec67e6c2a 100644 --- a/ios/Classes/strategies/PhotoPermissionStrategy.m +++ b/ios/Classes/strategies/PhotoPermissionStrategy.m @@ -5,6 +5,7 @@ #import "PhotoPermissionStrategy.h" +#if PERMISSION_PHOTOS @implementation PhotoPermissionStrategy - (PermissionStatus)checkPermissionStatus:(PermissionGroup)permission { @@ -49,4 +50,11 @@ + (PermissionStatus)determinePermissionStatus:(PHAuthorizationStatus)authorizati return PermissionStatusUnknown; } -@end \ No newline at end of file +@end + +#else + +@implementation PhotoPermissionStrategy +@end + +#endif diff --git a/ios/Classes/strategies/SensorPermissionStrategy.h b/ios/Classes/strategies/SensorPermissionStrategy.h index 029070486..22f8dcadd 100644 --- a/ios/Classes/strategies/SensorPermissionStrategy.h +++ b/ios/Classes/strategies/SensorPermissionStrategy.h @@ -3,10 +3,20 @@ // Copyright (c) 2019 The Chromium Authors. All rights reserved. // -#import #import #import "PermissionStrategy.h" +#if PERMISSION_SENSORS + +#import @interface SensorPermissionStrategy : NSObject -@end \ No newline at end of file +@end + +#else + +#import "UnknownPermissionStrategy.h" +@interface SensorPermissionStrategy : UnknownPermissionStrategy +@end + +#endif diff --git a/ios/Classes/strategies/SensorPermissionStrategy.m b/ios/Classes/strategies/SensorPermissionStrategy.m index d81a54ddf..3f06d15a7 100644 --- a/ios/Classes/strategies/SensorPermissionStrategy.m +++ b/ios/Classes/strategies/SensorPermissionStrategy.m @@ -5,6 +5,7 @@ #import "SensorPermissionStrategy.h" +#if PERMISSION_SENSORS @implementation SensorPermissionStrategy - (PermissionStatus)checkPermissionStatus:(PermissionGroup)permission { @@ -80,3 +81,10 @@ + (PermissionStatus)permissionStatus { } @end + +#else + +@implementation SensorPermissionStrategy +@end + +#endif diff --git a/ios/Classes/strategies/SpeechPermissionStrategy.h b/ios/Classes/strategies/SpeechPermissionStrategy.h index 615f79f03..0e00ecc32 100644 --- a/ios/Classes/strategies/SpeechPermissionStrategy.h +++ b/ios/Classes/strategies/SpeechPermissionStrategy.h @@ -5,7 +5,18 @@ #import #import "PermissionStrategy.h" + +#if PERMISSION_SPEECH_RECOGNIZER + #import @interface SpeechPermissionStrategy : NSObject -@end \ No newline at end of file +@end + +#else + +#import "UnknownPermissionStrategy.h" +@interface SpeechPermissionStrategy : UnknownPermissionStrategy +@end + +#endif diff --git a/ios/Classes/strategies/SpeechPermissionStrategy.m b/ios/Classes/strategies/SpeechPermissionStrategy.m index 43c1060aa..2eb44581d 100644 --- a/ios/Classes/strategies/SpeechPermissionStrategy.m +++ b/ios/Classes/strategies/SpeechPermissionStrategy.m @@ -5,6 +5,7 @@ #import "SpeechPermissionStrategy.h" +#if PERMISSION_SPEECH_RECOGNIZER @implementation SpeechPermissionStrategy - (PermissionStatus)checkPermissionStatus:(PermissionGroup)permission { @@ -58,3 +59,10 @@ + (PermissionStatus)determinePermissionStatus:(SFSpeechRecognizerAuthorizationSt } @end + +#else + +@implementation SpeechPermissionStrategy +@end + +#endif From 296982baf48be88aac22f019086c10ec727e7523 Mon Sep 17 00:00:00 2001 From: ty0x2333 Date: Thu, 26 Dec 2019 12:42:04 +0800 Subject: [PATCH 2/5] Add configuration example to Podfile --- example/ios/Podfile | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/example/ios/Podfile b/example/ios/Podfile index 41580fd42..54e69486a 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -64,6 +64,46 @@ post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['ENABLE_BITCODE'] = 'NO' + + # You can remove unused permissions here + # e.g. when you don't need camera permission, just add 'PERMISSION_CAMERA=0' + config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [ + '$(inherited)', + + ## dart: PermissionGroup.calendar + # 'PERMISSION_EVENTS=0', + + ## dart: PermissionGroup.reminders + # 'PERMISSION_REMINDERS=0', + + ## dart: PermissionGroup.contacts + # 'PERMISSION_CONTACTS=0', + + ## dart: PermissionGroup.camera + # 'PERMISSION_CAMERA=0', + + ## dart: PermissionGroup.microphone + # 'PERMISSION_MICROPHONE=0', + + ## dart: PermissionGroup.speech + # 'PERMISSION_SPEECH_RECOGNIZER=0', + + ## dart: PermissionGroup.photos + # 'PERMISSION_PHOTOS=0', + + ## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse] + # 'PERMISSION_LOCATION=0', + + ## dart: PermissionGroup.notification + # 'PERMISSION_NOTIFICATIONS=0', + + ## dart: PermissionGroup.mediaLibrary + # 'PERMISSION_MEDIA_LIBRARY=0', + + ## dart: PermissionGroup.sensors + # 'PERMISSION_SENSORS=0' + ] + end end end From 770fac451f8a71890b8dad5c5a8122489787a8d2 Mon Sep 17 00:00:00 2001 From: ty0x2333 Date: Thu, 26 Dec 2019 12:57:33 +0800 Subject: [PATCH 3/5] Update README.md --- README.md | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7c27aaa6b..b3f823c53 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,59 @@ For this plugin to work you will have to add permission configuration to your `A - [AndroidManifest.xml](https://github.com/BaseflowIT/flutter-permission-handler/blob/develop/example/android/app/src/main/AndroidManifest.xml) (note that there is a debug, main and profile version which are used depending on how you start your App. In general it is sufficient to add permissions only to the `main` version); - [Info.plist](https://github.com/BaseflowIT/flutter-permission-handler/blob/develop/example/ios/Runner/Info.plist) -> IMPORTANT: On iOS you will have to include all permission options when you want to submit your App. This is because the `permission_handler` plugin touches all different SDKs and because the static code analyser (run by Apple upon App submission) detects this and will assert if it cannot find a matching permission option in the `Info.plist`. More information about this can be found [here](https://github.com/BaseflowIT/flutter-permission-handler/issues/26). Unfortunately we don't have a good solution for this. +> IMPORTANT: ~~On iOS you will have to include all permission options when you want to submit your App.~~ This is because the `permission_handler` plugin touches all different SDKs and because the static code analyser (run by Apple upon App submission) detects this and will assert if it cannot find a matching permission option in the `Info.plist`. More information about this can be found [here](https://github.com/BaseflowIT/flutter-permission-handler/issues/26). +> 1. Add the following to your "Podfile" file: +> +> ```ruby +> post_install do |installer| +> installer.pods_project.targets.each do |target| +> target.build_configurations.each do |config| +> ... # Here are some configurations automatically generated by flutter +> +> # You can remove unused permissions here +> # e.g. when you don't need camera permission, just add 'PERMISSION_CAMERA=0' +> config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [ +> '$(inherited)', +> +> ## dart: PermissionGroup.calendar +> # 'PERMISSION_EVENTS=0', +> +> ## dart: PermissionGroup.reminders +> # 'PERMISSION_REMINDERS=0', +> +> ## dart: PermissionGroup.contacts +> # 'PERMISSION_CONTACTS=0', +> +> ## dart: PermissionGroup.camera +> # 'PERMISSION_CAMERA=0', +> +> ## dart: PermissionGroup.microphone +> # 'PERMISSION_MICROPHONE=0', +> +> ## dart: PermissionGroup.speech +> # 'PERMISSION_SPEECH_RECOGNIZER=0', +> +> ## dart: PermissionGroup.photos +> # 'PERMISSION_PHOTOS=0', +> +> ## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse] +> # 'PERMISSION_LOCATION=0', +> +> ## dart: PermissionGroup.notification +> # 'PERMISSION_NOTIFICATIONS=0', +> +> ## dart: PermissionGroup.mediaLibrary +> # 'PERMISSION_MEDIA_LIBRARY=0', +> +> ## dart: PermissionGroup.sensors +> # 'PERMISSION_SENSORS=0' +> ] +> +> end +> end +> end +> ``` +> 2. Clean & Rebuild ## API From 87a59786ea41ed3641e799973463c7e91e95d572 Mon Sep 17 00:00:00 2001 From: ty0x2333 Date: Mon, 6 Jan 2020 17:55:41 +0800 Subject: [PATCH 4/5] Update README --- README.md | 107 ++++++++++++++++++++++++++++---------------- example/ios/Podfile | 1 + 2 files changed, 69 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index 1cca1ead3..8449dc1f4 100644 --- a/README.md +++ b/README.md @@ -54,58 +54,87 @@ For this plugin to work you will have to add permission configuration to your `A - [Info.plist](https://github.com/Baseflow/flutter-permission-handler/blob/develop/example/ios/Runner/Info.plist) > IMPORTANT: ~~On iOS you will have to include all permission options when you want to submit your App.~~ This is because the `permission_handler` plugin touches all different SDKs and because the static code analyser (run by Apple upon App submission) detects this and will assert if it cannot find a matching permission option in the `Info.plist`. More information about this can be found [here](https://github.com/BaseflowIT/flutter-permission-handler/issues/26). -> 1. Add the following to your "Podfile" file: + +On iOS, the permission_handler plugin use [macros](https://github.com/BaseflowIT/flutter-permission-handler/blob/develop/ios/Classes/PermissionHandlerEnums.h) to control whether a permission is supported. + +By default, all the permissions listed [here](https://github.com/Baseflow/flutter-permission-handler#list-of-available-permissions) are supported. + +You can remove permissions you don't use by: + +> 1. Add the following to your `Podfile` file: > -> ```ruby -> post_install do |installer| -> installer.pods_project.targets.each do |target| -> target.build_configurations.each do |config| -> ... # Here are some configurations automatically generated by flutter -> -> # You can remove unused permissions here -> # e.g. when you don't need camera permission, just add 'PERMISSION_CAMERA=0' -> config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [ -> '$(inherited)', +> ```ruby +> post_install do |installer| +> installer.pods_project.targets.each do |target| +> target.build_configurations.each do |config| +> ... # Here are some configurations automatically generated by flutter +> +> # You can remove unused permissions here +> # for more infomation: https://github.com/BaseflowIT/flutter-permission-handler/blob/develop/ios/Classes/PermissionHandlerEnums.h +> # e.g. when you don't need camera permission, just add 'PERMISSION_CAMERA=0' +> config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [ +> '$(inherited)', > -> ## dart: PermissionGroup.calendar -> # 'PERMISSION_EVENTS=0', +> ## dart: PermissionGroup.calendar +> # 'PERMISSION_EVENTS=0', > -> ## dart: PermissionGroup.reminders -> # 'PERMISSION_REMINDERS=0', +> ## dart: PermissionGroup.reminders +> # 'PERMISSION_REMINDERS=0', > -> ## dart: PermissionGroup.contacts -> # 'PERMISSION_CONTACTS=0', +> ## dart: PermissionGroup.contacts +> # 'PERMISSION_CONTACTS=0', > -> ## dart: PermissionGroup.camera -> # 'PERMISSION_CAMERA=0', +> ## dart: PermissionGroup.camera +> # 'PERMISSION_CAMERA=0', > -> ## dart: PermissionGroup.microphone -> # 'PERMISSION_MICROPHONE=0', +> ## dart: PermissionGroup.microphone +> # 'PERMISSION_MICROPHONE=0', > -> ## dart: PermissionGroup.speech -> # 'PERMISSION_SPEECH_RECOGNIZER=0', +> ## dart: PermissionGroup.speech +> # 'PERMISSION_SPEECH_RECOGNIZER=0', > -> ## dart: PermissionGroup.photos -> # 'PERMISSION_PHOTOS=0', +> ## dart: PermissionGroup.photos +> # 'PERMISSION_PHOTOS=0', > -> ## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse] -> # 'PERMISSION_LOCATION=0', +> ## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse] +> # 'PERMISSION_LOCATION=0', > -> ## dart: PermissionGroup.notification -> # 'PERMISSION_NOTIFICATIONS=0', +> ## dart: PermissionGroup.notification +> # 'PERMISSION_NOTIFICATIONS=0', > -> ## dart: PermissionGroup.mediaLibrary -> # 'PERMISSION_MEDIA_LIBRARY=0', +> ## dart: PermissionGroup.mediaLibrary +> # 'PERMISSION_MEDIA_LIBRARY=0', > -> ## dart: PermissionGroup.sensors -> # 'PERMISSION_SENSORS=0' -> ] +> ## dart: PermissionGroup.sensors +> # 'PERMISSION_SENSORS=0' +> ] > -> end -> end -> end -> ``` -> 2. Clean & Rebuild +> end +> end +> end +> ``` +> +> 2. Delete the corresponding permission description in `Info.plist` +> +> e.g. when you don't need camera permission, just delete 'NSCameraUsageDescription' +> +> The following lists the relationship between `Permission` and `The key of Info.plist`: +> +> | Permission | Info.plist | Macro | +> |---|---|---|---| +> | PermissionGroup.calendar | NSCalendarsUsageDescription | PERMISSION_EVENTS | +> | PermissionGroup.reminders | NSRemindersUsageDescription | PERMISSION_REMINDERS | +> | PermissionGroup.contacts | NSContactsUsageDescription | PERMISSION_CONTACTS | +> | PermissionGroup.camera | NSCameraUsageDescription | PERMISSION_CAMERA | +> | PermissionGroup.microphone | NSMicrophoneUsageDescription | PERMISSION_MICROPHONE | +> | PermissionGroup.speech | NSSpeechRecognitionUsageDescription | PERMISSION_SPEECH_RECOGNIZER | +> | PermissionGroup.photos | NSPhotoLibraryUsageDescription | PERMISSION_PHOTOS | +> | PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse | NSLocationUsageDescription, NSLocationAlwaysAndWhenInUseUsageDescription, NSLocationWhenInUseUsageDescription | PERMISSION_LOCATION | +> | PermissionGroup.notification | PermissionGroupNotification | PERMISSION_NOTIFICATIONS | +> | PermissionGroup.mediaLibrary | NSAppleMusicUsageDescription, kTCCServiceMediaLibrary | PERMISSION_MEDIA_LIBRARY | +> | PermissionGroup.sensors | NSMotionUsageDescription | PERMISSION_SENSORS | +> +> 3. Clean & Rebuild ## API diff --git a/example/ios/Podfile b/example/ios/Podfile index 54e69486a..a4eaa046b 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -66,6 +66,7 @@ post_install do |installer| config.build_settings['ENABLE_BITCODE'] = 'NO' # You can remove unused permissions here + # for more infomation: https://github.com/BaseflowIT/flutter-permission-handler/blob/develop/ios/Classes/PermissionHandlerEnums.h # e.g. when you don't need camera permission, just add 'PERMISSION_CAMERA=0' config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [ '$(inherited)', From b9f9e4b5e3d0c636cef38baa0860867227b49f20 Mon Sep 17 00:00:00 2001 From: ty0x2333 Date: Mon, 6 Jan 2020 17:59:07 +0800 Subject: [PATCH 5/5] Update README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8449dc1f4..0bfa7ab24 100644 --- a/README.md +++ b/README.md @@ -121,7 +121,7 @@ You can remove permissions you don't use by: > The following lists the relationship between `Permission` and `The key of Info.plist`: > > | Permission | Info.plist | Macro | -> |---|---|---|---| +> |---|---|---| > | PermissionGroup.calendar | NSCalendarsUsageDescription | PERMISSION_EVENTS | > | PermissionGroup.reminders | NSRemindersUsageDescription | PERMISSION_REMINDERS | > | PermissionGroup.contacts | NSContactsUsageDescription | PERMISSION_CONTACTS |