evollu / evollu/react-native-fcm
Feature proposal : get permission status
- Dominant language
- Java
- Stars
- 1.7k
- Forks
- 661
- PR merge metrics
- No merged PRs in 30d
Description
Hello,
this isn't really about an issue, this is more an extra feature I needed and developed (as an Objective-C category :)
Here is my need:
- My application needs the user to accept several permissions (GPS, backgroundRefresh on iOS, Push Notifications on iOS, ....).
- If the user doesn't accept all the permissions, then he cannot access application and is blocked by a specific screen.
In order to develop that, I need to be able to:
- check a permission
- activate a permission (using native popups...)
I'm using [react-native-permissions](https://github.com/yonahforst/react-native-permissions) to check / activate permissions.
The problem came when I installed `react-native-fcm` : both modules don't activate Notifications the same way (because of `UserNotifications` new framework introduced in iOS 10+).
If you find this feature interesting, here its the code :
```
#import "RNFIRMessaging.h"
@interface RNFIRMessaging (Permission)
@end
#import "RNFIRMessaging+Permission.h"
static NSString* LCDidAskForNotification = @"LCDidAskForNotification";
// authorization status (we use same status names as react-native-permissions)
static NSString* LCStatusUndetermined = @"undetermined";
static NSString* LCStatusDenied = @"denied";
static NSString* LCStatusAuthorized = @"authorized";
@import UserNotifications;
@implementation RNFIRMessaging (Permission)
// we use NSUserDefault to know if user already asked for permissions
// (same logic as react-native-permissions)
//
// This doesn't really need to be exposed to Javascript
// it could be called on native side in 'react-native-fcm' 'requestPermissions' method
RCT_EXPORT_METHOD(setPushNotificationAsked:(BOOL)asked)
{
[[NSUserDefaults standardUserDefaults] setBool:asked forKey:LCDidAskForNotification];
[[NSUserDefaults standardUserDefaults] synchronize];
}
//
//
//
RCT_EXPORT_METHOD(checkPushNotificationAuthorization:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
{
BOOL didAskForPermission = [[NSUserDefaults standardUserDefaults] boolForKey:LCDidAskForNotification];
// we use different API for notifications odépending on iOS version
if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) {
BOOL isEnabled = [[[UIApplication sharedApplication] currentUserNotificationSettings] types] != UIUserNotificationTypeNone;
NSString *permissionStatus = LCStatusUndetermined;
if (isEnabled) {
permissionStatus = LCStatusAuthorized;
} else if(didAskForPermission){
permissionStatus = LCStatusDenied;
}
resolve(permissionStatus);
} else {
// iOS 10 or later
#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
[[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
// translate API status to our own NSString
NSString *permissionStatus = LCStatusUndetermined; // default
if(settings.authorizationStatus == UNAuthorizationStatusAuthorized){
permissionStatus = LCStatusAuthorized;
} else if (didAskForPermission){
permissionStatus = LCStatusDenied;
}
resolve(permissionStatus);
}];
#endif
}
}
@end
```
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.