27 berichten aan het bekijken - 1 tot 27 (van in totaal 27)
  • Q:
    Bijdrager
    Luuksweb

    Verwijder 'local notifications' op een vooraf ingesteld tijdstip

    Goedemiddag,

    Ik heb deze code overgenomen van internet (Stackoverflow) en vervolgens aangepast, maar het lukt mij maar niet om hem werkend te krijgen.

    - (BOOL)cancelAllLocalNotifications {<br />
        NSDate *now = [NSDate date];<br />
        NSCalendar *currentCalendar = [NSCalendar currentCalendar];<br />
        NSDateComponents *components = [currentCalendar components:(NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSTimeZoneCalendarUnit | NSCalendarCalendarUnit) fromDate:now];<br />
        [components setTimeZone:[NSTimeZone defaultTimeZone]];</p>
    <p>    NSInteger hour = [components hour];<br />
        NSInteger minute = [components minute];<br />
        NSInteger second = [components second];<br />
        if (hour == 23 || minute == 59 || second == 59) {<br />
            [[UIApplication sharedApplication] cancelAllLocalNotifications];<br />
        }</p>
    <p>    return YES;<br />
    }

    Voor de duidelijkheid, dit moet elke dag gebeuren.
    Wie kan mij helpen?

    Bij voorbaat dank.

    Met vriendelijke groet,
    Lukas

    EDIT: </p><p> heb ik er zelf niet tussengezet (dit is te zien op de website versie)

    Inactief
    Anoniem

    1. wat probeer je precies te doen?
    2. wat gaat er fout?

    Bijdrager
    Luuksweb

    Bedankt voor je reactie Koen.
    1. Ik probeer dat om 23:59:59 elke dag alle local notifications van mijn app verwijderd worden.
    2. De actie ([[UIApplication sharedApplication] cancelAllLocalNotifications]) wordt helemaal niet uitgevoerd. Eigenlijk gebeurt er gewoon niks.

    Met vriendelijke groet,
    Lukas

    Bijdrager
    Verwijder

    Waar zit deze method, wanneer zou hij moeten worden aangeroepen en wanneer wordt hij aangeroepen?

    Bijdrager
    Luuksweb

    Bedankt voor je reactie.
    Ik heb hem in de AppDelegate (.m file uiteraard) gezet.
    Hij moet eigenlijk altijd worden aangeroepen, zowel als de app actief is als inactief (voorgrond/achtergrond).
    Je laatste vraag begrijp ik helaas niet.

    Met vriendelijke groet,
    Lukas

    Inactief
    Anoniem

    Hij wordt alleen maar aangeroepen wanneer jij dat in de code hebt gezet. De code hierboven kijkt naar een datum, maar zolang die method niet wordt aangeroepen gebeurt er inderdaad niets. Misschien kun je het voor elkaar krijgen met een NSTimer.

    Bijdrager
    Luuksweb

    Bedankt voor je reactie Koen.
    Je hebt helemaal gelijk.
    Ik ga het een en ander proberen met een NSTimer.
    Hopen dat het dan wel lukt.:)

    Met vriendelijke groet,
    Lukas

    Bijdrager
    Luuksweb

    Volgens mij kan ik het effect dat ik wil bereiken niet bereiken met een NSTimer, aangezien deze voorzover ik weet steeds doortelt.
    Dus elke dag komt er een afwijking van een seconde bij.
    Heeft iemand een suggestie?

    Bij voorbaat dank.

    Met vriendelijke groet,
    Lukas

    Inactief
    Anoniem

    Misschien staat hier iets bij: http://stackoverflow.com/questions/2632996/schedule-multiple-daily-events-with-nstimer

    Verder weet ik het ook niet:smile:

    Bijdrager
    Verwijder

    Ik heb het idee dat je op de verkeerde weg bent want je kan er volgens mij niet van uitgaan dat jouw app draait en processortijd krijgt om 23:59:59. Ik heb geen verstand van local notifications, kan je in het kort uitleggen wat dat is?
    NSTimer heeft de method initWithFireDate:enz. en hoeft niet door te tellen en al telt hij door dan zie ik nog niet waar de afwijking van een seconde vandaan komt.

    Inactief
    Anoniem

    Ik weet er ook niet veel van, maar ik geloof dat local notifications zelfs werken wanneer de app niet open is. NSTimer was in dit geval geen goed advies, want die werken alleen wanneer de app actief is.

    Blijft de vraag natuurlijk waarom cancelAllLocalNotifications: niet wordt aangeroepen in de code van Lukas.

    Bijdrager
    Luuksweb

    Heel erg bedankt voor alle reacties.
    Voor de duidelijkheid, het gaat erom dat de alle notificaties van mijn app worden verwijderd.
    Het gaat er dus niet om dat de Local Notification wordt getoond, aangezien je dit gewoon met een fireDate kan aansturen.
    Dit gedeelte is dus ook gewoon gelukt.

    Koen, helaas zie ik in jouw link niet iets waarvan ik direct denk dat het bruikbaar is voor mijn app nu.
    Wel bedankt voor de link, aangezien er andere interessante dingen in staan.

    Willemien, een Local Notification is een vooraf ingestelde notificatie op een bepaald tijdstip.
    Deze notificatie kan dagelijks, wekelijks, etc. herhaald worden.
    De afwijking van 1 seconde dacht ik, omdat er steeds ‘1 seconde van een dag wordt afgehaald’.
    Dus: 86399+86399, etc. ipv. 86400+86400, etc.
    Maar na het nogmaals bekijken van een NSTimer ga ik het vannacht proberen.

    Koen, ik heb de NSTimer nu in meerdere dingen gezet (applicationDidFinishLaunching, application didFinishLaunchingWithOptions, applicationDidEnterBackground, applicationWillTerminate), ik hoop dat de NSTimer vannacht gewoon werkt.

    Dan blijft natuurlijk nog de resterende vraag, wat heb ik dan afgelopen nacht geprobeerd?

    - (void)applicationSignificantTimeChange:(UIApplication *)application{<br />
        [[UIApplication sharedApplication] cancelAllLocalNotifications];<br />
    }

    Helaas werkte deze code ook niet.

    Ik ga het zien of het vanavond werkt.

    Met vriendelijke groet,
    Lukas

    Inactief
    Anoniem

    Ik denk toch echt dat die NSTimer alleen werkt wanneer je app actief is. Kun je je code trouwens niet instellen op 10 minuten, dat lijkt me wat makkelijker debuggen :thumbsup:

    Bijdrager
    Luuksweb

    Op welke manier zou ik hem dan bijvoorbeeld op 10 minuten kunnen instellen?

    Inactief
    Anoniem

    Dat kun je vast wel in de docs vinden: http://developer.apple.com/library/ios/#DOCUMENTATION/NetworkingInternet/Conceptual/RemoteNotificationsPG/Introduction/Introduction.html

    Het kost misschien wat tijd om het te lezen, maar je leert er erg veel van. Goed leren zoeken is een van de belangrijkste kwaliteiten die een programmeur nodig heeft. :thumbsup:

    Bijdrager
    bitsflew

    Heb het niet getest maar volgens mij moet het werken:

    http://pastebin.com/PuR763pB

    [update]

    Het kan iets eenvoudiger.

    http://pastebin.com/undGC0DK

    Lopende timers worden ‘pseudo’ gepauzeerd als een app naar de achtergrond gaat.
    Timers die eigenlijk in background af hadden moeten gaan doen dat direct bij het weer naar de voorgrond komen van de app. De extra controle middels checkDate is dus overbodig.

    Bijdrager
    Luuksweb

    Bitsflew, heel erg bedankt voor je code.
    Alsnog heb ik twee vragen.

    1. Wat moet ik bij de property invullen. Ik heb daar nu namelijk @property NSTimer *timer; en @property NSTimer *checkDate; staan. Dus niks tussen haakjes. Wat zou ik daar het beste kunnen neerzetten en NSTimer bij *checkDate klopt volgens mij niet.
    2. Is het ook mogelijk om de actie ook uit te voeren van als de app niet actief is? Dat is eigenlijk wel een must.:neutral:

    Nogmaals heel erg bedankt voor de code en bij voorbaat dank voor het beantwoorden van mijn vragen.

    Met vriendelijke groet,
    Lukas

    EDIT: na het testen van je code op mijn iPod merk ik dat er helemaal geen notificatie meer wordt gestuurd.:neutral:

    Inactief
    Anoniem

    Lukas: ik raad je aan om eens heel snel een goed boek over ObjectiveC en Cocoa te gaan lezen. Zaken zoals hoe je een @property moet declareren zijn erg essentieel om te weten. Of spit eens door de online docs van Apple, daar staat ook heel erg veel. We kunnen je hier alles wel gaan voorkauwen, maar daar leer je niet veel van :thumbsup:

    Bijdrager
    Verwijder

    Waar komen de notifications die je wilt verwijderen vandaan? Betekent local dat je ze zelf gegenereerd hebt? Zo ja, is het niet handiger om alleen notifications voor vandaag te genereren?

    Bijdrager
    bitsflew
    Luuksweb op 18 september 2012

    Bitsflew, heel erg bedankt voor je code.

    Alsnog heb ik twee vragen.

  • Wat moet ik bij de property invullen. Ik heb daar nu namelijk @property NSTimer *timer; en @property NSTimer *checkDate; staan. Dus niks tussen haakjes. Wat zou ik daar het beste kunnen neerzetten en NSTimer bij *checkDate klopt volgens mij niet.
  • Is het ook mogelijk om de actie ook uit te voeren van als de app niet actief is? Dat is eigenlijk wel een must.:neutral:
  • Nogmaals heel erg bedankt voor de code en bij voorbaat dank voor het beantwoorden van mijn vragen.

    Met vriendelijke groet,

    Lukas

    EDIT: na het testen van je code op mijn iPod merk ik dat er helemaal geen notificatie meer wordt gestuurd.:neutral:

    Dan wordt checkTimerTimeout blijkbaar op het verkeerde moment of te vaak aangeroepen.

    Gewoon even een breakpoint bij checkTimerTimeout zetten en voor de zekerheid controlleren wat nextCheckDate teruggeeft.

    [update 2x]

    Er zat nog een typefoutje in de code, regel 9 om precies te zijn.

    http://pastebin.com/7cQT0LTt

    Ik heb net even de code geprobeerd en de timer staat keurig gescheduled op 0:00.

    Voor het testen is het praktischer om nextCheckDate iets aan te passen

    Voorbeeld:

    <br />
    //dateComponents.hour     = 0;<br />
    //dateComponents.minute   = 0;<br />
    dateComponents.second   = dateComponents.second+30;<br />
     // dateComponents.day      = dateComponents.day + 1;<br />
     

    De timer gaat dan al na 30 seconden af, daar NSDateComponents cumulatief werkt mag je ook waardes groter dan 59 gebruiken.

