messaging().getToken now correctly returns a string on both platforms

This commit is contained in:
Salakar 2017-03-15 12:57:36 +00:00
parent 5c14dfeb3b
commit 6d52b6d4d3
5 changed files with 188 additions and 192 deletions

View File

@ -237,6 +237,11 @@ public class RNFirebaseAuth extends ReactContextBaseJavaModule {
});
}
/**
* delete
*
* @param promise
*/
@ReactMethod
public void delete(final Promise promise) {
FirebaseUser user = mAuth.getCurrentUser();

View File

@ -10,6 +10,7 @@ import android.util.Log;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
@ -140,16 +141,13 @@ public class RNFirebaseMessaging extends ReactContextBaseJavaModule {
}
@ReactMethod
public void getToken(final Callback callback) {
public void getToken(final Promise promise) {
try {
String token = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Firebase token: " + token);
callback.invoke(null, token);
promise.resolve(token);
} catch (Exception e) {
WritableMap error = Arguments.createMap();
error.putString("message", e.getMessage());
callback.invoke(error);
promise.reject("messaging/unknown", e.getMessage(), e);
}
}

View File

@ -12,18 +12,18 @@
+ (UILocalNotification *)UILocalNotification:(id)json
{
NSDictionary<NSString *, id> *details = [self NSDictionary:json];
UILocalNotification *notification = [UILocalNotification new];
notification.fireDate = [RCTConvert NSDate:details[@"fireDate"]] ?: [NSDate date];
notification.alertBody = [RCTConvert NSString:details[@"alertBody"]];
notification.alertAction = [RCTConvert NSString:details[@"alertAction"]];
notification.soundName = [RCTConvert NSString:details[@"soundName"]] ?: UILocalNotificationDefaultSoundName;
notification.userInfo = [RCTConvert NSDictionary:details[@"userInfo"]];
notification.category = [RCTConvert NSString:details[@"category"]];
if (details[@"applicationIconBadgeNumber"]) {
notification.applicationIconBadgeNumber = [RCTConvert NSInteger:details[@"applicationIconBadgeNumber"]];
}
return notification;
NSDictionary<NSString *, id> *details = [self NSDictionary:json];
UILocalNotification *notification = [UILocalNotification new];
notification.fireDate = [RCTConvert NSDate:details[@"fireDate"]] ?: [NSDate date];
notification.alertBody = [RCTConvert NSString:details[@"alertBody"]];
notification.alertAction = [RCTConvert NSString:details[@"alertAction"]];
notification.soundName = [RCTConvert NSString:details[@"soundName"]] ?: UILocalNotificationDefaultSoundName;
notification.userInfo = [RCTConvert NSDictionary:details[@"userInfo"]];
notification.category = [RCTConvert NSString:details[@"category"]];
if (details[@"applicationIconBadgeNumber"]) {
notification.applicationIconBadgeNumber = [RCTConvert NSInteger:details[@"applicationIconBadgeNumber"]];
}
return notification;
}
@end
@ -33,209 +33,204 @@
// https://github.com/facebook/react-native/blob/master/Libraries/PushNotificationIOS/RCTPushNotificationManager.m
static NSDictionary *RCTFormatLocalNotification(UILocalNotification *notification)
{
NSMutableDictionary *formattedLocalNotification = [NSMutableDictionary dictionary];
if (notification.fireDate) {
NSDateFormatter *formatter = [NSDateFormatter new];
[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"];
NSString *fireDateString = [formatter stringFromDate:notification.fireDate];
formattedLocalNotification[@"fireDate"] = fireDateString;
}
formattedLocalNotification[@"alertAction"] = RCTNullIfNil(notification.alertAction);
formattedLocalNotification[@"alertBody"] = RCTNullIfNil(notification.alertBody);
formattedLocalNotification[@"applicationIconBadgeNumber"] = @(notification.applicationIconBadgeNumber);
formattedLocalNotification[@"category"] = RCTNullIfNil(notification.category);
formattedLocalNotification[@"soundName"] = RCTNullIfNil(notification.soundName);
formattedLocalNotification[@"userInfo"] = RCTNullIfNil(RCTJSONClean(notification.userInfo));
formattedLocalNotification[@"remote"] = @NO;
return formattedLocalNotification;
NSMutableDictionary *formattedLocalNotification = [NSMutableDictionary dictionary];
if (notification.fireDate) {
NSDateFormatter *formatter = [NSDateFormatter new];
[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"];
NSString *fireDateString = [formatter stringFromDate:notification.fireDate];
formattedLocalNotification[@"fireDate"] = fireDateString;
}
formattedLocalNotification[@"alertAction"] = RCTNullIfNil(notification.alertAction);
formattedLocalNotification[@"alertBody"] = RCTNullIfNil(notification.alertBody);
formattedLocalNotification[@"applicationIconBadgeNumber"] = @(notification.applicationIconBadgeNumber);
formattedLocalNotification[@"category"] = RCTNullIfNil(notification.category);
formattedLocalNotification[@"soundName"] = RCTNullIfNil(notification.soundName);
formattedLocalNotification[@"userInfo"] = RCTNullIfNil(RCTJSONClean(notification.userInfo));
formattedLocalNotification[@"remote"] = @NO;
return formattedLocalNotification;
}
- (void) dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver: self];
[[NSNotificationCenter defaultCenter] removeObserver: self];
}
+ (void) setup:(UIApplication *) application
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(connectToFirebase)
name: UIApplicationDidEnterBackgroundNotification
object: nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(disconnectFromFirebase)
name: UIApplicationDidBecomeActiveNotification
object: nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleRemoteNotificationReceived:)
name:MESSAGING_MESSAGE_RECEIVED_REMOTE
object: nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleLocalNotificationReceived:)
name:MESSAGING_MESSAGE_RECEIVED_LOCAL
object: nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleTokenRefresh)
name:kFIRInstanceIDTokenRefreshNotification
object: nil];
if (SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(@"9.0")) {
UIUserNotificationType allNotificationTypes =
(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge);
UIUserNotificationSettings *settings =
[UIUserNotificationSettings settingsForTypes:allNotificationTypes categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
} else {
// iOS 10 or later
#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
UNAuthorizationOptions authOptions =
UNAuthorizationOptionAlert
| UNAuthorizationOptionSound
| UNAuthorizationOptionBadge;
[[UNUserNotificationCenter currentNotificationCenter]
requestAuthorizationWithOptions:authOptions
completionHandler:^(BOOL granted, NSError * _Nullable error) {
}
];
// For iOS 10 display notification (sent via APNS)
[[UNUserNotificationCenter currentNotificationCenter] setDelegate:self];
// For iOS 10 data message (sent via FCM)
[[FIRMessaging messaging] setRemoteMessageDelegate:self];
#endif
}
[[UIApplication sharedApplication] registerForRemoteNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(connectToFirebase)
name: UIApplicationDidEnterBackgroundNotification
object: nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(disconnectFromFirebase)
name: UIApplicationDidBecomeActiveNotification
object: nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleRemoteNotificationReceived:)
name:MESSAGING_MESSAGE_RECEIVED_REMOTE
object: nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleLocalNotificationReceived:)
name:MESSAGING_MESSAGE_RECEIVED_LOCAL
object: nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleTokenRefresh)
name:kFIRInstanceIDTokenRefreshNotification
object: nil];
if (SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(@"9.0")) {
UIUserNotificationType allNotificationTypes =
(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge);
UIUserNotificationSettings *settings =
[UIUserNotificationSettings settingsForTypes:allNotificationTypes categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
} else {
// iOS 10 or later
#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
UNAuthorizationOptions authOptions =
UNAuthorizationOptionAlert
| UNAuthorizationOptionSound
| UNAuthorizationOptionBadge;
[[UNUserNotificationCenter currentNotificationCenter]
requestAuthorizationWithOptions:authOptions
completionHandler:^(BOOL granted, NSError * _Nullable error) {
}
];
// For iOS 10 display notification (sent via APNS)
[[UNUserNotificationCenter currentNotificationCenter] setDelegate:self];
// For iOS 10 data message (sent via FCM)
[[FIRMessaging messaging] setRemoteMessageDelegate:self];
#endif
}
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
#pragma mark callbacks
- (void) connectToFirebase
{
[[FIRMessaging messaging] connectWithCompletion:^(NSError *error) {
NSDictionary *evt;
NSString *evtName;
if (error != nil) {
NSLog(@"Error connecting: %@", [error debugDescription]);
evtName = MESSAGING_SUBSYSTEM_ERROR;
evt = @{
@"eventName": MESSAGING_SUBSYSTEM_ERROR,
@"msg": [error debugDescription]
};
} else {
NSLog(@"Connected to Firebase messaging");
evtName = MESSAGING_SUBSYSTEM_EVENT;
evt = @{
@"result": @"connected"
};
[self
sendJSEvent:evtName
props: evt];
}
}];
[[FIRMessaging messaging] connectWithCompletion:^(NSError *error) {
NSDictionary *evt;
NSString *evtName;
if (error != nil) {
NSLog(@"Error connecting: %@", [error debugDescription]);
evtName = MESSAGING_SUBSYSTEM_ERROR;
evt = @{
@"eventName": MESSAGING_SUBSYSTEM_ERROR,
@"msg": [error debugDescription]
};
} else {
NSLog(@"Connected to Firebase messaging");
evtName = MESSAGING_SUBSYSTEM_EVENT;
evt = @{
@"result": @"connected"
};
[self
sendJSEvent:evtName
props: evt];
}
}];
}
- (void) disconnectFromFirebase
{
[[FIRMessaging messaging] disconnect];
NSLog(@"Disconnect from Firebase");
[self
[[FIRMessaging messaging] disconnect];
NSLog(@"Disconnect from Firebase");
[self
sendJSEvent:MESSAGING_SUBSYSTEM_EVENT
props: @{
@"status": @"disconnected"
}];
@"status": @"disconnected"
}];
}
- (void) handleRemoteNotificationReceived:(NSNotification *) n
{
NSMutableDictionary *props = [[NSMutableDictionary alloc] initWithDictionary: n.userInfo];
[self sendJSEvent:MESSAGING_MESSAGE_RECEIVED_REMOTE props: props];
NSMutableDictionary *props = [[NSMutableDictionary alloc] initWithDictionary: n.userInfo];
[self sendJSEvent:MESSAGING_MESSAGE_RECEIVED_REMOTE props: props];
}
- (void) handleLocalNotificationReceived:(NSNotification *) n
{
NSMutableDictionary *props = [[NSMutableDictionary alloc] initWithDictionary: n.userInfo];
[self sendJSEvent:MESSAGING_MESSAGE_RECEIVED_LOCAL props: props];
NSMutableDictionary *props = [[NSMutableDictionary alloc] initWithDictionary: n.userInfo];
[self sendJSEvent:MESSAGING_MESSAGE_RECEIVED_LOCAL props: props];
}
- (void) handleTokenRefresh
{
NSDictionary *props = @{
@"status": @"token_refreshed",
@"token": [[FIRInstanceID instanceID] token]
};
[self sendJSEvent:MESSAGING_TOKEN_REFRESH props: props];
NSDictionary *props = @{
@"status": @"token_refreshed",
@"token": [[FIRInstanceID instanceID] token]
};
[self sendJSEvent:MESSAGING_TOKEN_REFRESH props: props];
}
RCT_EXPORT_MODULE(RNFirebaseMessaging);
RCT_EXPORT_METHOD(getToken:(RCTResponseSenderBlock)callback)
{
NSString *token = [[FIRInstanceID instanceID] token];
callback(@[[NSNull null], @{
@"status": @"success",
@"token": token
}]);
RCT_EXPORT_METHOD(getToken:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject) {
NSString *token = [[FIRInstanceID instanceID] token];
resolve(token);
}
RCT_EXPORT_METHOD(sendLocal:(UILocalNotification *)notification
callback:(RCTResponseSenderBlock) callback)
callback:(RCTResponseSenderBlock) callback)
{
NSLog(@"sendLocal called with notification: %@", notification);
[RCTSharedApplication() presentLocalNotificationNow:notification];
NSLog(@"sendLocal called with notification: %@", notification);
[RCTSharedApplication() presentLocalNotificationNow:notification];
}
RCT_EXPORT_METHOD(scheduleLocal:(UILocalNotification *)notification
callback:(RCTResponseSenderBlock) callback)
callback:(RCTResponseSenderBlock) callback)
{
[RCTSharedApplication() scheduleLocalNotification:notification];
[RCTSharedApplication() scheduleLocalNotification:notification];
}
RCT_EXPORT_METHOD(cancelAllLocalNotifications)
{
[RCTSharedApplication() cancelAllLocalNotifications];
[RCTSharedApplication() cancelAllLocalNotifications];
}
RCT_EXPORT_METHOD(cancelLocalNotifications:(NSDictionary<NSString *, id> *)userInfo)
{
for (UILocalNotification *notification in [UIApplication sharedApplication].scheduledLocalNotifications) {
__block BOOL matchesAll = YES;
NSDictionary<NSString *, id> *notificationInfo = notification.userInfo;
// Note: we do this with a loop instead of just `isEqualToDictionary:`
// because we only require that all specified userInfo values match the
// notificationInfo values - notificationInfo may contain additional values
// which we don't care about.
[userInfo enumerateKeysAndObjectsUsingBlock:^(NSString *key, id obj, BOOL *stop) {
if (![notificationInfo[key] isEqual:obj]) {
matchesAll = NO;
*stop = YES;
}
}];
if (matchesAll) {
[[UIApplication sharedApplication] cancelLocalNotification:notification];
for (UILocalNotification *notification in [UIApplication sharedApplication].scheduledLocalNotifications) {
__block BOOL matchesAll = YES;
NSDictionary<NSString *, id> *notificationInfo = notification.userInfo;
// Note: we do this with a loop instead of just `isEqualToDictionary:`
// because we only require that all specified userInfo values match the
// notificationInfo values - notificationInfo may contain additional values
// which we don't care about.
[userInfo enumerateKeysAndObjectsUsingBlock:^(NSString *key, id obj, BOOL *stop) {
if (![notificationInfo[key] isEqual:obj]) {
matchesAll = NO;
*stop = YES;
}
}];
if (matchesAll) {
[[UIApplication sharedApplication] cancelLocalNotification:notification];
}
}
}
}
RCT_EXPORT_METHOD(sendRemote:(UILocalNotification *)notification
callback:(RCTResponseSenderBlock) callback)
callback:(RCTResponseSenderBlock) callback)
{
}
RCT_EXPORT_METHOD(send:(NSString *) senderId
messageId:(NSString *) messageId
messageType:(NSString *) messageType
msg: (NSString *) msg
callback:(RCTResponseSenderBlock)callback)
messageId:(NSString *) messageId
messageType:(NSString *) messageType
msg: (NSString *) msg
callback:(RCTResponseSenderBlock)callback)
{
}
RCT_EXPORT_METHOD(listenForTokenRefresh:(RCTResponseSenderBlock)callback)
@ -245,41 +240,41 @@ RCT_EXPORT_METHOD(unlistenForTokenRefresh:(RCTResponseSenderBlock)callback)
{}
RCT_EXPORT_METHOD(subscribeToTopic:(NSString *) topic
callback:(RCTResponseSenderBlock)callback)
callback:(RCTResponseSenderBlock)callback)
{
[[FIRMessaging messaging] subscribeToTopic:topic];
callback(@[[NSNull null], @{
@"result": @"success",
@"topic": topic
}]);
[[FIRMessaging messaging] subscribeToTopic:topic];
callback(@[[NSNull null], @{
@"result": @"success",
@"topic": topic
}]);
}
RCT_EXPORT_METHOD(unsubscribeFromTopic:(NSString *) topic
callback: (RCTResponseSenderBlock)callback)
callback: (RCTResponseSenderBlock)callback)
{
[[FIRMessaging messaging] unsubscribeFromTopic:topic];
callback(@[[NSNull null], @{
@"result": @"success",
@"topic": topic
}]);
[[FIRMessaging messaging] unsubscribeFromTopic:topic];
callback(@[[NSNull null], @{
@"result": @"success",
@"topic": topic
}]);
}
RCT_EXPORT_METHOD(setBadge:(NSInteger) number
callback:(RCTResponseSenderBlock) callback)
callback:(RCTResponseSenderBlock) callback)
{
RCTSharedApplication().applicationIconBadgeNumber = number;
callback(@[[NSNull null], @{
@"result": @"success",
@"number": @(number)
}]);
RCTSharedApplication().applicationIconBadgeNumber = number;
callback(@[[NSNull null], @{
@"result": @"success",
@"number": @(number)
}]);
}
RCT_EXPORT_METHOD(getBadge:(RCTResponseSenderBlock) callback)
{
callback(@[[NSNull null], @{
@"result": @"success",
@"number": @(RCTSharedApplication().applicationIconBadgeNumber)
}]);
callback(@[[NSNull null], @{
@"result": @"success",
@"number": @(RCTSharedApplication().applicationIconBadgeNumber)
}]);
}
RCT_EXPORT_METHOD(listenForReceiveNotification:(RCTResponseSenderBlock)callback)
@ -297,11 +292,11 @@ RCT_EXPORT_METHOD(unlistenForReceiveUpstreamSend:(RCTResponseSenderBlock)callbac
// Not sure how to get away from this... yet
- (NSArray<NSString *> *)supportedEvents {
return @[
MESSAGING_SUBSYSTEM_EVENT,
MESSAGING_SUBSYSTEM_ERROR,
MESSAGING_TOKEN_REFRESH,
MESSAGING_MESSAGE_RECEIVED_LOCAL,
MESSAGING_MESSAGE_RECEIVED_REMOTE];
MESSAGING_SUBSYSTEM_EVENT,
MESSAGING_SUBSYSTEM_ERROR,
MESSAGING_TOKEN_REFRESH,
MESSAGING_MESSAGE_RECEIVED_LOCAL,
MESSAGING_MESSAGE_RECEIVED_REMOTE];
}
- (void) sendJSEvent:(NSString *)title
@ -310,9 +305,9 @@ RCT_EXPORT_METHOD(unlistenForReceiveUpstreamSend:(RCTResponseSenderBlock)callbac
@try {
[self sendEventWithName:title
body:@{
@"eventName": title,
@"body": props
}];
@"eventName": title,
@"body": props
}];
}
@catch (NSException *err) {
NSLog(@"An error occurred in sendJSEvent: %@", [err debugDescription]);

View File

@ -44,8 +44,7 @@ export default class Messaging extends Base {
}
getToken() {
this.log.info('getToken for cloudMessaging');
return promisify('getToken', FirebaseMessaging)();
return FirebaseMessaging.getToken();
}
send(remoteMessage: RemoteMessage) {

View File

@ -5,7 +5,6 @@
"description": "A react native firebase library supporting both android and ios native firebase SDK's",
"main": "index",
"scripts": {
"start": "node node_modules/react-native/local-cli/cli.js start",
"build": "./node_modules/.bin/babel --source-maps=true --out-dir=dist .",
"dev": "npm run compile -- --watch",
"lint": "eslint ./src",