RNFIRMessaging.m 19.5 KB
Newer Older
1
#import "RNFIRMessaging.h"
Libin Lu's avatar
init  
Libin Lu committed
2

Libin Lu's avatar
Libin Lu committed
3 4
#import <React/RCTConvert.h>
#import <React/RCTUtils.h>
Libin Lu's avatar
init  
Libin Lu committed
5

Libin Lu's avatar
Libin Lu committed
6 7
@import UserNotifications;

Libin Lu's avatar
init  
Libin Lu committed
8 9 10 11 12 13 14 15 16 17 18
#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

NSString *const FCMNotificationReceived = @"FCMNotificationReceived";
Libin Lu's avatar
Libin Lu committed
19 20
NSString *const FCMTokenRefreshed = @"FCMTokenRefreshed";
NSString *const FCMDirectChannelConnectionChanged = @"FCMDirectChannelConnectionChanged";
Libin Lu's avatar
init  
Libin Lu committed
21

Libin Lu's avatar
Libin Lu committed
22 23
@implementation RCTConvert (NSCalendarUnit)

Libin Lu's avatar
Libin Lu committed
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
RCT_ENUM_CONVERTER(NSCalendarUnit,
                   (@{
                      @"year": @(NSCalendarUnitYear),
                      @"month": @(NSCalendarUnitMonth),
                      @"week": @(NSCalendarUnitWeekOfYear),
                      @"day": @(NSCalendarUnitDay),
                      @"hour": @(NSCalendarUnitHour),
                      @"minute": @(NSCalendarUnitMinute)
                      }),
                   0,
                   integerValue)
@end


@implementation RCTConvert (UNNotificationRequest)

+ (UNNotificationRequest *)UNNotificationRequest:(id)json
Libin Lu's avatar
Libin Lu committed
41
{
Libin Lu's avatar
Libin Lu committed
42 43 44 45
  NSDictionary<NSString *, id> *details = [self NSDictionary:json];
  UNMutableNotificationContent *content = [UNMutableNotificationContent new];
  content.title =[RCTConvert NSString:details[@"title"]];
  content.body =[RCTConvert NSString:details[@"body"]];
Libin Lu's avatar
Libin Lu committed
46 47 48 49 50 51
  NSString* sound = [RCTConvert NSString:details[@"sound"]];
  if(sound != nil){
    content.sound = [UNNotificationSound soundNamed:sound];
  }else{
    content.sound = [UNNotificationSound defaultSound];
  }
Libin Lu's avatar
Libin Lu committed
52 53 54 55
  content.categoryIdentifier = [RCTConvert NSString:details[@"click_action"]];
  content.userInfo = details;
  content.badge = [RCTConvert NSNumber:details[@"badge"]];
  
Libin Lu's avatar
Libin Lu committed
56 57 58 59 60 61
  NSDate *fireDate = [RCTConvert NSDate:details[@"fire_date"]];
  
  if(fireDate == nil){
    return [UNNotificationRequest requestWithIdentifier:[RCTConvert NSString:details[@"id"]] content:content trigger:nil];
  }
  
Libin Lu's avatar
Libin Lu committed
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
  NSCalendarUnit interval = [RCTConvert NSCalendarUnit:details[@"repeat_interval"]];
  NSCalendarUnit unitFlags;
  switch (interval) {
    case NSCalendarUnitMinute: {
      unitFlags = NSCalendarUnitSecond;
      break;
    }
    case NSCalendarUnitHour: {
      unitFlags = NSCalendarUnitMinute | NSCalendarUnitSecond;
      break;
    }
    case NSCalendarUnitDay: {
      unitFlags = NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
      break;
    }
    case NSCalendarUnitWeekOfYear: {
      unitFlags = NSCalendarUnitWeekday | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
      break;
    }
    case NSCalendarUnitMonth:{
      unitFlags = NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
    }
    case NSCalendarUnitYear:{
      unitFlags = NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
    }
    default:
      unitFlags = NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
      break;
Libin Lu's avatar
Libin Lu committed
90
  }
Libin Lu's avatar
Libin Lu committed
91 92 93
  NSDateComponents *components = [[NSCalendar currentCalendar] components:unitFlags fromDate:fireDate];
  UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:components repeats:interval != 0];
  return [UNNotificationRequest requestWithIdentifier:[RCTConvert NSString:details[@"id"]] content:content trigger:trigger];
