Commit 46a443b8 authored by Lidan Hifi's avatar Lidan Hifi

fix background queue for notification actions and background notifications

parent 3ae2bdaf
...@@ -124,15 +124,6 @@ RCT_EXPORT_MODULE() ...@@ -124,15 +124,6 @@ RCT_EXPORT_MODULE()
selector:@selector(handleNotificationActionTriggered:) selector:@selector(handleNotificationActionTriggered:)
name:RNNotificationActionTriggered name:RNNotificationActionTriggered
object:nil]; object:nil];
NSDictionary* lastActionInfo = [RNNotificationsBridgeQueue sharedInstance].lastAction;
if (lastActionInfo) {
[[NSNotificationCenter defaultCenter] postNotificationName:RNNotificationActionTriggered
object:self
userInfo:lastActionInfo];
[RNNotificationsBridgeQueue sharedInstance].lastAction = nil;
}
} }
/* /*
...@@ -220,9 +211,14 @@ RCT_EXPORT_MODULE() ...@@ -220,9 +211,14 @@ RCT_EXPORT_MODULE()
} }
} }
// if Js thread is ready- post notification to bridge. otherwise- post it to the bridge queue
if ([RNNotificationsBridgeQueue sharedInstance].jsIsReady == YES) {
[[NSNotificationCenter defaultCenter] postNotificationName:RNNotificationReceivedBackground [[NSNotificationCenter defaultCenter] postNotificationName:RNNotificationReceivedBackground
object:self object:self
userInfo:notification]; userInfo:notification];
} else {
[[RNNotificationsBridgeQueue sharedInstance] postNotification:notification];
}
} }
+ (void)didNotificationOpen:(NSDictionary *)notification + (void)didNotificationOpen:(NSDictionary *)notification
...@@ -300,17 +296,8 @@ RCT_EXPORT_MODULE() ...@@ -300,17 +296,8 @@ RCT_EXPORT_MODULE()
return [result copy]; return [result copy];
} }
+ (void)requestPermissionsWithCategories:(NSArray *)json + (void)requestPermissionsWithCategories:(NSMutableSet *)categories
{ {
NSMutableSet* categories = nil;
if ([json count] > 0) {
categories = [[NSMutableSet alloc] init];
for (NSDictionary* categoryJson in json) {
[categories addObject:[RCTConvert UIMutableUserNotificationCategory:categoryJson]];
}
}
UIUserNotificationType types = (UIUserNotificationType) (UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert); UIUserNotificationType types = (UIUserNotificationType) (UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert);
UIUserNotificationSettings* settings = [UIUserNotificationSettings settingsForTypes:types categories:categories]; UIUserNotificationSettings* settings = [UIUserNotificationSettings settingsForTypes:types categories:categories];
...@@ -319,7 +306,8 @@ RCT_EXPORT_MODULE() ...@@ -319,7 +306,8 @@ RCT_EXPORT_MODULE()
+ (void)emitNotificationActionForIdentifier:(NSString *)identifier responseInfo:(NSDictionary *)responseInfo userInfo:(NSDictionary *)userInfo completionHandler:(void (^)())completionHandler + (void)emitNotificationActionForIdentifier:(NSString *)identifier responseInfo:(NSDictionary *)responseInfo userInfo:(NSDictionary *)userInfo completionHandler:(void (^)())completionHandler
{ {
NSMutableDictionary* info = [[NSMutableDictionary alloc] initWithDictionary:@{ @"identifier": identifier }]; NSString* completionKey = [NSString stringWithFormat:@"%@.%@", identifier, [NSString stringWithFormat:@"%d", (long)[[NSDate date] timeIntervalSince1970]]];
NSMutableDictionary* info = [[NSMutableDictionary alloc] initWithDictionary:@{ @"identifier": identifier, @"completionKey": completionKey }];
// add text // add text
NSString* text = [responseInfo objectForKey:UIUserNotificationActionResponseTypedTextKey]; NSString* text = [responseInfo objectForKey:UIUserNotificationActionResponseTypedTextKey];
...@@ -332,13 +320,14 @@ RCT_EXPORT_MODULE() ...@@ -332,13 +320,14 @@ RCT_EXPORT_MODULE()
info[@"notification"] = userInfo; info[@"notification"] = userInfo;
} }
// Emit event // Emit event to the queue (in order to store the completion handler). if JS thread is ready, post it also to the notification center (to the bridge).
[[RNNotificationsBridgeQueue sharedInstance] postAction:info withCompletionKey:completionKey andCompletionHandler:completionHandler];
if ([RNNotificationsBridgeQueue sharedInstance].jsIsReady == YES) {
[[NSNotificationCenter defaultCenter] postNotificationName:RNNotificationActionTriggered [[NSNotificationCenter defaultCenter] postNotificationName:RNNotificationActionTriggered
object:self object:self
userInfo:info]; userInfo:info];
}
[RNNotificationsBridgeQueue sharedInstance].lastAction = info;
[RNNotificationsBridgeQueue sharedInstance].lastCompletionHandler = completionHandler;
} }
+ (void)registerPushKit + (void)registerPushKit
...@@ -401,7 +390,16 @@ RCT_EXPORT_MODULE() ...@@ -401,7 +390,16 @@ RCT_EXPORT_MODULE()
*/ */
RCT_EXPORT_METHOD(requestPermissionsWithCategories:(NSArray *)json) RCT_EXPORT_METHOD(requestPermissionsWithCategories:(NSArray *)json)
{ {
[RNNotifications requestPermissionsWithCategories:json]; NSMutableSet* categories = nil;
if ([json count] > 0) {
categories = [[NSMutableSet alloc] init];
for (NSDictionary* categoryJson in json) {
[categories addObject:[RCTConvert UIMutableUserNotificationCategory:categoryJson]];
}
}
[RNNotifications requestPermissionsWithCategories:categories];
} }
RCT_EXPORT_METHOD(log:(NSString *)message) RCT_EXPORT_METHOD(log:(NSString *)message)
...@@ -409,13 +407,9 @@ RCT_EXPORT_METHOD(log:(NSString *)message) ...@@ -409,13 +407,9 @@ RCT_EXPORT_METHOD(log:(NSString *)message)
NSLog(message); NSLog(message);
} }
RCT_EXPORT_METHOD(completionHandler) RCT_EXPORT_METHOD(completionHandler:(NSString *)completionKey)
{ {
void (^completionHandler)() = [RNNotificationsBridgeQueue sharedInstance].lastCompletionHandler; [[RNNotificationsBridgeQueue sharedInstance] completeAction:completionKey];
if (completionHandler) {
completionHandler();
[RNNotificationsBridgeQueue sharedInstance].lastCompletionHandler = nil;
}
} }
RCT_EXPORT_METHOD(abandonPermissions) RCT_EXPORT_METHOD(abandonPermissions)
...@@ -434,4 +428,21 @@ RCT_EXPORT_METHOD(backgroundTimeRemaining:(RCTResponseSenderBlock)callback) ...@@ -434,4 +428,21 @@ RCT_EXPORT_METHOD(backgroundTimeRemaining:(RCTResponseSenderBlock)callback)
callback(@[ [NSNumber numberWithDouble:remainingTime] ]); callback(@[ [NSNumber numberWithDouble:remainingTime] ]);
} }
RCT_EXPORT_METHOD(consumeBackgroundQueue)
{
[[RNNotificationsBridgeQueue sharedInstance] consumeActionsQueue:^(NSDictionary* action) {
[[NSNotificationCenter defaultCenter] postNotificationName:RNNotificationActionTriggered
object:self
userInfo:action];
}];
[[RNNotificationsBridgeQueue sharedInstance] consumeNotificationsQueue:^(NSDictionary* notification) {
[[NSNotificationCenter defaultCenter] postNotificationName:RNNotificationReceivedBackground
object:self
userInfo:notification];
}];
[RNNotificationsBridgeQueue sharedInstance].jsIsReady = YES;
}
@end @end
...@@ -2,9 +2,15 @@ ...@@ -2,9 +2,15 @@
@interface RNNotificationsBridgeQueue : NSObject @interface RNNotificationsBridgeQueue : NSObject
@property (nonatomic, retain) NSDictionary* lastAction; @property BOOL jsIsReady;
@property (nonatomic, copy) void (^lastCompletionHandler)();
+ (nonnull instancetype)sharedInstance; + (nonnull instancetype)sharedInstance;
- (void)postAction:(NSDictionary *)action withCompletionKey:(NSString *)completionKey andCompletionHandler:(void (^)())completionHandler;
- (void)postNotification:(NSDictionary *)notification;
- (void)consumeActionsQueue:(void (^)(NSDictionary *))block;
- (void)consumeNotificationsQueue:(void (^)(NSDictionary *))block;
- (void)completeAction:(NSString *)completionKey;
@end @end
\ No newline at end of file
...@@ -2,6 +2,10 @@ ...@@ -2,6 +2,10 @@
@implementation RNNotificationsBridgeQueue @implementation RNNotificationsBridgeQueue
NSMutableArray<NSDictionary *>* actionsQueue;
NSMutableArray<NSDictionary *>* backgroundNotificationsQueue;
NSMutableDictionary* actionCompletionHandlers;
+ (nonnull instancetype)sharedInstance { + (nonnull instancetype)sharedInstance {
static RNNotificationsBridgeQueue* sharedInstance = nil; static RNNotificationsBridgeQueue* sharedInstance = nil;
static dispatch_once_t onceToken; static dispatch_once_t onceToken;
...@@ -11,4 +15,81 @@ ...@@ -11,4 +15,81 @@
return sharedInstance; return sharedInstance;
} }
- (instancetype)init
{
actionsQueue = [NSMutableArray new];
backgroundNotificationsQueue = [NSMutableArray new];
actionCompletionHandlers = [NSMutableDictionary new];
self.jsIsReady = NO;
return self;
}
- (void)postNotification:(NSDictionary *)notification
{
if (!backgroundNotificationsQueue) return;
[backgroundNotificationsQueue insertObject:notification atIndex:0];
}
- (NSDictionary *)dequeueSingleNotification
{
if (!backgroundNotificationsQueue || backgroundNotificationsQueue.count == 0) return nil;
NSDictionary* notification = [backgroundNotificationsQueue lastObject];
[backgroundNotificationsQueue removeLastObject];
return notification;
}
- (void)consumeNotificationsQueue:(void (^)(NSDictionary *))block
{
NSDictionary* notification;
while ((notification = [self dequeueSingleNotification]) != nil) {
block(notification);
}
backgroundNotificationsQueue = nil;
}
- (void)postAction:(NSDictionary *)action withCompletionKey:(NSString *)completionKey andCompletionHandler:(void (^)())completionHandler
{
// store completion handler
actionCompletionHandlers[completionKey] = completionHandler;
if (!actionsQueue) return;
[actionsQueue insertObject:action atIndex:0];
}
- (NSDictionary *)dequeueSingleAction
{
if (!actionsQueue || actionsQueue.count == 0) return nil;
NSDictionary* action = [actionsQueue lastObject];
[actionsQueue removeLastObject];
return action;
}
- (void)consumeActionsQueue:(void (^)(NSDictionary *))block
{
NSDictionary* lastActionInfo;
while ((lastActionInfo = [self dequeueSingleAction]) != nil) {
block(lastActionInfo);
}
actionsQueue = nil;
}
- (void)completeAction:(NSString *)completionKey
{
void (^completionHandler)() = (void (^)())[actionCompletionHandlers valueForKey:completionKey];
if (completionHandler) {
completionHandler();
[actionCompletionHandlers removeObjectForKey:completionKey];
}
}
@end @end
\ No newline at end of file
...@@ -50,6 +50,8 @@ class NotificationsExampleApp extends Component { ...@@ -50,6 +50,8 @@ class NotificationsExampleApp extends Component {
NotificationsIOS.addEventListener('remoteNotificationsRegistered', this.onPushRegistered.bind(this)); NotificationsIOS.addEventListener('remoteNotificationsRegistered', this.onPushRegistered.bind(this));
NotificationsIOS.requestPermissions([cat]); NotificationsIOS.requestPermissions([cat]);
NotificationsIOS.consumeBackgroundQueue();
NotificationsIOS.addEventListener('pushKitRegistered', this.onPushKitRegistered.bind(this)); NotificationsIOS.addEventListener('pushKitRegistered', this.onPushKitRegistered.bind(this));
NotificationsIOS.registerPushKit(); NotificationsIOS.registerPushKit();
...@@ -73,8 +75,7 @@ class NotificationsExampleApp extends Component { ...@@ -73,8 +75,7 @@ class NotificationsExampleApp extends Component {
onNotificationReceivedBackground(notification) { onNotificationReceivedBackground(notification) {
NotificationsIOS.log("Notification Received Background: " + JSON.stringify(notification)); NotificationsIOS.log("Notification Received Background: " + JSON.stringify(notification));
NotificationsIOS.backgroundTimeRemaining(time => NotificationsIOS.log("remaining background time: " + time)); // NotificationsIOS.backgroundTimeRemaining(time => NotificationsIOS.log("remaining background time: " + time));
} }
onNotificationOpened(notification) { onNotificationOpened(notification) {
......
...@@ -17,14 +17,13 @@ ...@@ -17,14 +17,13 @@
139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; }; 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; };
146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; };
832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; };
D86588561CA2F4EF0076A9C8 /* libRCTPushNotification.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D86588551CA2F49C0076A9C8 /* libRCTPushNotification.a */; }; D85193341CCB6C8F008B3C99 /* libRNNotifications.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D85193331CCB6C82008B3C99 /* libRNNotifications.a */; };
D892FB7C1CB5AD7600B2CCF9 /* SmartNotificationsAppTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D892FB7B1CB5AD7600B2CCF9 /* SmartNotificationsAppTests.m */; }; D892FB7C1CB5AD7600B2CCF9 /* SmartNotificationsAppTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D892FB7B1CB5AD7600B2CCF9 /* SmartNotificationsAppTests.m */; };
D89EF3AC1CB586FE0029DCD6 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = D89EF3A71CB586FE0029DCD6 /* AppDelegate.m */; }; D89EF3AC1CB586FE0029DCD6 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = D89EF3A71CB586FE0029DCD6 /* AppDelegate.m */; };
D89EF3AD1CB586FE0029DCD6 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D89EF3A91CB586FE0029DCD6 /* Images.xcassets */; }; D89EF3AD1CB586FE0029DCD6 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D89EF3A91CB586FE0029DCD6 /* Images.xcassets */; };
D89EF3AE1CB586FE0029DCD6 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = D89EF3AA1CB586FE0029DCD6 /* Info.plist */; }; D89EF3AE1CB586FE0029DCD6 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = D89EF3AA1CB586FE0029DCD6 /* Info.plist */; };
D89EF3AF1CB586FE0029DCD6 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D89EF3AB1CB586FE0029DCD6 /* main.m */; }; D89EF3AF1CB586FE0029DCD6 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D89EF3AB1CB586FE0029DCD6 /* main.m */; };
D89EF3BE1CB5871B0029DCD6 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = D89EF3BC1CB5871B0029DCD6 /* LaunchScreen.xib */; }; D89EF3BE1CB5871B0029DCD6 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = D89EF3BC1CB5871B0029DCD6 /* LaunchScreen.xib */; };
D8CDE9D11CB588F000DC8E35 /* libRNNotifications.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D8CDE9D01CB588CF00DC8E35 /* libRNNotifications.a */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */ /* Begin PBXContainerItemProxy section */
...@@ -105,19 +104,19 @@ ...@@ -105,19 +104,19 @@
remoteGlobalIDString = 58B5119B1A9E6C1200147676; remoteGlobalIDString = 58B5119B1A9E6C1200147676;
remoteInfo = RCTText; remoteInfo = RCTText;
}; };
D86588541CA2F49C0076A9C8 /* PBXContainerItemProxy */ = { D85193321CCB6C82008B3C99 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy; isa = PBXContainerItemProxy;
containerPortal = D86588501CA2F49C0076A9C8 /* RCTPushNotification.xcodeproj */; containerPortal = D851932E1CCB6C82008B3C99 /* RNNotifications.xcodeproj */;
proxyType = 2; proxyType = 2;
remoteGlobalIDString = 134814201AA4EA6300B7C361; remoteGlobalIDString = 134814201AA4EA6300B7C361;
remoteInfo = RCTPushNotification; remoteInfo = RNNotifications;
}; };
D8CDE9CF1CB588CF00DC8E35 /* PBXContainerItemProxy */ = { D86588541CA2F49C0076A9C8 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy; isa = PBXContainerItemProxy;
containerPortal = D8CDE9CB1CB588CF00DC8E35 /* RNNotifications.xcodeproj */; containerPortal = D86588501CA2F49C0076A9C8 /* RCTPushNotification.xcodeproj */;
proxyType = 2; proxyType = 2;
remoteGlobalIDString = 134814201AA4EA6300B7C361; remoteGlobalIDString = 134814201AA4EA6300B7C361;
remoteInfo = RNNotifications; remoteInfo = RCTPushNotification;
}; };
/* End PBXContainerItemProxy section */ /* End PBXContainerItemProxy section */
...@@ -135,6 +134,7 @@ ...@@ -135,6 +134,7 @@
146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = "<group>"; }; 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = "<group>"; };
78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = "<group>"; }; 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = "<group>"; };
832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = "<group>"; }; 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = "<group>"; };
D851932E1CCB6C82008B3C99 /* RNNotifications.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RNNotifications.xcodeproj; path = ../../RNNotifications/RNNotifications.xcodeproj; sourceTree = "<group>"; };
D86588501CA2F49C0076A9C8 /* RCTPushNotification.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTPushNotification.xcodeproj; path = "../node_modules/react-native/Libraries/PushNotificationIOS/RCTPushNotification.xcodeproj"; sourceTree = "<group>"; }; D86588501CA2F49C0076A9C8 /* RCTPushNotification.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTPushNotification.xcodeproj; path = "../node_modules/react-native/Libraries/PushNotificationIOS/RCTPushNotification.xcodeproj"; sourceTree = "<group>"; };
D892FB7B1CB5AD7600B2CCF9 /* SmartNotificationsAppTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SmartNotificationsAppTests.m; sourceTree = "<group>"; }; D892FB7B1CB5AD7600B2CCF9 /* SmartNotificationsAppTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SmartNotificationsAppTests.m; sourceTree = "<group>"; };
D89EF3A71CB586FE0029DCD6 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = NotificationsExampleApp/AppDelegate.m; sourceTree = "<group>"; }; D89EF3A71CB586FE0029DCD6 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = NotificationsExampleApp/AppDelegate.m; sourceTree = "<group>"; };
...@@ -143,7 +143,6 @@ ...@@ -143,7 +143,6 @@
D89EF3AA1CB586FE0029DCD6 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = NotificationsExampleApp/Info.plist; sourceTree = "<group>"; }; D89EF3AA1CB586FE0029DCD6 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = NotificationsExampleApp/Info.plist; sourceTree = "<group>"; };
D89EF3AB1CB586FE0029DCD6 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = NotificationsExampleApp/main.m; sourceTree = "<group>"; }; D89EF3AB1CB586FE0029DCD6 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = NotificationsExampleApp/main.m; sourceTree = "<group>"; };
D89EF3BD1CB5871B0029DCD6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = NotificationsExampleApp/Base.lproj/LaunchScreen.xib; sourceTree = "<group>"; }; D89EF3BD1CB5871B0029DCD6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = NotificationsExampleApp/Base.lproj/LaunchScreen.xib; sourceTree = "<group>"; };
D8CDE9CB1CB588CF00DC8E35 /* RNNotifications.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RNNotifications.xcodeproj; path = "../node_modules/react-native-notifications/RNNotifications/RNNotifications.xcodeproj"; sourceTree = "<group>"; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
...@@ -158,8 +157,7 @@ ...@@ -158,8 +157,7 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
D8CDE9D11CB588F000DC8E35 /* libRNNotifications.a in Frameworks */, D85193341CCB6C8F008B3C99 /* libRNNotifications.a in Frameworks */,
D86588561CA2F4EF0076A9C8 /* libRCTPushNotification.a in Frameworks */,
146834051AC3E58100842450 /* libReact.a in Frameworks */, 146834051AC3E58100842450 /* libReact.a in Frameworks */,
00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */, 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */,
00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */, 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */,
...@@ -281,7 +279,7 @@ ...@@ -281,7 +279,7 @@
832341AE1AAA6A7D00B99B32 /* Libraries */ = { 832341AE1AAA6A7D00B99B32 /* Libraries */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
D8CDE9CB1CB588CF00DC8E35 /* RNNotifications.xcodeproj */, D851932E1CCB6C82008B3C99 /* RNNotifications.xcodeproj */,
D86588501CA2F49C0076A9C8 /* RCTPushNotification.xcodeproj */, D86588501CA2F49C0076A9C8 /* RCTPushNotification.xcodeproj */,
146833FF1AC3E56700842450 /* React.xcodeproj */, 146833FF1AC3E56700842450 /* React.xcodeproj */,
00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */, 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */,
...@@ -326,18 +324,18 @@ ...@@ -326,18 +324,18 @@
name = Products; name = Products;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
D86588511CA2F49C0076A9C8 /* Products */ = { D851932F1CCB6C82008B3C99 /* Products */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
D86588551CA2F49C0076A9C8 /* libRCTPushNotification.a */, D85193331CCB6C82008B3C99 /* libRNNotifications.a */,
); );
name = Products; name = Products;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
D8CDE9CC1CB588CF00DC8E35 /* Products */ = { D86588511CA2F49C0076A9C8 /* Products */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
D8CDE9D01CB588CF00DC8E35 /* libRNNotifications.a */, D86588551CA2F49C0076A9C8 /* libRCTPushNotification.a */,
); );
name = Products; name = Products;
sourceTree = "<group>"; sourceTree = "<group>";
...@@ -461,8 +459,8 @@ ...@@ -461,8 +459,8 @@
ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */; ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */;
}, },
{ {
ProductGroup = D8CDE9CC1CB588CF00DC8E35 /* Products */; ProductGroup = D851932F1CCB6C82008B3C99 /* Products */;
ProjectRef = D8CDE9CB1CB588CF00DC8E35 /* RNNotifications.xcodeproj */; ProjectRef = D851932E1CCB6C82008B3C99 /* RNNotifications.xcodeproj */;
}, },
); );
projectRoot = ""; projectRoot = "";
...@@ -544,18 +542,18 @@ ...@@ -544,18 +542,18 @@
remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */; remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR; sourceTree = BUILT_PRODUCTS_DIR;
}; };
D86588551CA2F49C0076A9C8 /* libRCTPushNotification.a */ = { D85193331CCB6C82008B3C99 /* libRNNotifications.a */ = {
isa = PBXReferenceProxy; isa = PBXReferenceProxy;
fileType = archive.ar; fileType = archive.ar;
path = libRCTPushNotification.a; path = libRNNotifications.a;
remoteRef = D86588541CA2F49C0076A9C8 /* PBXContainerItemProxy */; remoteRef = D85193321CCB6C82008B3C99 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR; sourceTree = BUILT_PRODUCTS_DIR;
}; };
D8CDE9D01CB588CF00DC8E35 /* libRNNotifications.a */ = { D86588551CA2F49C0076A9C8 /* libRCTPushNotification.a */ = {
isa = PBXReferenceProxy; isa = PBXReferenceProxy;
fileType = archive.ar; fileType = archive.ar;
path = libRNNotifications.a; path = libRCTPushNotification.a;
remoteRef = D8CDE9CF1CB588CF00DC8E35 /* PBXContainerItemProxy */; remoteRef = D86588541CA2F49C0076A9C8 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR; sourceTree = BUILT_PRODUCTS_DIR;
}; };
/* End PBXReferenceProxy section */ /* End PBXReferenceProxy section */
...@@ -686,8 +684,7 @@ ...@@ -686,8 +684,7 @@
"$(inherited)", "$(inherited)",
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
"$(SRCROOT)/../node_modules/react-native/React/**", "$(SRCROOT)/../node_modules/react-native/React/**",
"$(SRCROOT)/../node_modules/react-native/Libraries/PushNotificationIOS/**", "$(SRCROOT)/../../RNNotifications/**",
"$(SRCROOT)/../node_modules/react-native-notifications/RNNotifications/**",
); );
INFOPLIST_FILE = NotificationsExampleApp/Info.plist; INFOPLIST_FILE = NotificationsExampleApp/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
...@@ -706,8 +703,7 @@ ...@@ -706,8 +703,7 @@
"$(inherited)", "$(inherited)",
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
"$(SRCROOT)/../node_modules/react-native/React/**", "$(SRCROOT)/../node_modules/react-native/React/**",
"$(SRCROOT)/../node_modules/react-native/Libraries/PushNotificationIOS/**", "$(SRCROOT)/../../RNNotifications/**",
"$(SRCROOT)/../node_modules/react-native-notifications/RNNotifications/**",
); );
INFOPLIST_FILE = NotificationsExampleApp/Info.plist; INFOPLIST_FILE = NotificationsExampleApp/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
......
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
* on the same Wi-Fi network. * on the same Wi-Fi network.
*/ */
jsCodeLocation = [NSURL URLWithString:@"http://172.31.8.67:8081/index.ios.bundle?platform=ios&dev=true"]; jsCodeLocation = [NSURL URLWithString:@"http://192.168.1.15:8081/index.ios.bundle?platform=ios&dev=true"];
/** /**
* OPTION 2 * OPTION 2
......
...@@ -99,7 +99,9 @@ export default class NotificationsIOS { ...@@ -99,7 +99,9 @@ export default class NotificationsIOS {
if (actionHandler) { if (actionHandler) {
action.notification = new IOSNotification(action.notification); action.notification = new IOSNotification(action.notification);
actionHandler(action, () => { NativeRNNotifications.completionHandler(); }); actionHandler(action, () => {
NativeRNNotifications.completionHandler(action.completionKey);
});
} }
} }
...@@ -155,6 +157,10 @@ export default class NotificationsIOS { ...@@ -155,6 +157,10 @@ export default class NotificationsIOS {
NativeRNNotifications.backgroundTimeRemaining(callback); NativeRNNotifications.backgroundTimeRemaining(callback);
} }
static consumeBackgroundQueue() {
NativeRNNotifications.consumeBackgroundQueue();
}
static log(message) { static log(message) {
NativeRNNotifications.log(message); NativeRNNotifications.log(message);
} }
......
...@@ -22,7 +22,8 @@ describe("NotificationsIOS", () => { ...@@ -22,7 +22,8 @@ describe("NotificationsIOS", () => {
nativeRequestPermissionsWithCategories, nativeRequestPermissionsWithCategories,
nativeAbandonPermissions, nativeAbandonPermissions,
nativeRegisterPushKit, nativeRegisterPushKit,
nativeBackgroundTimeRemaining; nativeBackgroundTimeRemaining,
nativeConsumeBackgroundQueue;
let NotificationsIOS, NotificationAction, NotificationCategory; let NotificationsIOS, NotificationAction, NotificationCategory;
let someHandler = () => {}; let someHandler = () => {};
/*eslint-enable indent*/ /*eslint-enable indent*/
...@@ -36,6 +37,7 @@ describe("NotificationsIOS", () => { ...@@ -36,6 +37,7 @@ describe("NotificationsIOS", () => {
nativeAbandonPermissions = sinon.spy(); nativeAbandonPermissions = sinon.spy();
nativeRegisterPushKit = sinon.spy(); nativeRegisterPushKit = sinon.spy();
nativeBackgroundTimeRemaining = sinon.spy(); nativeBackgroundTimeRemaining = sinon.spy();
nativeConsumeBackgroundQueue = sinon.spy();
let libUnderTest = proxyquire("../index.ios", { let libUnderTest = proxyquire("../index.ios", {
"react-native": { "react-native": {
...@@ -44,7 +46,8 @@ describe("NotificationsIOS", () => { ...@@ -44,7 +46,8 @@ describe("NotificationsIOS", () => {
requestPermissionsWithCategories: nativeRequestPermissionsWithCategories, requestPermissionsWithCategories: nativeRequestPermissionsWithCategories,
abandonPermissions: nativeAbandonPermissions, abandonPermissions: nativeAbandonPermissions,
registerPushKit: nativeRegisterPushKit, registerPushKit: nativeRegisterPushKit,
backgroundTimeRemaining: nativeBackgroundTimeRemaining backgroundTimeRemaining: nativeBackgroundTimeRemaining,
consumeBackgroundQueue: nativeConsumeBackgroundQueue
} }
}, },
NativeAppEventEmitter: { NativeAppEventEmitter: {
...@@ -79,6 +82,7 @@ describe("NotificationsIOS", () => { ...@@ -79,6 +82,7 @@ describe("NotificationsIOS", () => {
nativeAbandonPermissions.reset(); nativeAbandonPermissions.reset();
nativeRegisterPushKit.reset(); nativeRegisterPushKit.reset();
nativeBackgroundTimeRemaining.reset(); nativeBackgroundTimeRemaining.reset();
nativeConsumeBackgroundQueue.reset();
}); });
after(() => { after(() => {
...@@ -90,6 +94,7 @@ describe("NotificationsIOS", () => { ...@@ -90,6 +94,7 @@ describe("NotificationsIOS", () => {
nativeAbandonPermissions = null; nativeAbandonPermissions = null;
nativeRegisterPushKit = null; nativeRegisterPushKit = null;
nativeBackgroundTimeRemaining = null; nativeBackgroundTimeRemaining = null;
nativeConsumeBackgroundQueue = null;
NotificationsIOS = null; NotificationsIOS = null;
NotificationAction = null; NotificationAction = null;
...@@ -210,4 +215,12 @@ describe("NotificationsIOS", () => { ...@@ -210,4 +215,12 @@ describe("NotificationsIOS", () => {
expect(nativeBackgroundTimeRemaining).to.have.been.calledWith(someCallback); expect(nativeBackgroundTimeRemaining).to.have.been.calledWith(someCallback);
}); });
}); });
describe("Get background remaining time", () => {
it("should call native consume background queue method", () => {
NotificationsIOS.consumeBackgroundQueue();
expect(nativeConsumeBackgroundQueue).to.have.been.called;
});
});
}); });
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment