Commit adad4367 by Maurits van Beusekom Committed by GitHub

Merge pull request #564 from Baseflow/issue/375_permission_handler

Added AppTrackingTransparency permission
parents ebe31370 a87d3566
## 8.0.0
This release contains the following **breaking changes**:
* Starting from this version the permissions on iOS are disabled by default. To enable a permission, specify the correct `GCC_PREPROCESSOR_DEFINITIONS` in the `ios/Podfile` file. For an example check out the [Podfile](example/ios/Podfile) of the example application.
* Added support for the "AppTrackingTransparency" permission on iOS.
## 7.2.0 ## 7.2.0
* Added support for the "REQUEST_INSTALL_PACKAGES" permission on Android. * Added support for the "REQUEST_INSTALL_PACKAGES" permission on Android.
......
...@@ -46,37 +46,43 @@ post_install do |installer| ...@@ -46,37 +46,43 @@ post_install do |installer|
'$(inherited)', '$(inherited)',
## dart: PermissionGroup.calendar ## dart: PermissionGroup.calendar
# 'PERMISSION_EVENTS=0', 'PERMISSION_EVENTS=1',
## dart: PermissionGroup.reminders ## dart: PermissionGroup.reminders
# 'PERMISSION_REMINDERS=0', 'PERMISSION_REMINDERS=1',
## dart: PermissionGroup.contacts ## dart: PermissionGroup.contacts
# 'PERMISSION_CONTACTS=0', 'PERMISSION_CONTACTS=1',
## dart: PermissionGroup.camera ## dart: PermissionGroup.camera
# 'PERMISSION_CAMERA=0', 'PERMISSION_CAMERA=1',
## dart: PermissionGroup.microphone ## dart: PermissionGroup.microphone
# 'PERMISSION_MICROPHONE=0', 'PERMISSION_MICROPHONE=1',
## dart: PermissionGroup.speech ## dart: PermissionGroup.speech
# 'PERMISSION_SPEECH_RECOGNIZER=0', 'PERMISSION_SPEECH_RECOGNIZER=1',
## dart: PermissionGroup.photos ## dart: PermissionGroup.photos
#'PERMISSION_PHOTOS=0' 'PERMISSION_PHOTOS=1',
## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse] ## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse]
# 'PERMISSION_LOCATION=0', 'PERMISSION_LOCATION=1',
## dart: PermissionGroup.notification ## dart: PermissionGroup.notification
# 'PERMISSION_NOTIFICATIONS=0', 'PERMISSION_NOTIFICATIONS=1',
## dart: PermissionGroup.mediaLibrary ## dart: PermissionGroup.mediaLibrary
# 'PERMISSION_MEDIA_LIBRARY=0', 'PERMISSION_MEDIA_LIBRARY=1',
## dart: PermissionGroup.sensors ## dart: PermissionGroup.sensors
# 'PERMISSION_SENSORS=0' 'PERMISSION_SENSORS=1',
## dart: PermissionGroup.bluetooth
'PERMISSION_BLUETOOTH=1',
## dart: PermissionGroup.appTrackingTransparency
'PERMISSION_APP_TRACKING_TRANSPARENCY=1'
] ]
end end
......
...@@ -90,5 +90,14 @@ ...@@ -90,5 +90,14 @@
<key>NSRemindersUsageDescription</key> <key>NSRemindersUsageDescription</key>
<string>reminders</string> <string>reminders</string>
<!-- Permission options for the `bluetooth` -->
<key>NSBluetoothAlwaysUsageDescription</key>
<string>bluetooth</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>bluetooth</string>
<!-- Permission options for the `appTrackingTransparency` -->
<key>NSUserTrackingUsageDescription</key>
<string>appTrackingTransparency</string>
</dict> </dict>
</plist> </plist>
...@@ -50,7 +50,8 @@ class _PermissionHandlerWidgetState extends State<PermissionHandlerWidget> { ...@@ -50,7 +50,8 @@ class _PermissionHandlerWidgetState extends State<PermissionHandlerWidget> {
permission != Permission.mediaLibrary && permission != Permission.mediaLibrary &&
permission != Permission.photos && permission != Permission.photos &&
permission != Permission.photosAddOnly && permission != Permission.photosAddOnly &&
permission != Permission.reminders; permission != Permission.reminders &&
permission != Permission.appTrackingTransparency;
} }
}) })
.map((permission) => PermissionWidget(permission)) .map((permission) => PermissionWidget(permission))
......
...@@ -9,90 +9,97 @@ ...@@ -9,90 +9,97 @@
// Info.plist: NSCalendarsUsageDescription // Info.plist: NSCalendarsUsageDescription
// dart: PermissionGroup.calendar // dart: PermissionGroup.calendar
#ifndef PERMISSION_EVENTS #ifndef PERMISSION_EVENTS
#define PERMISSION_EVENTS 1 #define PERMISSION_EVENTS 0
#endif #endif
// ios: PermissionGroupReminders // ios: PermissionGroupReminders
// Info.plist: NSRemindersUsageDescription // Info.plist: NSRemindersUsageDescription
// dart: PermissionGroup.reminders // dart: PermissionGroup.reminders
#ifndef PERMISSION_REMINDERS #ifndef PERMISSION_REMINDERS
#define PERMISSION_REMINDERS 1 #define PERMISSION_REMINDERS 0
#endif #endif
// ios: PermissionGroupContacts // ios: PermissionGroupContacts
// Info.plist: NSContactsUsageDescription // Info.plist: NSContactsUsageDescription
// dart: PermissionGroup.contacts // dart: PermissionGroup.contacts
#ifndef PERMISSION_CONTACTS #ifndef PERMISSION_CONTACTS
#define PERMISSION_CONTACTS 1 #define PERMISSION_CONTACTS 0
#endif #endif
// ios: PermissionGroupCamera // ios: PermissionGroupCamera
// Info.plist: NSCameraUsageDescription // Info.plist: NSCameraUsageDescription
// dart: PermissionGroup.camera // dart: PermissionGroup.camera
#ifndef PERMISSION_CAMERA #ifndef PERMISSION_CAMERA
#define PERMISSION_CAMERA 1 #define PERMISSION_CAMERA 0
#endif #endif
// ios: PermissionGroupMicrophone // ios: PermissionGroupMicrophone
// Info.plist: NSMicrophoneUsageDescription // Info.plist: NSMicrophoneUsageDescription
// dart: PermissionGroup.microphone // dart: PermissionGroup.microphone
#ifndef PERMISSION_MICROPHONE #ifndef PERMISSION_MICROPHONE
#define PERMISSION_MICROPHONE 1 #define PERMISSION_MICROPHONE 0
#endif #endif
// ios: PermissionGroupSpeech // ios: PermissionGroupSpeech
// Info.plist: NSSpeechRecognitionUsageDescription // Info.plist: NSSpeechRecognitionUsageDescription
// dart: PermissionGroup.speech // dart: PermissionGroup.speech
#ifndef PERMISSION_SPEECH_RECOGNIZER #ifndef PERMISSION_SPEECH_RECOGNIZER
#define PERMISSION_SPEECH_RECOGNIZER 1 #define PERMISSION_SPEECH_RECOGNIZER 0
#endif #endif
// ios: PermissionGroupPhotos // ios: PermissionGroupPhotos
// Info.plist: NSPhotoLibraryUsageDescription // Info.plist: NSPhotoLibraryUsageDescription
// dart: PermissionGroup.photos // dart: PermissionGroup.photos
#ifndef PERMISSION_PHOTOS #ifndef PERMISSION_PHOTOS
#define PERMISSION_PHOTOS 1 #define PERMISSION_PHOTOS 0
#endif #endif
// ios: PermissionGroupPhotosAddOnly // ios: PermissionGroupPhotosAddOnly
// Info.plist: NSPhotoLibraryUsageDescription // Info.plist: NSPhotoLibraryUsageDescription
// dart: PermissionGroup.photosAddOnly // dart: PermissionGroup.photosAddOnly
#ifndef PERMISSION_PHOTOS_ADD_ONLY #ifndef PERMISSION_PHOTOS_ADD_ONLY
#define PERMISSION_PHOTOS_ADD_ONLY 1 #define PERMISSION_PHOTOS_ADD_ONLY 0
#endif #endif
// ios: [PermissionGroupLocation, PermissionGroupLocationAlways, PermissionGroupLocationWhenInUse] // ios: [PermissionGroupLocation, PermissionGroupLocationAlways, PermissionGroupLocationWhenInUse]
// Info.plist: [NSLocationUsageDescription, NSLocationAlwaysAndWhenInUseUsageDescription, NSLocationWhenInUseUsageDescription] // Info.plist: [NSLocationUsageDescription, NSLocationAlwaysAndWhenInUseUsageDescription, NSLocationWhenInUseUsageDescription]
// dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse] // dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse]
#ifndef PERMISSION_LOCATION #ifndef PERMISSION_LOCATION
#define PERMISSION_LOCATION 1 #define PERMISSION_LOCATION 0
#endif #endif
// ios: PermissionGroupNotification // ios: PermissionGroupNotification
// dart: PermissionGroup.notification // dart: PermissionGroup.notification
#ifndef PERMISSION_NOTIFICATIONS #ifndef PERMISSION_NOTIFICATIONS
#define PERMISSION_NOTIFICATIONS 1 #define PERMISSION_NOTIFICATIONS 0
#endif #endif
// ios: PermissionGroupMediaLibrary // ios: PermissionGroupMediaLibrary
// Info.plist: [NSAppleMusicUsageDescription, kTCCServiceMediaLibrary] // Info.plist: [NSAppleMusicUsageDescription, kTCCServiceMediaLibrary]
// dart: PermissionGroup.mediaLibrary // dart: PermissionGroup.mediaLibrary
#ifndef PERMISSION_MEDIA_LIBRARY #ifndef PERMISSION_MEDIA_LIBRARY
#define PERMISSION_MEDIA_LIBRARY 1 #define PERMISSION_MEDIA_LIBRARY 0
#endif #endif
// ios: PermissionGroupSensors // ios: PermissionGroupSensors
// Info.plist: NSMotionUsageDescription // Info.plist: NSMotionUsageDescription
// dart: PermissionGroup.sensors // dart: PermissionGroup.sensors
#ifndef PERMISSION_SENSORS #ifndef PERMISSION_SENSORS
#define PERMISSION_SENSORS 1 #define PERMISSION_SENSORS 0
#endif #endif
// ios: PermissionGroupBluetooth // ios: PermissionGroupBluetooth
// Info.plist: [NSBluetoothAlwaysUsageDescription, NSBluetoothPeripheralUsageDescription] // Info.plist: [NSBluetoothAlwaysUsageDescription, NSBluetoothPeripheralUsageDescription]
// dart: PermissionGroup.bluetooth // dart: PermissionGroup.bluetooth
#ifndef PERMISSION_BLUETOOTH #ifndef PERMISSION_BLUETOOTH
#define PERMISSION_BLUETOOTH 1 #define PERMISSION_BLUETOOTH 0
#endif
// ios: PermissionGroupAppTrackingTransparency
// Info.plist: [NSUserTrackingUsageDescription]
// dart: PermissionGroup.appTrackingTransparency
#ifndef PERMISSION_APP_TRACKING_TRANSPARENCY
#define PERMISSION_APP_TRACKING_TRANSPARENCY 0
#endif #endif
typedef NS_ENUM(int, PermissionGroup) { typedef NS_ENUM(int, PermissionGroup) {
...@@ -119,7 +126,9 @@ typedef NS_ENUM(int, PermissionGroup) { ...@@ -119,7 +126,9 @@ typedef NS_ENUM(int, PermissionGroup) {
PermissionGroupUnknown, PermissionGroupUnknown,
PermissionGroupBluetooth, PermissionGroupBluetooth,
PermissionGroupManageExternalStorage, PermissionGroupManageExternalStorage,
PermissionGroupSystemAlertWindow PermissionGroupSystemAlertWindow,
PermissionGroupRequestInstallPackages,
PermissionGroupAppTrackingTransparency
}; };
typedef NS_ENUM(int, PermissionStatus) { typedef NS_ENUM(int, PermissionStatus) {
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#import <UIKit/UIKit.h> #import <UIKit/UIKit.h>
#import "AudioVideoPermissionStrategy.h" #import "AudioVideoPermissionStrategy.h"
#import "AppTrackingTransparencyPermissionStrategy.h"
#import "BluetoothPermissionStrategy.h" #import "BluetoothPermissionStrategy.h"
#import "ContactPermissionStrategy.h" #import "ContactPermissionStrategy.h"
#import "EventPermissionStrategy.h" #import "EventPermissionStrategy.h"
......
...@@ -125,6 +125,8 @@ ...@@ -125,6 +125,8 @@
return [StoragePermissionStrategy new]; return [StoragePermissionStrategy new];
case PermissionGroupBluetooth: case PermissionGroupBluetooth:
return [BluetoothPermissionStrategy new]; return [BluetoothPermissionStrategy new];
case PermissionGroupAppTrackingTransparency:
return [AppTrackingTransparencyPermissionStrategy new];
default: default:
return [UnknownPermissionStrategy new]; return [UnknownPermissionStrategy new];
} }
......
//
// AppTrackingTransparency.h
// permission_handler
//
// Created by Jan-Derk on 21/05/2021.
//
#import <Foundation/Foundation.h>
#import "PermissionStrategy.h"
#if PERMISSION_APP_TRACKING_TRANSPARENCY
#import <AppTrackingTransparency/AppTrackingTransparency.h>
@interface AppTrackingTransparencyPermissionStrategy : NSObject <PermissionStrategy>
@end
#else
#import "UnknownPermissionStrategy.h"
@interface AppTrackingTransparencyPermissionStrategy : UnknownPermissionStrategy
@end
#endif
//
// AppTrackingTransparency.m
// permission_handler
//
// Created by Jan-Derk on 21/05/2021.
//
#import "AppTrackingTransparencyPermissionStrategy.h"
#if PERMISSION_APP_TRACKING_TRANSPARENCY
@implementation AppTrackingTransparencyPermissionStrategy
- (PermissionStatus)checkPermissionStatus:(PermissionGroup)permission {
if (@available(iOS 14, *)) {
ATTrackingManagerAuthorizationStatus attPermission = [ATTrackingManager trackingAuthorizationStatus];
return [AppTrackingTransparencyPermissionStrategy parsePermission:attPermission];
}
return PermissionStatusGranted;
}
- (ServiceStatus)checkServiceStatus:(PermissionGroup)permission {
return ServiceStatusNotApplicable;
}
- (void)requestPermission:(PermissionGroup)permission completionHandler:(PermissionStatusHandler)completionHandler {
PermissionStatus status = [self checkPermissionStatus:permission];
if (status != PermissionStatusDenied) {
completionHandler(status);
return;
}
if (@available(iOS 14, *)){
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
PermissionStatus permissionStatus = [AppTrackingTransparencyPermissionStrategy parsePermission:status];
completionHandler(permissionStatus);
}];
} else {
completionHandler(PermissionStatusGranted);
}
}
+ (PermissionStatus)parsePermission:(ATTrackingManagerAuthorizationStatus)attPermission API_AVAILABLE(ios(14)){
switch(attPermission){
case ATTrackingManagerAuthorizationStatusAuthorized:
return PermissionStatusGranted;
case ATTrackingManagerAuthorizationStatusRestricted:
return PermissionStatusRestricted;
case ATTrackingManagerAuthorizationStatusDenied:
return PermissionStatusPermanentlyDenied;
case ATTrackingManagerAuthorizationStatusNotDetermined:
return PermissionStatusDenied;
}
}
@end
#else
@implementation AppTrackingTransparencyPermissionStrategy
@end
#endif
name: permission_handler name: permission_handler
description: Permission plugin for Flutter. This plugin provides a cross-platform (iOS, Android) API to request and check permissions. description: Permission plugin for Flutter. This plugin provides a cross-platform (iOS, Android) API to request and check permissions.
version: 7.2.0 version: 8.0.0
homepage: https://github.com/baseflowit/flutter-permission-handler homepage: https://github.com/baseflowit/flutter-permission-handler
flutter: flutter:
...@@ -16,7 +16,7 @@ dependencies: ...@@ -16,7 +16,7 @@ dependencies:
flutter: flutter:
sdk: flutter sdk: flutter
meta: ^1.3.0 meta: ^1.3.0
permission_handler_platform_interface: ^3.4.0 permission_handler_platform_interface: ^3.5.0
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment