2015-03-24 12:31:11 +00:00
|
|
|
/**
|
|
|
|
* Copyright (c) 2015-present, Facebook, Inc.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* This source code is licensed under the BSD-style license found in the
|
|
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#import "RCTPushNotificationManager.h"
|
|
|
|
|
|
|
|
#import "RCTBridge.h"
|
|
|
|
#import "RCTEventDispatcher.h"
|
2015-06-12 18:05:01 +00:00
|
|
|
#import "RCTUtils.h"
|
2015-03-24 12:31:11 +00:00
|
|
|
|
2015-06-03 21:11:20 +00:00
|
|
|
#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0
|
|
|
|
|
|
|
|
#define UIUserNotificationTypeAlert UIRemoteNotificationTypeAlert
|
|
|
|
#define UIUserNotificationTypeBadge UIRemoteNotificationTypeBadge
|
|
|
|
#define UIUserNotificationTypeSound UIRemoteNotificationTypeSound
|
|
|
|
#define UIUserNotificationTypeNone UIRemoteNotificationTypeNone
|
|
|
|
#define UIUserNotificationType UIRemoteNotificationType
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2015-03-24 12:31:11 +00:00
|
|
|
NSString *const RCTRemoteNotificationReceived = @"RemoteNotificationReceived";
|
2015-06-03 21:11:20 +00:00
|
|
|
NSString *const RCTRemoteNotificationsRegistered = @"RemoteNotificationsRegistered";
|
2015-03-24 12:31:11 +00:00
|
|
|
|
|
|
|
@implementation RCTPushNotificationManager
|
|
|
|
{
|
|
|
|
NSDictionary *_initialNotification;
|
|
|
|
}
|
|
|
|
|
2015-04-08 12:42:43 +00:00
|
|
|
RCT_EXPORT_MODULE()
|
|
|
|
|
2015-03-24 12:31:11 +00:00
|
|
|
@synthesize bridge = _bridge;
|
|
|
|
|
|
|
|
- (instancetype)init
|
|
|
|
{
|
|
|
|
if ((self = [super init])) {
|
|
|
|
[[NSNotificationCenter defaultCenter] addObserver:self
|
|
|
|
selector:@selector(handleRemoteNotificationReceived:)
|
|
|
|
name:RCTRemoteNotificationReceived
|
|
|
|
object:nil];
|
2015-06-03 21:11:20 +00:00
|
|
|
[[NSNotificationCenter defaultCenter] addObserver:self
|
|
|
|
selector:@selector(handleRemoteNotificationsRegistered:)
|
|
|
|
name:RCTRemoteNotificationsRegistered
|
|
|
|
object:nil];
|
2015-03-24 12:31:11 +00:00
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)dealloc
|
|
|
|
{
|
|
|
|
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
|
|
|
}
|
|
|
|
|
2015-04-30 21:09:55 +00:00
|
|
|
- (void)setBridge:(RCTBridge *)bridge
|
|
|
|
{
|
|
|
|
_bridge = bridge;
|
|
|
|
_initialNotification = [bridge.launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey] copy];
|
|
|
|
}
|
|
|
|
|
2015-03-24 12:31:11 +00:00
|
|
|
+ (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
|
|
|
|
{
|
2015-03-25 00:37:03 +00:00
|
|
|
if ([application respondsToSelector:@selector(registerForRemoteNotifications)]) {
|
|
|
|
[application registerForRemoteNotifications];
|
|
|
|
}
|
2015-03-24 12:31:11 +00:00
|
|
|
}
|
|
|
|
|
2015-06-03 21:11:20 +00:00
|
|
|
+ (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
|
|
|
|
{
|
|
|
|
NSMutableString *hexString = [NSMutableString string];
|
|
|
|
const unsigned char *bytes = [deviceToken bytes];
|
|
|
|
for (int i = 0; i < [deviceToken length]; i++) {
|
|
|
|
[hexString appendFormat:@"%02x", bytes[i]];
|
|
|
|
}
|
|
|
|
NSDictionary *userInfo = @{
|
|
|
|
@"deviceToken" : [hexString copy]
|
|
|
|
};
|
|
|
|
[[NSNotificationCenter defaultCenter] postNotificationName:RCTRemoteNotificationsRegistered
|
|
|
|
object:self
|
|
|
|
userInfo:userInfo];
|
|
|
|
}
|
|
|
|
|
2015-03-24 12:31:11 +00:00
|
|
|
+ (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)notification
|
|
|
|
{
|
|
|
|
[[NSNotificationCenter defaultCenter] postNotificationName:RCTRemoteNotificationReceived
|
|
|
|
object:self
|
|
|
|
userInfo:notification];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)handleRemoteNotificationReceived:(NSNotification *)notification
|
|
|
|
{
|
|
|
|
[_bridge.eventDispatcher sendDeviceEventWithName:@"remoteNotificationReceived"
|
|
|
|
body:[notification userInfo]];
|
|
|
|
}
|
|
|
|
|
2015-06-03 21:11:20 +00:00
|
|
|
- (void)handleRemoteNotificationsRegistered:(NSNotification *)notification
|
|
|
|
{
|
|
|
|
[_bridge.eventDispatcher sendDeviceEventWithName:@"remoteNotificationsRegistered"
|
|
|
|
body:[notification userInfo]];
|
|
|
|
}
|
|
|
|
|
2015-03-24 12:31:11 +00:00
|
|
|
/**
|
|
|
|
* Update the application icon badge number on the home screen
|
|
|
|
*/
|
2015-04-08 15:52:48 +00:00
|
|
|
RCT_EXPORT_METHOD(setApplicationIconBadgeNumber:(NSInteger)number)
|
2015-03-24 12:31:11 +00:00
|
|
|
{
|
|
|
|
[UIApplication sharedApplication].applicationIconBadgeNumber = number;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the current application icon badge number on the home screen
|
|
|
|
*/
|
2015-04-08 15:52:48 +00:00
|
|
|
RCT_EXPORT_METHOD(getApplicationIconBadgeNumber:(RCTResponseSenderBlock)callback)
|
2015-03-24 12:31:11 +00:00
|
|
|
{
|
|
|
|
callback(@[
|
|
|
|
@([UIApplication sharedApplication].applicationIconBadgeNumber)
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
2015-06-03 21:11:20 +00:00
|
|
|
RCT_EXPORT_METHOD(requestPermissions:(NSDictionary *)permissions)
|
2015-03-24 12:31:11 +00:00
|
|
|
{
|
2015-06-09 22:42:10 +00:00
|
|
|
UIUserNotificationType types = UIUserNotificationTypeNone;
|
2015-06-03 21:11:20 +00:00
|
|
|
if (permissions) {
|
|
|
|
if ([permissions[@"alert"] boolValue]) {
|
|
|
|
types |= UIUserNotificationTypeAlert;
|
|
|
|
}
|
|
|
|
if ([permissions[@"badge"] boolValue]) {
|
|
|
|
types |= UIUserNotificationTypeBadge;
|
|
|
|
}
|
|
|
|
if ([permissions[@"sound"] boolValue]) {
|
|
|
|
types |= UIUserNotificationTypeSound;
|
|
|
|
}
|
2015-04-10 10:10:04 +00:00
|
|
|
} else {
|
2015-06-03 21:11:20 +00:00
|
|
|
types = UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound;
|
|
|
|
}
|
2015-04-10 10:10:04 +00:00
|
|
|
|
2015-06-03 21:11:20 +00:00
|
|
|
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0
|
|
|
|
id notificationSettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
|
|
|
|
[[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings];
|
|
|
|
[[UIApplication sharedApplication] registerForRemoteNotifications];
|
|
|
|
#else
|
|
|
|
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:types];
|
2015-03-24 12:31:11 +00:00
|
|
|
#endif
|
2015-03-25 00:37:03 +00:00
|
|
|
|
2015-03-24 12:31:11 +00:00
|
|
|
}
|
|
|
|
|
2015-04-08 15:52:48 +00:00
|
|
|
RCT_EXPORT_METHOD(checkPermissions:(RCTResponseSenderBlock)callback)
|
2015-03-24 12:31:11 +00:00
|
|
|
{
|
2015-04-24 15:31:07 +00:00
|
|
|
NSUInteger types = 0;
|
2015-04-10 10:10:04 +00:00
|
|
|
if ([UIApplication instancesRespondToSelector:@selector(currentUserNotificationSettings)]) {
|
|
|
|
types = [[[UIApplication sharedApplication] currentUserNotificationSettings] types];
|
|
|
|
} else {
|
|
|
|
|
|
|
|
#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0
|
|
|
|
|
|
|
|
types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
NSMutableDictionary *permissions = [[NSMutableDictionary alloc] init];
|
|
|
|
permissions[@"alert"] = @((types & UIUserNotificationTypeAlert) > 0);
|
|
|
|
permissions[@"badge"] = @((types & UIUserNotificationTypeBadge) > 0);
|
|
|
|
permissions[@"sound"] = @((types & UIUserNotificationTypeSound) > 0);
|
2015-03-24 12:31:11 +00:00
|
|
|
|
|
|
|
callback(@[permissions]);
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSDictionary *)constantsToExport
|
|
|
|
{
|
|
|
|
return @{
|
2015-06-12 18:05:01 +00:00
|
|
|
@"initialNotification": RCTNullIfNil(_initialNotification),
|
2015-03-24 12:31:11 +00:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
@end
|