evollu / evollu/react-native-fcm

Feature proposal : get permission status

Open
#849 5 comments 0 reactions 0 assignees View on GitHub
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.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.