Libin Lu's avatar
Libin Lu committed
94 95 96 97 98 99 100 101 102 103 104
}

@end

@implementation RCTConvert (UILocalNotification)

+ (UILocalNotification *)UILocalNotification:(id)json
{
  NSDictionary<NSString *, id> *details = [self NSDictionary:json];
  UILocalNotification *notification = [UILocalNotification new];
  notification.fireDate = [RCTConvert NSDate:details[@"fire_date"]] ?: [NSDate date];
Libin Lu's avatar
Libin Lu committed
105 106 107
  if([notification respondsToSelector:@selector(setAlertTitle:)]){
    [notification setAlertTitle:[RCTConvert NSString:details[@"title"]]];
  }
Libin Lu's avatar
Libin Lu committed
108 109 110 111 112 113 114 115 116
  notification.alertBody = [RCTConvert NSString:details[@"body"]];
  notification.alertAction = [RCTConvert NSString:details[@"alert_action"]];
  notification.soundName = [RCTConvert NSString:details[@"sound"]] ?: UILocalNotificationDefaultSoundName;
  notification.userInfo = details;
  notification.category = [RCTConvert NSString:details[@"click_action"]];
  notification.repeatInterval = [RCTConvert NSCalendarUnit:details[@"repeat_interval"]];
  notification.applicationIconBadgeNumber = [RCTConvert NSInteger:details[@"badge"]];
  return notification;
}
Libin Lu's avatar
Libin Lu committed
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131

RCT_ENUM_CONVERTER(UIBackgroundFetchResult, (@{
                                               @"UIBackgroundFetchResultNewData": @(UIBackgroundFetchResultNewData),
                                               @"UIBackgroundFetchResultNoData": @(UIBackgroundFetchResultNoData),
                                               @"UIBackgroundFetchResultFailed": @(UIBackgroundFetchResultFailed),
                                               }), UIBackgroundFetchResultNoData, integerValue)

RCT_ENUM_CONVERTER(UNNotificationPresentationOptions, (@{
                                               @"UNNotificationPresentationOptionAll": @(UNNotificationPresentationOptionAlert | UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound),
                                               @"UNNotificationPresentationOptionNone": @(UNNotificationPresentationOptionNone)}), UIBackgroundFetchResultNoData, integerValue)

@end

@interface RNFIRMessaging ()
  @property (nonatomic, strong) NSMutableDictionary *notificationCallbacks;
Libin Lu's avatar
Libin Lu committed
132
@end
Libin Lu's avatar
init  
Libin Lu committed
133

134
@implementation RNFIRMessaging
Libin Lu's avatar
init  
Libin Lu committed
135 136

@synthesize bridge = _bridge;
Libin Lu's avatar
Libin Lu committed
137
RCT_EXPORT_MODULE();
Libin Lu's avatar
init  
Libin Lu committed
138

Libin Lu's avatar
Libin Lu committed
139 140 141 142
- (NSArray<NSString *> *)supportedEvents {
  return @[FCMNotificationReceived, FCMTokenRefreshed, FCMDirectChannelConnectionChanged];
}

Libin Lu's avatar
Libin Lu committed
143
+ (void)didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo fetchCompletionHandler:(nonnull RCTRemoteNotificationCallback)completionHandler {
Libin Lu's avatar
Libin Lu committed
144
  NSMutableDictionary* data = [[NSMutableDictionary alloc] initWithDictionary: userInfo];
Libin Lu's avatar
Libin Lu committed
145
  [data setValue:@"remote_notification" forKey:@"_notificationType"];
Libin Lu's avatar
Libin Lu committed
146 147 148 149 150 151
  [data setValue:@(RCTSharedApplication().applicationState == UIApplicationStateInactive) forKey:@"opened_from_tray"];
  [[NSNotificationCenter defaultCenter] postNotificationName:FCMNotificationReceived object:self userInfo:@{@"data": data, @"completionHandler": completionHandler}];
}

