• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> Klick

Local Notification jeden Montag und Mittwoch

AppDev04

Gala
Registriert
19.10.14
Beiträge
48
Hallo

Ich möchte gerne eine Local-Notification so einrichten, dass jeden Montag bzw. Mittwoch um 19:00 Uhr eine Nachricht rausgeht, welche den Nutzer informiert. Mein momentaner Code:

Code:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  
    if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
        [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]];
    }

    return YES;
}

Code:
- (void)applicationDidEnterBackground:(UIApplication *)application {

    [[UIApplication sharedApplication] cancelAllLocalNotifications];
  
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
  
    NSDate *now = [NSDate date];
  
    NSDateComponents *componentsForFireDate = [calendar components:(NSCalendarUnitYear | NSCalendarUnitHour | NSCalendarUnitMinute| NSCalendarUnitSecond | NSCalendarUnitWeekday) fromDate: now];
  
    [componentsForFireDate setWeekday:2];
    [componentsForFireDate setHour: 19] ;
    [componentsForFireDate setMinute:00] ;
    [componentsForFireDate setSecond:00] ;
  
    NSDate *fireDateOfNotification = [calendar dateFromComponents: componentsForFireDate];
  
    // Create the notification
    UILocalNotification *notification = [[UILocalNotification alloc]  init] ;
  
    notification.fireDate = fireDateOfNotification ;
    notification.timeZone = [NSTimeZone localTimeZone];
    notification.alertTitle = [NSString stringWithFormat:@"Titel"];
    notification.alertBody = [NSString stringWithFormat: @"Nachricht"] ;
  
    notification.soundName = @"sound.mp3";
  
    NSLog(@"%@", notification);
  
    [[UIApplication sharedApplication] scheduleLocalNotification:notification];

}


1. Frage: Irgendetwas muss mit dem Datum falsch sein. Wenn ich nämlich mal meine "notification" logge bekomme ich folgende Nachricht. Irgend etwas muss mit dem Datum falsch sein, oder sehe ich das falsch?:
<UIConcreteLocalNotification: 0x7fbb21436d60>{fire date = Thursday, January 1, 2015 at 7:00:00 PM Central European Standard Time, time zone = Europe/Zurich (GMT+2) offset 7200 (Daylight), repeat interval = 0, repeat count = UILocalNotificationInfiniteRepeatCount, next fire date = (null), user info = (null)}

2. Frage: Ich möchte gern jeden Montag & Mittwoch eine Nachricht senden. Wie bekomme ich es hin, in der "setWeekday" mehrere Tage zu setzen?

Gruss
 

Marcel Bresink

Breuhahn
Registriert
28.05.04
Beiträge
8.583
1. Du definierst Datumskomponenten, bei denen nur Jahr, Stunde, Minute, Sekunde und Wochentag angegeben sein sollen, sonst nichts. Dann stellst Du diese Komponenten zunächst auf "jetzt" und überschreibst dann den Wochentag mit Montag und die Uhrzeit mit 19:00:00. Alle "nicht anzugebenden" Komponenten bleiben auf den Standardwerten 0 oder 1 stehen.

Daraus ergibt sich eine konkrete Zeitangabe, nämlich 1.1.2015, 19:00:00. Der falsch angegebene Montag wird automatisch auf Donnerstag korrigiert. Das verhält sich genau so, wie es von Apple dokumentiert ist.

Wahrscheinlich wolltest Du in Wirklichkeit den "nächsten Montag nach heute" berechnen. Dazu müsste man natürlich auch Tag und Monat speichern, wenn Du eine konkrete Zeitangabe haben willst.

2. Gar nicht. Das sind zwei Benachrichtigungen zu zwei unterschiedlichen Zeiten, also brauchst Du auch zwei Zeitobjekte (NSDates), die diese Zeitpunkte speichern. Das NSDateComponents-Objekt kannst Du natürlich "wiederverwenden", um daraus zwei verschiedene NSDates erzeugen zu lassen.

Geschickter wäre natürlich, das anders zu programmieren, nämlich immer vom Zeitpunkt "jetzt" aus den Termin der nächsten Benachrichtigung zu errechnen (egal ob montags oder mittwochs), und das Programm zu diesem Termin zu wecken. Es kann dann die Benachrichtigung ausgeben, den jeweils nächsten Termin errechnen und sich wieder wecken lassen. Auf diese Weise muss man immer nur einen einzigen Zeitpunkt, nämlich den nächsten, speichern, und das Programm verhält sich immer korrekt, egal wann es gestartet oder beendet wird.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: maddi06

AppDev04

Gala
Registriert
19.10.14
Beiträge
48
Danke dir für die schnelle Antwort.
Wie müsste es den aussehen, wenn ich jeden Tag, bzw. jeden zweiten Tag eine Notification senden möchte?