Преглед изворни кода

Custom repeat intervals based on matching date components

Sebastián Katzer пре 8 година
родитељ
комит
d6df078f6b
2 измењених фајлова са 98 додато и 30 уклоњено
  1. 0 1
      src/ios/APPNotificationOptions.h
  2. 98 29
      src/ios/APPNotificationOptions.m

+ 0 - 1
src/ios/APPNotificationOptions.h

@@ -35,7 +35,6 @@
 @property (readonly, getter=userInfo)   NSDictionary*        userInfo;
 
 - (id) initWithDict:(NSDictionary*)dict;
-- (BOOL) isRepeating;
 - (UNNotificationTrigger*) trigger;
 
 @end

+ 98 - 29
src/ios/APPNotificationOptions.m

@@ -164,21 +164,6 @@
 #pragma mark -
 #pragma mark Public
 
-/**
- * If the notification shall be repeating.
- *
- * @return [ BOOL ]
- */
-- (BOOL) isRepeating
-{
-    id every = [dict objectForKey:@"every"];
-
-    if ([every isKindOfClass:NSString.class])
-        return ((NSString*) every).length > 0;
-
-    return every > 0;
-}
-
 /**
  * Specify how and when to trigger the notification.
  *
@@ -213,6 +198,24 @@
 #pragma mark -
 #pragma mark Private
 
+/**
+ * If the notification shall be repeating.
+ *
+ * @return [ BOOL ]
+ */
+- (BOOL) isRepeating
+{
+    id every = [dict objectForKey:@"every"];
+
+    if ([every isKindOfClass:NSString.class])
+        return ((NSString*) every).length > 0;
+
+    if ([every isKindOfClass:NSDictionary.class])
+        return ((NSDictionary*) every).count > 0;
+
+    return every > 0;
+}
+
 /**
  * Non repeating trigger.
  *
@@ -236,6 +239,9 @@
     if ([every isKindOfClass:NSString.class])
         return [self repeatingTriggerWithDateMatchingComponents];
 
+    if ([every isKindOfClass:NSDictionary.class])
+        return [self repeatingTriggerWithCustomDateMatchingComponents];
+
     return [self repeatingTriggerWithTimeInterval];
 }
 
@@ -258,7 +264,7 @@
 }
 
 /**
- * A repeating trigger based on a calendar time defined by the user.
+ * A repeating trigger based on a calendar time intervals defined by the plugin.
  *
  * @return [ UNCalendarNotificationTrigger* ]
  */
@@ -269,8 +275,27 @@
 
     NSDateComponents *date = [cal components:[self repeatInterval]
                                     fromDate:[self fireDate]];
+    
+    date.timeZone = [NSTimeZone defaultTimeZone];
+
+    return [UNCalendarNotificationTrigger
+            triggerWithDateMatchingComponents:date repeats:YES];
+}
+
+/**
+ * A repeating trigger based on a calendar time intervals defined by the user.
+ *
+ * @return [ UNCalendarNotificationTrigger* ]
+ */
+- (UNCalendarNotificationTrigger*) repeatingTriggerWithCustomDateMatchingComponents
+{
+    NSCalendar* cal = [[NSCalendar alloc]
+                       initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
+
+    NSDateComponents *date = [self customDateComponents];
 
-    [date setTimeZone:[NSTimeZone defaultTimeZone]];
+    date.calendar = cal;
+    date.timeZone = [NSTimeZone defaultTimeZone];
 
     return [UNCalendarNotificationTrigger
             triggerWithDateMatchingComponents:date repeats:YES];
@@ -296,34 +321,78 @@
     NSString* interval = [dict objectForKey:@"every"];
     NSCalendarUnit units = NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond;
 
-
-    if (!interval.length)
-        return units;
-
-    if ([interval isEqualToString:@"second"])
-        return NSCalendarUnitNanosecond;
-
     if ([interval isEqualToString:@"minute"])
         return NSCalendarUnitSecond;
 
     if ([interval isEqualToString:@"hour"])
-        return NSCalendarUnitMinute;
+        return NSCalendarUnitMinute|NSCalendarUnitSecond;
 
     if ([interval isEqualToString:@"day"])
-        return NSCalendarUnitHour|NSCalendarUnitMinute;
+        return NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond;
 
     if ([interval isEqualToString:@"week"])
-        return NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitWeekday;
+        return NSCalendarUnitWeekday|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond;
 
     if ([interval isEqualToString:@"month"])
-        return NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitDay;
+        return NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond;
 
     if ([interval isEqualToString:@"year"])
-        return NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitDay|NSCalendarUnitMonth;
+        return NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond;
 
     return units;
 }
 
+/**
+ * The repeat interval for the notification.
+ *
+ * @return [ NSDateComponents* ]
+ */
+- (NSDateComponents*) customDateComponents
+{
+    NSDateComponents* date  = [[NSDateComponents alloc] init];
+    NSDictionary* every     = [dict objectForKey:@"every"];
+
+    for (NSString* key in every) {
+        long value = [[every valueForKey:key] longValue];
+        
+        if ([key isEqualToString:@"second"]) {
+            date.second = value;
+        } else
+        if ([key isEqualToString:@"minute"]) {
+            date.minute = value;
+        } else
+        if ([key isEqualToString:@"hour"]) {
+            date.hour = value;
+        } else
+        if ([key isEqualToString:@"day"]) {
+            date.day = value;
+        } else
+        if ([key isEqualToString:@"weekday"]) {
+            date.weekday = value;
+        } else
+        if ([key isEqualToString:@"weekdayOrdinal"]) {
+            date.weekdayOrdinal = value;
+        } else
+        if ([key isEqualToString:@"week"]) {
+            date.weekOfYear = value;
+        } else
+        if ([key isEqualToString:@"weekOfMonth"]) {
+            date.weekOfMonth = value;
+        } else
+        if ([key isEqualToString:@"month"]) {
+            date.month = value;
+        } else
+        if ([key isEqualToString:@"quarter"]) {
+            date.quarter = value;
+        } else
+        if ([key isEqualToString:@"year"]) {
+            date.year = value;
+        }
+    }
+
+    return date;
+}
+
 /**
  * Convert an assets path to an valid sound name attribute.
  *