+ (void)didReceiveLocalNotification:(UILocalNotification *)notification {
  NSMutableDictionary* data = [[NSMutableDictionary alloc] initWithDictionary: notification.userInfo];
Libin Lu's avatar
Libin Lu committed
152
  [data setValue:@"local_notification" forKey:@"_notificationType"];
Libin Lu's avatar
Libin Lu committed
153
  [[NSNotificationCenter defaultCenter] postNotificationName:FCMNotificationReceived object:self userInfo:@{@"data": data}];
Libin Lu's avatar
Libin Lu committed
154 155
}

Libin Lu's avatar
Libin Lu committed
156
+ (void)didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(nonnull RCTNotificationResponseCallback)completionHandler
Libin Lu's avatar
Libin Lu committed
157 158
{
  NSMutableDictionary* data = [[NSMutableDictionary alloc] initWithDictionary: response.notification.request.content.userInfo];
Libin Lu's avatar
Libin Lu committed
159
  [data setValue:@"notification_response" forKey:@"_notificationType"];
Libin Lu's avatar
Libin Lu committed
160
  [data setValue:@YES forKey:@"opened_from_tray"];
161 162 163
  if (response.actionIdentifier) {
      [data setValue:response.actionIdentifier forKey:@"_actionIdentifier"];
  }
Libin Lu's avatar
Libin Lu committed
164 165 166
  [[NSNotificationCenter defaultCenter] postNotificationName:FCMNotificationReceived object:self userInfo:@{@"data": data, @"completionHandler": completionHandler}];
}

Libin Lu's avatar
Libin Lu committed
167
+ (void)willPresentNotification:(UNNotification *)notification withCompletionHandler:(nonnull RCTWillPresentNotificationCallback)completionHandler
Libin Lu's avatar
Libin Lu committed
168 169
{
  NSMutableDictionary* data = [[NSMutableDictionary alloc] initWithDictionary: notification.request.content.userInfo];
Libin Lu's avatar
Libin Lu committed
170
  [data setValue:@"will_present_notification" forKey:@"_notificationType"];
Libin Lu's avatar
Libin Lu committed
171 172 173
  [[NSNotificationCenter defaultCenter] postNotificationName:FCMNotificationReceived object:self userInfo:@{@"data": data, @"completionHandler": completionHandler}];
}

Libin Lu's avatar
init  
Libin Lu committed
174 175 176 177 178
- (void)dealloc
{
  [[NSNotificationCenter defaultCenter] removeObserver:self];
}

Libin Lu's avatar
Libin Lu committed
179 180
- (instancetype)init {
  self = [super init];
Libin Lu's avatar
init  
Libin Lu committed
181
  [[NSNotificationCenter defaultCenter] addObserver:self
Libin Lu's avatar
Libin Lu committed
182
                                           selector:@selector(handleNotificationReceived:)
Libin Lu's avatar
init  
Libin Lu committed
183 184 185
                                               name:FCMNotificationReceived
                                             object:nil];
  
186
  [[NSNotificationCenter defaultCenter]
Libin Lu's avatar
Libin Lu committed
187 188 189
   addObserver:self selector:@selector(sendDataMessageFailure:)
   name:FIRMessagingSendErrorNotification object:nil];
  
190
  [[NSNotificationCenter defaultCenter]
Libin Lu's avatar
Libin Lu committed
191 192
   addObserver:self selector:@selector(sendDataMessageSuccess:)
   name:FIRMessagingSendSuccessNotification object:nil];
Libin Lu's avatar
Libin Lu committed
193
  
Libin Lu's avatar
Libin Lu committed
194 195 196 197
  [[NSNotificationCenter defaultCenter]
   addObserver:self selector:@selector(connectionStateChanged:)
   name:FIRMessagingConnectionStateChangedNotification object:nil];
  
Libin Lu's avatar
Libin Lu committed
198
  // For iOS 10 data message (sent via FCM)
199
  dispatch_async(dispatch_get_main_queue(), ^{
Libin Lu's avatar
Libin Lu committed
200
    [[FIRMessaging messaging] setDelegate:self];
201
  });
Libin Lu's avatar
Libin Lu committed
202
  return self;
Libin Lu's avatar
init  
Libin Lu committed
203 204
}