Bijdrager
Luuksweb

Goedeavond,

Vandaag en gisteren heb ik weer het een en ander geprobeerd.
Helaas ben ik weer niet verder gekomen.:(

Willemien, het klopt dat je deze zelf met een code genereert. Het zou inderdaad handiger zijn als ik alleen notificaties die maar een dag ‘geldig’ zijn genereer, maar ik zou niet weten hoe.

Bitsflew, helaas lukt het nog steeds niet met je code. Wel een goede site die pastebin overigens.

Wat heb ik dan zelf geprobeerd?
Ik heb geprobeerd een code te maken en deze vervolgens te activeren wanneer de NSDate overeenkomt met de NSComponents.
Helaas werkte dit niet.:(

Hopelijk kan iemand mij helpen.
Bij voorbaat dank.

Met vriendelijke groet,
Lukas Goes

EDIT: de link werkt nu wel;)

Bijdrager
bitsflew

Ik snap niet waarom mijn voorbeeld bij jou niet werkt.

Gisteren heb ik de code in een app gehangen en dat werkte gewoon.

Althans de routine checkTimerTimeout werd op het juiste tijdstip aangeroepen.

<br />
if ([NSDate date] == dateCompsDeleteNotif) {<br />
 

Dat gaat natuurlijk niet werken want je vergelijkt het adres van een tijdelijk object (resultaat van [NSDate date]) met het adres van dateCompsDeleteNotif

Voor het vergelijken van de waarde moet je [NSDate isEqualToDate:] of [NSDate compare:] gebruiken.

Maar dan gaat het nog niet werken want dateCompsDeleteNotif is niet van het type NSDate

Je moet dateCompsDeleteNotif eerst omzetten naar een NSDate

Bijdrager
Luuksweb

Hallo bitsflew,

Ik heb je code nog een keer geprobeerd met een paar NSLogs ertussen.
Hij werkte toch wel.:)
Alleen is het zo dat als ik op de homebutton druk en dus de app verlaat komen er geen nieuwe NSLogs, dus moet de app actief zijn om de actie uit te voeren.
Dit is eigenlijk niet wat ik wilde…

Ik hoop dat iemand kan helpen.
Bij voorbaat dank.

Met vriendelijke groet,
Lukas

Bijdrager
Verwijder

Willemien, het klopt dat je deze zelf met een code genereert. Het zou inderdaad handiger zijn als ik alleen notificaties die maar een dag ‘geldig’ zijn genereer, maar ik zou niet weten hoe.

Je geeft de notification een datum mee, als die datum te laat is dan moet je die notification niet doen. Dit lijkt me makkelijker dan het voor elkaar zien te krijgen dat de App op het juiste moment wakker is om de notifications te verwijderen.

Voorbeeld (uit m’n hoofd, niet getest)

NSCalendar *aCalendar = [NSCalendar currentCalendar];<br />
if ([[aCalendar components:NSDayCalendarUnit fromDate:[NSDate date]] day] == [[aCalendar components:NSDayCalendarUnit fromDate:fireDate] day])<br />
{<br />
	// schedule local notification<br />
}
Bijdrager
bitsflew
Luuksweb op 20 september 2012

Hallo bitsflew,

Ik heb je code nog een keer geprobeerd met een paar NSLogs ertussen.

Hij werkte toch wel.:)

