Commit 9258d909 by Sebastián Katzer

Update local notifications on iOS

parent 69bcba1c
...@@ -28,6 +28,8 @@ ...@@ -28,6 +28,8 @@
- (void) deviceready:(CDVInvokedUrlCommand*)command; - (void) deviceready:(CDVInvokedUrlCommand*)command;
// Schedule a new notification // Schedule a new notification
- (void) add:(CDVInvokedUrlCommand*)command; - (void) add:(CDVInvokedUrlCommand*)command;
// Update a notification
- (void) update:(CDVInvokedUrlCommand*)command;
// Cancel a given notification // Cancel a given notification
- (void) cancel:(CDVInvokedUrlCommand*)command; - (void) cancel:(CDVInvokedUrlCommand*)command;
// Cancel all currently scheduled notifications // Cancel all currently scheduled notifications
......
...@@ -72,7 +72,7 @@ ...@@ -72,7 +72,7 @@
NSArray* notifications = command.arguments; NSArray* notifications = command.arguments;
[self.commandDelegate runInBackground:^{ [self.commandDelegate runInBackground:^{
for (NSMutableDictionary* options in notifications) { for (NSDictionary* options in notifications) {
UILocalNotification* notification; UILocalNotification* notification;
notification = [[UILocalNotification alloc] notification = [[UILocalNotification alloc]
...@@ -91,6 +91,39 @@ ...@@ -91,6 +91,39 @@
} }
/** /**
* Update a set of notifications.
*
* @param properties
* A dict of properties for each notification
*/
- (void) update:(CDVInvokedUrlCommand*)command
{
NSArray* notifications = command.arguments;
[self.commandDelegate runInBackground:^{
for (NSDictionary* options in notifications) {
NSString* id = [options objectForKey:@"id"];
UILocalNotification* notification;
notification = [[UIApplication sharedApplication]
scheduledLocalNotificationWithId:id];
if (!notification)
continue;
[self updateLocalNotification:[notification copy]
withOptions:options];
if (notifications.count > 1) {
[NSThread sleepForTimeInterval:0.01];
}
}
[self execCallback:command];
}];
}
/**
* Cancel a set of notifications. * Cancel a set of notifications.
* *
* @param ids * @param ids
...@@ -336,13 +369,28 @@ ...@@ -336,13 +369,28 @@
} }
/** /**
* Update the local notification.
*/
- (void) updateLocalNotification:(UILocalNotification*)notification
withOptions:(NSDictionary*)newOptions
{
NSMutableDictionary* options = [notification.userInfo mutableCopy];
[options addEntriesFromDictionary:newOptions];
[options setObject:[NSDate date] forKey:@"updatedAt"];
notification = [[UILocalNotification alloc]
initWithOptions:options];
[self scheduleLocalNotification:notification];
}
/**
* Cancel the local notification. * Cancel the local notification.
*/ */
- (void) cancelLocalNotification:(UILocalNotification*)notification - (void) cancelLocalNotification:(UILocalNotification*)notification
{ {
if (!notification)
return;
[[UIApplication sharedApplication] [[UIApplication sharedApplication]
cancelLocalNotification:notification]; cancelLocalNotification:notification];
...@@ -392,7 +440,7 @@ ...@@ -392,7 +440,7 @@
for (UILocalNotification* notification in notifications) for (UILocalNotification* notification in notifications)
{ {
if (notification && notification.repeatInterval == NSCalendarUnitEra if (notification && [notification isRepeating]
&& notification.timeIntervalSinceFireDate > seconds) && notification.timeIntervalSinceFireDate > seconds)
{ {
[self cancelLocalNotification:notification]; [self cancelLocalNotification:notification];
...@@ -412,8 +460,11 @@ ...@@ -412,8 +460,11 @@
{ {
UILocalNotification* notification = [localNotification object]; UILocalNotification* notification = [localNotification object];
if ([notification wasUpdated])
return;
BOOL autoCancel = notification.options.autoCancel; BOOL autoCancel = notification.options.autoCancel;
NSTimeInterval timeInterval = notification.timeIntervalSinceFireDate; NSTimeInterval timeInterval = [notification timeIntervalSinceFireDate];
NSString* event = (timeInterval <= 1 && deviceready) ? @"trigger" : @"click"; NSString* event = (timeInterval <= 1 && deviceready) ? @"trigger" : @"click";
...@@ -551,7 +602,7 @@ ...@@ -551,7 +602,7 @@
if (notification) { if (notification) {
NSString* id = notification.options.id; NSString* id = notification.options.id;
NSString* json = notification.options.json; NSString* json = notification.options.json;
NSString* args = [notification.options encodeToJSON]; NSString* args = [notification encodeToJSON];
params = [NSString stringWithFormat: params = [NSString stringWithFormat:
@"\"%@\",\"%@\",\\'%@\\',JSON.parse(\\'%@\\')", @"\"%@\",\"%@\",\\'%@\\',JSON.parse(\\'%@\\')",
......
...@@ -33,8 +33,6 @@ ...@@ -33,8 +33,6 @@
@property (readonly, getter=repeatInterval) NSCalendarUnit repeatInterval; @property (readonly, getter=repeatInterval) NSCalendarUnit repeatInterval;
@property (readonly, getter=userInfo) NSDictionary* userInfo; @property (readonly, getter=userInfo) NSDictionary* userInfo;
// Encode the user info dict to JSON
- (NSString*) encodeToJSON;
// If it's a repeating notification // If it's a repeating notification
- (BOOL) isRepeating; - (BOOL) isRepeating;
......
...@@ -213,28 +213,6 @@ ...@@ -213,28 +213,6 @@
} }
/** /**
* Encode the user info dict to JSON.
*/
- (NSString*) encodeToJSON
{
NSString* json;
NSData* data;
NSMutableDictionary* obj = [dict mutableCopy];
[obj removeObjectForKey:@"json"];
data = [NSJSONSerialization dataWithJSONObject:obj
options:NSJSONWritingPrettyPrinted
error:Nil];
json = [[NSString alloc] initWithData:data
encoding:NSUTF8StringEncoding];
return [json stringByReplacingOccurrencesOfString:@"\n"
withString:@""];
}
/**
* If it's a repeating notification. * If it's a repeating notification.
*/ */
- (BOOL) isRepeating - (BOOL) isRepeating
......
...@@ -33,7 +33,11 @@ ...@@ -33,7 +33,11 @@
- (BOOL) wasInThePast; - (BOOL) wasInThePast;
// If the notification was already triggered // If the notification was already triggered
- (BOOL) wasTriggered; - (BOOL) wasTriggered;
// If the notification was updated
- (BOOL) wasUpdated;
// If it's a repeating notification // If it's a repeating notification
- (BOOL) isRepeating; - (BOOL) isRepeating;
// Encode the user info dict to JSON
- (NSString*) encodeToJSON;
@end @end
...@@ -28,7 +28,7 @@ static char optionsKey; ...@@ -28,7 +28,7 @@ static char optionsKey;
@implementation UILocalNotification (APPLocalNotification) @implementation UILocalNotification (APPLocalNotification)
#pragma mark - #pragma mark -
#pragma mark Init methods #pragma mark Init
/** /**
* Initialize a local notification with the given options when calling on JS side: * Initialize a local notification with the given options when calling on JS side:
...@@ -59,6 +59,10 @@ static char optionsKey; ...@@ -59,6 +59,10 @@ static char optionsKey;
self.repeatInterval = options.repeatInterval; self.repeatInterval = options.repeatInterval;
self.alertBody = options.alertBody; self.alertBody = options.alertBody;
self.soundName = options.soundName; self.soundName = options.soundName;
if ([self wasInThePast]) {
self.fireDate = [NSDate date];
}
} }
#pragma mark - #pragma mark -
...@@ -129,7 +133,7 @@ static char optionsKey; ...@@ -129,7 +133,7 @@ static char optionsKey;
NSDate* now = [NSDate date]; NSDate* now = [NSDate date];
NSDate* fireDate = self.options.fireDate; NSDate* fireDate = self.options.fireDate;
int timespan = [now timeIntervalSinceDate:fireDate]; int timespan = [now timeIntervalSinceDate:fireDate];
if ([self isRepeating]) { if ([self isRepeating]) {
timespan = timespan % [self repeatIntervalInSeconds]; timespan = timespan % [self repeatIntervalInSeconds];
...@@ -160,6 +164,22 @@ static char optionsKey; ...@@ -160,6 +164,22 @@ static char optionsKey;
} }
/** /**
* If the notification was updated.
*/
- (BOOL) wasUpdated
{
NSDate* now = [NSDate date];
NSDate* updatedAt = [self.userInfo objectForKey:@"updatedAt"];
if (updatedAt == NULL)
return NO;
int timespan = [now timeIntervalSinceDate:updatedAt];
return timespan < 1;
}
/**
* If it's a repeating notification. * If it's a repeating notification.
*/ */
- (BOOL) isRepeating - (BOOL) isRepeating
...@@ -167,4 +187,27 @@ static char optionsKey; ...@@ -167,4 +187,27 @@ static char optionsKey;
return [self.options isRepeating]; return [self.options isRepeating];
} }
/**
* Encode the user info dict to JSON.
*/
- (NSString*) encodeToJSON
{
NSString* json;
NSData* data;
NSMutableDictionary* obj = [self.userInfo mutableCopy];
[obj removeObjectForKey:@"json"];
[obj removeObjectForKey:@"updatedAt"];
data = [NSJSONSerialization dataWithJSONObject:obj
options:NSJSONWritingPrettyPrinted
error:Nil];
json = [[NSString alloc] initWithData:data
encoding:NSUTF8StringEncoding];
return [json stringByReplacingOccurrencesOfString:@"\n"
withString:@""];
}
@end @end
...@@ -98,20 +98,20 @@ exports.setDefaults = function (newDefaults) { ...@@ -98,20 +98,20 @@ exports.setDefaults = function (newDefaults) {
/** /**
* Add a new entry to the registry * Add a new entry to the registry
* *
* @param {Object} props * @param {Object} opts
* The notification properties * The notification properties
* @param {Function} callback * @param {Function} callback
* A function to be called after the notification has been canceled * A function to be called after the notification has been canceled
* @param {Object?} scope * @param {Object?} scope
* The scope for the callback function * The scope for the callback function
*/ */
exports.add = function (props, callback, scope) { exports.add = function (opts, callback, scope) {
this.registerPermission(function(granted) { this.registerPermission(function(granted) {
if (!granted) if (!granted)
return; return;
var notifications = Array.isArray(props) ? props : [props]; var notifications = Array.isArray(opts) ? opts : [opts];
for (var i = 0; i < notifications.length; i++) { for (var i = 0; i < notifications.length; i++) {
var properties = notifications[i]; var properties = notifications[i];
...@@ -125,7 +125,7 @@ exports.add = function (props, callback, scope) { ...@@ -125,7 +125,7 @@ exports.add = function (props, callback, scope) {
}; };
/** /**
* Update existing notification specified by ID in options. * Update existing notifications specified by IDs in options.
* *
* @param {Object} options * @param {Object} options
* The notification properties to update * The notification properties to update
...@@ -134,8 +134,16 @@ exports.add = function (props, callback, scope) { ...@@ -134,8 +134,16 @@ exports.add = function (props, callback, scope) {
* @param {Object?} scope * @param {Object?} scope
* The scope for the callback function * The scope for the callback function
*/ */
exports.update = function (options, callback, scope) { exports.update = function (opts, callback, scope) {
this.exec('update', options, callback, scope); var notifications = Array.isArray(opts) ? opts : [opts];
for (var i = 0; i < notifications.length; i++) {
var properties = notifications[i];
this.convertProperties(properties);
}
this.exec('update', notifications, callback, scope);
}; };
/** /**
......
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