Libin Lu's avatar
Libin Lu committed
205
RCT_EXPORT_METHOD(enableDirectChannel)
Libin Lu's avatar
init  
Libin Lu committed
206
{
Libin Lu's avatar
Libin Lu committed
207
  [[FIRMessaging messaging] setShouldEstablishDirectChannel:@YES];
Libin Lu's avatar
init  
Libin Lu committed
208 209
}

Libin Lu's avatar
Libin Lu committed
210
RCT_EXPORT_METHOD(isDirectChannelEstablished:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
Libin Lu's avatar
init  
Libin Lu committed
211
{
Libin Lu's avatar
Libin Lu committed
212
  resolve([[FIRMessaging messaging] isDirectChannelEstablished] ? @YES: @NO);
Libin Lu's avatar
init  
Libin Lu committed
213 214
}

Libin Lu's avatar
Libin Lu committed
215
RCT_EXPORT_METHOD(getInitialNotification:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
Libin Lu's avatar
Libin Lu committed
216
{
Libin Lu's avatar
Libin Lu committed
217 218 219
  UILocalNotification *localUserInfo = _bridge.launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];
  if (localUserInfo) {
    resolve([[localUserInfo userInfo] copy]);
Libin Lu's avatar
Libin Lu committed
220 221
  } else {
    resolve([_bridge.launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey] copy]);
Libin Lu's avatar
Libin Lu committed
222
  }
Libin Lu's avatar
Libin Lu committed
223 224
}

Libin Lu's avatar
Libin Lu committed
225
RCT_EXPORT_METHOD(getAPNSToken:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
Libin Lu's avatar
init  
Libin Lu committed
226
{
Libin Lu's avatar
Libin Lu committed
227
  resolve([FIRMessaging messaging].APNSToken);
Libin Lu's avatar
init  
Libin Lu committed
228 229
}

Libin Lu's avatar
Libin Lu committed
230
RCT_EXPORT_METHOD(getFCMToken:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
Libin Lu's avatar
init  
Libin Lu committed
231
{
Libin Lu's avatar
Libin Lu committed
232 233 234 235 236
  resolve([FIRMessaging messaging].FCMToken);
}

- (void)messaging:(nonnull FIRMessaging *)messaging didRefreshRegistrationToken:(nonnull NSString *)fcmToken {
  [self sendEventWithName:FCMTokenRefreshed body:fcmToken];
Libin Lu's avatar
init  
Libin Lu committed
237 238
}

Libin Lu's avatar
Libin Lu committed
239
RCT_EXPORT_METHOD(requestPermissions:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
Libin Lu's avatar
init  
Libin Lu committed
240
{
Libin Lu's avatar
Libin Lu committed
241 242 243
  if (RCTRunningInAppExtension()) {
    return;
  }
Libin Lu's avatar
Libin Lu committed
244 245 246 247 248 249 250 251 252 253
  if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) {
    UIUserNotificationType allNotificationTypes =
    (UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge);
    UIApplication *app = RCTSharedApplication();
    if ([app respondsToSelector:@selector(registerUserNotificationSettings:)]) {
      //iOS 8 or later
      UIUserNotificationSettings *notificationSettings =
      [UIUserNotificationSettings settingsForTypes:(NSUInteger)allNotificationTypes categories:nil];
      [app registerUserNotificationSettings:notificationSettings];
    }
Libin Lu's avatar
Libin Lu committed
254
  } else {
Libin Lu's avatar
Libin Lu committed
255 256 257 258 259 260 261 262 263
    // 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) {
Libin Lu's avatar
Libin Lu committed
264 265 266 267 268
       if(granted){
         resolve(nil);
       } else{
         reject(@"notification_error", @"Failed to grand permission", error);
       }
Libin Lu's avatar
Libin Lu committed
269 270 271
     }
     ];
#endif
Libin Lu's avatar
Libin Lu committed
272
  }
Libin Lu's avatar
Libin Lu committed
273 274 275 276
  
  [[UIApplication sharedApplication] registerForRemoteNotifications];
}

