155 lines
5.0 KiB
Objective-C
155 lines
5.0 KiB
Objective-C
/**
|
|
* 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"
|
|
|
|
NSString *const RCTRemoteNotificationReceived = @"RemoteNotificationReceived";
|
|
NSString *const RCTOpenURLNotification = @"RCTOpenURLNotification";
|
|
|
|
@implementation RCTPushNotificationManager
|
|
{
|
|
NSDictionary *_initialNotification;
|
|
}
|
|
|
|
@synthesize bridge = _bridge;
|
|
|
|
- (instancetype)init
|
|
{
|
|
return [self initWithInitialNotification:nil];
|
|
}
|
|
|
|
- (instancetype)initWithInitialNotification:(NSDictionary *)initialNotification
|
|
{
|
|
if ((self = [super init])) {
|
|
_initialNotification = [initialNotification copy];
|
|
[[NSNotificationCenter defaultCenter] addObserver:self
|
|
selector:@selector(handleRemoteNotificationReceived:)
|
|
name:RCTRemoteNotificationReceived
|
|
object:nil];
|
|
[[NSNotificationCenter defaultCenter] addObserver:self
|
|
selector:@selector(handleOpenURLNotification:)
|
|
name:RCTOpenURLNotification
|
|
object:nil];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)dealloc
|
|
{
|
|
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
|
}
|
|
|
|
+ (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
|
|
{
|
|
if ([application respondsToSelector:@selector(registerForRemoteNotifications)]) {
|
|
[application registerForRemoteNotifications];
|
|
}
|
|
}
|
|
|
|
+ (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)notification
|
|
{
|
|
[[NSNotificationCenter defaultCenter] postNotificationName:RCTRemoteNotificationReceived
|
|
object:self
|
|
userInfo:notification];
|
|
}
|
|
|
|
+ (BOOL)application:(UIApplication *)application
|
|
openURL:(NSURL *)url
|
|
sourceApplication:(NSString *)sourceApplication
|
|
annotation:(id)annotation
|
|
{
|
|
NSDictionary *payload = @{@"url": [url absoluteString]};
|
|
[[NSNotificationCenter defaultCenter] postNotificationName:RCTOpenURLNotification
|
|
object:self
|
|
userInfo:payload];
|
|
return YES;
|
|
}
|
|
|
|
- (void)handleRemoteNotificationReceived:(NSNotification *)notification
|
|
{
|
|
[_bridge.eventDispatcher sendDeviceEventWithName:@"remoteNotificationReceived"
|
|
body:[notification userInfo]];
|
|
}
|
|
|
|
- (void)handleOpenURLNotification:(NSNotification *)notification
|
|
{
|
|
[_bridge.eventDispatcher sendDeviceEventWithName:@"openURL"
|
|
body:[notification userInfo]];
|
|
}
|
|
|
|
/**
|
|
* Update the application icon badge number on the home screen
|
|
*/
|
|
+ (void)setApplicationIconBadgeNumber:(NSInteger)number
|
|
{
|
|
RCT_EXPORT();
|
|
|
|
[UIApplication sharedApplication].applicationIconBadgeNumber = number;
|
|
}
|
|
|
|
/**
|
|
* Get the current application icon badge number on the home screen
|
|
*/
|
|
+ (void)getApplicationIconBadgeNumber:(RCTResponseSenderBlock)callback
|
|
{
|
|
RCT_EXPORT();
|
|
|
|
callback(@[
|
|
@([UIApplication sharedApplication].applicationIconBadgeNumber)
|
|
]);
|
|
}
|
|
|
|
+ (void)requestPermissions
|
|
{
|
|
RCT_EXPORT();
|
|
|
|
#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0
|
|
|
|
// if we are targeting iOS 7, *and* the new UIUserNotificationSettings
|
|
// class is not available, then register using the old mechanism
|
|
if (![UIUserNotificationSettings class]) {
|
|
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
|
|
UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert];
|
|
return;
|
|
}
|
|
|
|
#endif
|
|
|
|
UIUserNotificationType types = UIUserNotificationTypeSound | UIUserNotificationTypeBadge | UIUserNotificationTypeAlert;
|
|
UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
|
|
[[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings];
|
|
|
|
}
|
|
|
|
+ (void)checkPermissions:(RCTResponseSenderBlock)callback
|
|
{
|
|
RCT_EXPORT();
|
|
|
|
NSMutableDictionary *permissions = [[NSMutableDictionary alloc] init];
|
|
|
|
UIUserNotificationType types = [[[UIApplication sharedApplication] currentUserNotificationSettings] types];
|
|
permissions[@"alert"] = @((BOOL)(types & UIUserNotificationTypeAlert));
|
|
permissions[@"badge"] = @((BOOL)(types & UIUserNotificationTypeBadge));
|
|
permissions[@"sound"] = @((BOOL)(types & UIUserNotificationTypeSound));
|
|
|
|
callback(@[permissions]);
|
|
}
|
|
|
|
- (NSDictionary *)constantsToExport
|
|
{
|
|
return @{
|
|
@"initialNotification": _initialNotification ?: [NSNull null]
|
|
};
|
|
}
|
|
|
|
@end
|