Alleen is het zo dat als ik op de homebutton druk en dus de app verlaat komen er geen nieuwe NSLogs, dus moet de app actief zijn om de actie uit te voeren.

Dit is eigenlijk niet wat ik wilde…

Zodra je de homeknop drukt wordt je app in de background state gezet of gestopt (te configureren via info.plist)
Een app die in de background state zit kan alleen code uitvoeren middels ‘beginBackgroundTaskWithExpirationHandler:’, en krijgt daarvoor maximaal 10 minuten de tijd.

Local notifications die getoond worden terwijl je app in de backgound zit kun je niet cancelen.

Inactief
Anoniem

Even terug naar het begin, wat is de reden dat je dit wilt uitvoeren?

Wanneer bij het programmeren iets te ingewikkeld of omslachtig lijkt, is dat vaak omdat het op een verkeerde manier wordt aangepakt. Misschien is er wel een veel simplere manier om te bereiken wat je wilt.

Bijdrager
Luuksweb

Goedenavond,

Ik bedacht mij opeens dat ik dit topic nog open heb staan.
Ten eerste wil ik iedereen nog bedanken voor de geweldige hulp die ze geleverd hebben en de tijd die ze er in hebben gestoken om mij te helpen.
Helaas is de app waar ik mee bezig was en waar ik in een ver stadium mee was door iOS 6 overbodig geworden en zijn de ontwikkelingen aan de app stop gezet.
Inmiddels ben ik wel bezig met een nieuwe app.:)

Nogmaals heel erg bedankt voor alle hulp.

Met vriendelijke groet,
Lukas

27 berichten aan het bekijken - 1 tot 27 (van in totaal 27)

Je moet ingelogd zijn om een reactie op dit onderwerp te kunnen geven.

Inloggen
Log in of registeer je om te reageren.
vergeten?
vergeten?