277 278 279 280 281 282 283 284 285 286
RCT_EXPORT_METHOD(subscribeToTopic: (NSString*) topic)
{
  [[FIRMessaging messaging] subscribeToTopic:topic];
}

RCT_EXPORT_METHOD(unsubscribeFromTopic: (NSString*) topic)
{
  [[FIRMessaging messaging] unsubscribeFromTopic:topic];
}

Libin Lu's avatar
Libin Lu committed
287 288
// Receive data message on iOS 10 devices.
- (void)applicationReceivedRemoteMessage:(FIRMessagingRemoteMessage *)remoteMessage {
Libin Lu's avatar
Libin Lu committed
289
  [self sendEventWithName:FCMNotificationReceived body:[remoteMessage appData]];
Libin Lu's avatar
Libin Lu committed
290 291
}

Libin Lu's avatar
Libin Lu committed
292
RCT_EXPORT_METHOD(presentLocalNotification:(id)data resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
Libin Lu's avatar
Libin Lu committed
293
{
Libin Lu's avatar
Libin Lu committed
294 295 296 297 298 299 300 301 302 303 304 305 306 307
  if([UNUserNotificationCenter currentNotificationCenter] != nil){
    UNNotificationRequest* request = [RCTConvert UNNotificationRequest:data];
    [[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
      if (!error) {
        resolve(nil);
      }else{
        reject(@"notification_error", @"Failed to present local notificaton", error);
      }
    }];
  }else{
    UILocalNotification* notif = [RCTConvert UILocalNotification:data];
    [RCTSharedApplication() presentLocalNotificationNow:notif];
    resolve(nil);
  }
Libin Lu's avatar
Libin Lu committed
308 309
}

Libin Lu's avatar
Libin Lu committed
310
RCT_EXPORT_METHOD(scheduleLocalNotification:(id)data resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
Libin Lu's avatar
Libin Lu committed
311
{
Libin Lu's avatar
Libin Lu committed
312 313 314 315 316 317 318 319 320 321 322 323 324 325
  if([UNUserNotificationCenter currentNotificationCenter] != nil){
    UNNotificationRequest* request = [RCTConvert UNNotificationRequest:data];
    [[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
      if (!error) {
        resolve(nil);
      }else{
        reject(@"notification_error", @"Failed to present local notificaton", error);
      }
    }];
  }else{
    UILocalNotification* notif = [RCTConvert UILocalNotification:data];
    [RCTSharedApplication() scheduleLocalNotification:notif];
    resolve(nil);
  }
Libin Lu's avatar
Libin Lu committed
326 327
}

Libin Lu's avatar
Libin Lu committed
328
RCT_EXPORT_METHOD(removeDeliveredNotification:(NSString*) notificationId)
Libin Lu's avatar
Libin Lu committed
329 330 331 332 333 334 335 336 337 338 339 340 341 342 343
{
  if([UNUserNotificationCenter currentNotificationCenter] != nil){
    [[UNUserNotificationCenter currentNotificationCenter] removeDeliveredNotificationsWithIdentifiers:@[notificationId]];
  }
}

RCT_EXPORT_METHOD(removeAllDeliveredNotifications)
{
  if([UNUserNotificationCenter currentNotificationCenter] != nil){
    [[UNUserNotificationCenter currentNotificationCenter] removeAllDeliveredNotifications];
  } else {
    [RCTSharedApplication() setApplicationIconBadgeNumber: 0];
  }
}

Libin Lu's avatar
Libin Lu committed
344 345
RCT_EXPORT_METHOD(cancelAllLocalNotifications)
{
Libin Lu's avatar
Libin Lu committed
346 347 348 349 350
  if([UNUserNotificationCenter currentNotificationCenter] != nil){
    [[UNUserNotificationCenter currentNotificationCenter] removeAllPendingNotificationRequests];
  } else {
    [RCTSharedApplication() cancelAllLocalNotifications];
  }
Libin Lu's avatar
Libin Lu committed
351 352 353 354
}

RCT_EXPORT_METHOD(cancelLocalNotification:(NSString*) notificationId)
{
Libin Lu's avatar
Libin Lu committed
355 356 357 358 359 360 361 362
  if([UNUserNotificationCenter currentNotificationCenter] != nil){
    [[UNUserNotificationCenter currentNotificationCenter] removePendingNotificationRequestsWithIdentifiers:@[notificationId]];
  }else {
    for (UILocalNotification *notification in [UIApplication sharedApplication].scheduledLocalNotifications) {
      NSDictionary<NSString *, id> *notificationInfo = notification.userInfo;
      if([notificationId isEqualToString:[notificationInfo valueForKey:@"id"]]){
        [[UIApplication sharedApplication] cancelLocalNotification:notification];
      }
Libin Lu's avatar
Libin Lu committed
363 364 365 366
    }
  }
}

Libin Lu's avatar
Libin Lu committed
367
RCT_EXPORT_METHOD(getScheduledLocalNotifications:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
Libin Lu's avatar
Libin Lu committed
368 369 370 371 372
{
  if([UNUserNotificationCenter currentNotificationCenter] != nil){
    [[UNUserNotificationCenter currentNotificationCenter] getPendingNotificationRequestsWithCompletionHandler:^(NSArray<UNNotificationRequest *> * _Nonnull requests) {
      NSMutableArray* list = [[NSMutableArray alloc] init];
      for(UNNotificationRequest * notif in requests){
Libin Lu's avatar
Libin Lu committed
373
        UNNotificationContent *content = notif.content;
Libin Lu's avatar
Libin Lu committed
374 375 376 377 378 379 380 381 382 383 384 385 386
        [list addObject:content.userInfo];
      }
      resolve(list);
    }];
  }else{
    NSMutableArray* list = [[NSMutableArray alloc] init];
    for(UILocalNotification * notif in [RCTSharedApplication() scheduledLocalNotifications]){
      [list addObject:notif.userInfo];
    }
    resolve(list);
  }
}

Libin Lu's avatar
Libin Lu committed
387 388
RCT_EXPORT_METHOD(setBadgeNumber: (NSInteger*) number)
{
Libin Lu's avatar
Libin Lu committed
389
  [RCTSharedApplication() setApplicationIconBadgeNumber:*number];
Libin Lu's avatar
Libin Lu committed
390 391
}

Libin Lu's avatar
Libin Lu committed
392
RCT_EXPORT_METHOD(getBadgeNumber: (RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
Libin Lu's avatar
Libin Lu committed
393 394 395 396
{
  resolve(@([RCTSharedApplication() applicationIconBadgeNumber]));
}

397 398 399 400 401 402 403
RCT_EXPORT_METHOD(send:(NSString*)senderId withPayload:(NSDictionary *)message)
{
  NSMutableDictionary * mMessage = [message mutableCopy];
  NSMutableDictionary * upstreamMessage = [[NSMutableDictionary alloc] init];
  for (NSString* key in mMessage) {
    upstreamMessage[key] = [NSString stringWithFormat:@"%@", [mMessage valueForKey:key]];
  }
Libin Lu's avatar
Libin Lu committed
404
  
405
  NSDictionary *imMessage = [NSDictionary dictionaryWithDictionary:upstreamMessage];
Libin Lu's avatar
Libin Lu committed
406
  
407 408
  int64_t ttl = 3600;
  NSString * receiver = [NSString stringWithFormat:@"%@@gcm.googleapis.com", senderId];
Libin Lu's avatar
Libin Lu committed
409
  
410 411
  NSUUID *uuid = [NSUUID UUID];
  NSString * messageID = [uuid UUIDString];
Libin Lu's avatar
Libin Lu committed
412
  
413 414 415
  [[FIRMessaging messaging]sendMessage:imMessage to:receiver withMessageID:messageID timeToLive:ttl];
}

Libin Lu's avatar
Libin Lu committed
416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445
RCT_EXPORT_METHOD(finishRemoteNotification: (NSString *)completionHandlerId fetchResult:(UIBackgroundFetchResult)result){
  RCTRemoteNotificationCallback completionHandler = self.notificationCallbacks[completionHandlerId];
  if (!completionHandler) {
    RCTLogError(@"There is no completion handler with completionHandlerId: %@", completionHandlerId);
    return;
  }
  completionHandler(result);
  [self.notificationCallbacks removeObjectForKey:completionHandlerId];
}

RCT_EXPORT_METHOD(finishWillPresentNotification: (NSString *)completionHandlerId fetchResult:(UNNotificationPresentationOptions)result){
  RCTWillPresentNotificationCallback completionHandler = self.notificationCallbacks[completionHandlerId];
  if (!completionHandler) {
    RCTLogError(@"There is no completion handler with completionHandlerId: %@", completionHandlerId);
    return;
  }
  completionHandler(result);
  [self.notificationCallbacks removeObjectForKey:completionHandlerId];
}

RCT_EXPORT_METHOD(finishNotificationResponse: (NSString *)completionHandlerId){
  RCTNotificationResponseCallback completionHandler = self.notificationCallbacks[completionHandlerId];
  if (!completionHandler) {
    RCTLogError(@"There is no completion handler with completionHandlerId: %@", completionHandlerId);
    return;
  }
  completionHandler();
  [self.notificationCallbacks removeObjectForKey:completionHandlerId];
}

Libin Lu's avatar
Libin Lu committed
446
- (void)handleNotificationReceived:(NSNotification *)notification
Libin Lu's avatar
init  
Libin Lu committed
447
{
Libin Lu's avatar
Libin Lu committed
448 449 450 451 452 453 454 455 456 457
  id completionHandler = notification.userInfo[@"completionHandler"];
  NSMutableDictionary* data = notification.userInfo[@"data"];
  if(completionHandler != nil){
    NSString *completionHandlerId = [[NSUUID UUID] UUIDString];
    if (!self.notificationCallbacks) {
      // Lazy initialization
      self.notificationCallbacks = [NSMutableDictionary dictionary];
    }
    self.notificationCallbacks[completionHandlerId] = completionHandler;
    data[@"_completionHandlerId"] = completionHandlerId;
Libin Lu's avatar
Libin Lu committed
458 459
  }
  
Libin Lu's avatar
Libin Lu committed
460
  [self sendEventWithName:FCMNotificationReceived body:data];
Libin Lu's avatar
Libin Lu committed
461
  
Libin Lu's avatar
init  
Libin Lu committed
462 463
}

Libin Lu's avatar
Libin Lu committed
464
- (void)sendDataMessageFailure:(NSNotification *)notification
465
{
Libin Lu's avatar
Libin Lu committed
466 467 468
  NSString *messageID = (NSString *)notification.userInfo[@"messageID"];
  
  NSLog(@"sendDataMessageFailure: %@", messageID);
469 470
}

Libin Lu's avatar
Libin Lu committed
471
- (void)sendDataMessageSuccess:(NSNotification *)notification
472
{
Libin Lu's avatar
Libin Lu committed
473 474 475
  NSString *messageID = (NSString *)notification.userInfo[@"messageID"];
  
  NSLog(@"sendDataMessageSuccess: %@", messageID);
476 477
}

Libin Lu's avatar
Libin Lu committed
478 479 480 481 482 483
- (void)connectionStateChanged:(NSNotification *)notification
{
  [self sendEventWithName:FCMDirectChannelConnectionChanged body:[FIRMessaging messaging].isDirectChannelEstablished ? @YES: @NO];
  NSLog(@"connectionStateChanged: %@", [FIRMessaging messaging].isDirectChannelEstablished ? @"connected": @"disconnected");
}

Libin Lu's avatar
init  
Libin Lu committed
484
@end