UILocalNotification Scheduling an Alert - iphone

I schedule a Notification, and give it 60 minutes warning before it should display an alert message...
As soon as I add the notification the method in my App Delegate is called:
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
How can I know that it will show up in the background as an alert? Is there any other Delegate method I need to override or use in order to ensure that given a scheduled Alert with a 60 Minute Interval...
- (void)scheduleNotificationWithItem:(NSDate *)item interval:(int)minutesBefore
{
NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];
NSDateComponents *dateComps = [[NSDateComponents alloc] init];
//NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *currentDateComponents = [calendar components:( NSWeekdayCalendarUnit |
NSYearCalendarUnit | NSMonthCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSWeekCalendarUnit | NSMinuteCalendarUnit) fromDate:item];
NSLog(#"- current components year = %i , month = %i , week = % i, weekday = %i", [currentDateComponents year], [currentDateComponents month], [currentDateComponents week], [currentDateComponents weekday]);
NSLog(#"[currentDateComponents minute]: %i", [currentDateComponents minute]);
NSLog(#"[currentDateComponents hour]: %i", [currentDateComponents hour]);
NSLog(#"[currentDateComponents day]: %i", [currentDateComponents day]);
NSLog(#"[currentDateComponents week]: %i", [currentDateComponents week]);
NSLog(#"[currentDateComponents month]: %i", [currentDateComponents month]);
NSLog(#"[currentDateComponents year]: %i", [currentDateComponents year]);
[dateComps setDay: [currentDateComponents day]];
[dateComps setMonth:[currentDateComponents month]];
[dateComps setYear:[currentDateComponents year]];
[dateComps setHour:[currentDateComponents hour]];
[dateComps setMinute:[currentDateComponents minute]];
NSDate *itemDate = [calendar dateFromComponents:dateComps];
[dateComps release];
UILocalNotification *localNotif = [[UILocalNotification alloc] init];
if (localNotif == nil)
return;
localNotif.fireDate = [itemDate addTimeInterval:-(minutesBefore*60)];
localNotif.timeZone = [NSTimeZone defaultTimeZone];
localNotif.alertBody = [NSString stringWithFormat:#"%#\n%#",
streetAddress,
stringOfWhenAuctionIsOn];
localNotif.alertAction = NSLocalizedString(#"View Details", nil);
localNotif.soundName = UILocalNotificationDefaultSoundName;
localNotif.applicationIconBadgeNumber = 1;
NSDictionary *infoDict = [NSDictionary dictionaryWithObject:streetAddress
forKey:idOfStreetAlert];
localNotif.userInfo = infoDict;
[[UIApplication sharedApplication] scheduleLocalNotification:localNotif];

If the notification shows up right away there probably is something wrong with your fireDate property. It looks like you are trying to verify that the date sent is correct but you should also verify that that fireDate is what you expect.
Also, you could perhaps do
localNotif.fireDate = [item dateByAddingTimeInterval:-60*minutesBefore];
to achieve the same effect and don't have to mess around with NSDateComponents. I have not tested this but it might work.
As for what happens when the timer fires and your app is not running. If the app has not been terminated application:didReceiveLocalNotification: will get called. If on the other side your app has been terminated you need to check in application:didFinishLaunchingWithOptions: as pointed out by #Ishu. I usually just pass the notification to a common method to avoid duplicating the code.

No delegate method for background, you need to write code in didFinishLaunchingWithOptions,
UILocalNotification *localNotif =
[launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
if (localNotif) {
//your code
NSLog(#"Recieved Notification %#",localNotif);
}
it create your logic when app get notification from background.Dont worry app get notification ones you set the notification.

Related

Auto increment applicationIconBadgeNumber when application quits

Programmers, I am new to objective C.
I am working on local notifications task and my task is that when user quits the applications and he doesn't run application again, suppose for one day, then the app icon badge number should auto increment to one. If it doesn't run for 48 hours, then it should increment and become 2 (means I have to repeat notification) and so on.
I am using local notifications for that. This how I am doing it:
- (void)applicationWillResignActive:(UIApplication *)application
{
[self launchNotification];
}
-(void)launchNotification
{
NSDate *todaydate = [NSDate date];
NSDate *firedates = [todaydate dateByAddingTimeInterval:10.0];
UILocalNotification *localNotif = [[UILocalNotification alloc] init];
if (localNotif == nil)
return;
localNotif.fireDate = firedates;
localNotif.timeZone = [NSTimeZone defaultTimeZone];
NSDateComponents *dateComps = [[NSDateComponents alloc] init];
NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];
NSDateComponents *timeComponents = [calendar components:( NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit)
fromDate:firedates];
[dateComps setHour:[timeComponents hour]];
[dateComps setMinute:[timeComponents minute]];
[dateComps setSecond:[timeComponents second]+10];
localNotif.repeatInterval = NSSecondCalendarUnit;
localNotif.soundName = UILocalNotificationDefaultSoundName;
// Specify custom data for the notification
//NSDictionary *infoDict = [NSDictionary dictionaryWithObject:#"someValue" forKey:#"someKey"];
//localNotif.userInfo = infoDict;
// Schedule the notification
localNotif.applicationIconBadgeNumber = +1;
[[UIApplication sharedApplication] scheduleLocalNotification:localNotif];
[localNotif release];
}
I am working from long time and finding no way out.

Local notification not firing in iphone

In my i'm using a action sheet picker view. It is working fine. But I want to fire a local notification when a particular time is set in time picker, it is not firing the local notification. I used this code:
enter code here
- (void)actionPickerDone {
if (nil != self.data) {
//send data picker message[self.target performSelector:self.action withObject:[NSNumbernumberWithInt:self.selectedIndex]];
}
else {
//send date picker message
NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];
// Get the current date
NSDate *pickerDate = [self.datePicker date];
// Break the date up into components
NSDateComponents *dateComponents = [calendar components:( NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit )
fromDate:pickerDate];
NSDateComponents *timeComponents = [calendar components:( NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit )
fromDate:pickerDate];
// Set up the fire time
NSDateComponents *dateComps = [[NSDateComponents alloc] init];
[dateComps setDay:[dateComponents day]];
[dateComps setMonth:[dateComponents month]];
[dateComps setYear:[dateComponents year]];
[dateComps setHour:[timeComponents hour]];
// Notification will fire in one minute
[dateComps setMinute:[timeComponents minute]];
[dateComps setSecond:[timeComponents second]];
NSDate *itemDate = [calendar dateFromComponents:dateComps];
[dateComps release];
UILocalNotification *localNotif = [[UILocalNotification alloc] init];
if (localNotif == nil)
return;
localNotif.fireDate = itemDate;
NSLog(#"%#what is this",itemDate);
localNotif.timeZone = [NSTimeZone defaultTimeZone];
NSLog(#"i8i8i88i");
// Notification details
//localNotif.alertBody = [eventText text];
// Set the action button
localNotif.alertAction = #"View";
localNotif.soundName = UILocalNotificationDefaultSoundName;
localNotif.applicationIconBadgeNumber = 1;
// Specify custom data for the notification
NSDictionary *infoDict = [NSDictionary dictionaryWithObject:#"someValue" forKey:#"someKey"];
localNotif.userInfo = infoDict;
// Schedule the notification
[[UIApplication sharedApplication] scheduleLocalNotification:localNotif];
[localNotif release];
}
Is there any thing wrong in this code.please help me.
I executed your code and the notification didnt fire. Then I uncommented the localNotif.alertBody assignment statement and it did fire. Local notification will not appear as an alert if you do not specify an alertBody. Plus the point raised by Idan is also valid. If your app is in foreground the notif wont be displayed rather you will get a callback in your app delegate in which you should display an alert with the message notification.alertBody for consistency.
Hope this helps :)
PS you dont need all the calender components thing youre doing. Log both of them and youll see that both pickerDate and itemDate are same.

Inserting the data from tableview to array in iphone app

I am making an iPhone app. In this app I have used tableview which shows local notifications timing whenever I press the datetime picker. Now I want to store all the values of tableview in to an array. How can I do this. Please give me some solutions.
We have implemented the Local notification and uses PickerView for it to set the data on the rows in tableview. This is the code snippet for displaying the data in tableview:- - (IBAction) scheduleAlarm:(id) sender {
[eventText resignFirstResponder];
NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];
// Get the current date
NSDate *pickerDate = [self.datePicker date];
// Break the date up into components
NSDateComponents *dateComponents = [calendar components:( NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit )
fromDate:pickerDate];
NSDateComponents *timeComponents = [calendar components:( NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit )
fromDate:pickerDate];
// Set up the fire time
NSDateComponents *dateComps = [[NSDateComponents alloc] init];
[dateComps setDay:[dateComponents day]];
[dateComps setMonth:[dateComponents month]];
[dateComps setYear:[dateComponents year]];
[dateComps setHour:[timeComponents hour]];
// Notification will fire in one minute
[dateComps setMinute:[timeComponents minute]];
//[dateComps setSecond:[timeComponents second]];
NSDate *itemDate = [calendar dateFromComponents:dateComps];
[dateComps release];
UILocalNotification *localNotif = [[UILocalNotification alloc] init];
if (localNotif == nil)
return;
localNotif.fireDate = itemDate;
localNotif.timeZone = [NSTimeZone defaultTimeZone];
// Notification details
localNotif.alertBody = [eventText text];
// Set the action button
localNotif.alertAction = #"View";
localNotif.soundName = UILocalNotificationDefaultSoundName;
localNotif.applicationIconBadgeNumber = 1;
// Specify custom data for the notification
NSDictionary *infoDict = [NSDictionary dictionaryWithObject:#"someValue" forKey:#"someKey"];
localNotif.userInfo = infoDict;
// Schedule the notification
[[UIApplication sharedApplication] scheduleLocalNotification:localNotif];
[localNotif release];
[self.tableview reloadData];
}
I think you should create a custom class and define the all this variables as property. then in
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
method create a new object of that class and assign all these value accordingly. after that in any mutable array add this custom objects. n yes take care of duplications.

local notification not firing in iphone

This may be a repeated question,but please help me.I used the code below for firing a local notifification,but it is not firing.I used a picker to set the time for firing the local notification.Please help me..
[self.actionSheet dismissWithClickedButtonIndex:0 animated:YES];
if (nil != self.data) {
//send data picker message
[self.target performSelector:self.action withObject:[NSNumber numberWithInt:self.selectedIndex]];
}
else {
//NSDate *date = [NSDate date];
//NSDateFormatter *dateFormat = [[NSDateFormatter alloc]init];
//[dateFormat setDateFormat:#"HH:mm:ss zzz"];
//NSString *dateString = [dateFormat stringFromDate:date];
//send date picker message
NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];
// Get the current date
NSDate *pickerDate = [self.datePickerView date];
//NSLog(#"date ==%#",pickerdate);
//Break the date up into components
NSDateComponents *dateComponents = [calendar components:( NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit )
fromDate:pickerDate];
NSDateComponents *timeComponents = [calendar components:( NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit )
fromDate:pickerDate];
// Set up the fire time
NSDateComponents *dateComps = [[NSDateComponents alloc] init];
[dateComps setDay:[dateComponents day]];
[dateComps setMonth:[dateComponents month]];
[dateComps setYear:[dateComponents year]];
[dateComps setHour:[timeComponents hour]];
//NSLog(#"day%#",[dateComponents day]);
// Notification will fire in one minute
[dateComps setMinute:[timeComponents minute]];
[dateComps setSecond:[timeComponents second]];
NSDate *itemDate = [calendar dateFromComponents:dateComps];
[dateComps release];
UILocalNotification *localNotif = [[UILocalNotification alloc] init];
if (localNotif == nil)
return;
localNotif.fireDate = itemDate;
NSLog(#"%#what is this",itemDate);
localNotif.timeZone = [NSTimeZone defaultTimeZone];
//Notification details
localNotif.alertBody = #"Tip of the day";
//Set the action button
localNotif.alertAction = #"View";
localNotif.soundName = UILocalNotificationDefaultSoundName;
localNotif.repeatInterval = NSDayCalendarUnit;
localNotif.applicationIconBadgeNumber = 1;
// Specify custom data for the notification
NSDictionary *infoDict = [NSDictionary dictionaryWithObject:#"someValue" forKey:#"someKey"];
localNotif.userInfo = infoDict;
// Schedule the notification
[localNotif release];
}
Where is the code for scheduling the local notification?
You have to make this call somewhere before you release your UILocalNotification object:
- (void)scheduleLocalNotification:(UILocalNotification *)notification
Like so,
[[UIApplication sharedApplication] scheduleLocalNotification: localNotif];
Its only after you call this method that your notification gets copied, and hence safe for releasing the notification object.

how to use UILocationNotification in iPad?

In my universal application I m using the below code for UILocalNotification
NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];
// Get the current date
NSDate *pickerDate = [self.datePicker date];
// Break the date up into components
NSDateComponents *dateComponents = [calendar components:( NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit )
fromDate:pickerDate];
NSDateComponents *timeComponents = [calendar components:( NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit )
fromDate:pickerDate];
// Set up the fire time
NSDateComponents *dateComps = [[NSDateComponents alloc] init];
[dateComps setDay:[dateComponents day]];
[dateComps setMonth:[dateComponents month]];
[dateComps setYear:[dateComponents year]];
[dateComps setHour:[timeComponents hour]];
// Notification will fire in one minute
[dateComps setMinute:[timeComponents minute]];
[dateComps setSecond:[timeComponents second]];
NSDate *itemDate = [calendar dateFromComponents:dateComps];
[dateComps release];
UILocalNotification *localNotif = [[UILocalNotification alloc] init];
if (localNotif == nil)
return;
localNotif.fireDate = itemDate;
localNotif.timeZone = [NSTimeZone defaultTimeZone];
// Notification details
NSString *str = [txtfield_MyPills.text stringByAppendingString:#" "];
NSString *str_Dosage = [txtfield_Dosage.text stringByAppendingString:#" "];
NSString *str_Frequency = [txtfield_Frequency.text stringByAppendingString:#" "];
NSString *str1 = [str stringByAppendingString:str_Dosage];
NSString *strResult = [str1 stringByAppendingString:str_Frequency];
localNotif.alertBody =strResult;;// [txtfield_MyPills text];//[eventText text];
// Set the action button
localNotif.alertAction = #"View";
localNotif.soundName = UILocalNotificationDefaultSoundName;
localNotif.applicationIconBadgeNumber = 1;
// Specify custom data for the notification
NSDictionary *infoDict = [NSDictionary dictionaryWithObject:#"someValue" forKey:#"someKey"];
localNotif.userInfo = infoDict;
// Schedule the notification
[[UIApplication sharedApplication] scheduleLocalNotification:localNotif];
[localNotif release];
Its workin fine in iphone but if I run my application for iPad it shows that UilOcation is undeclared?
Please help me out and If u have sample code for UILocalNotification for iPad please give link for that
Thanks in Advance
not available in 3.2 iOS
http://developer.apple.com/iphone/library/documentation/iphone/Reference/UILocalNotification_Class/Reference/Reference.html
only available in 4.0 or later
As Aron said Uiloaclnotifications are not available in 3.2.
As you might know the new version of iOs for iPad is coming very soon.
Asoming that it will take time until all users will upgrade you can do that -
Try this-
Class notifs = (NSClassFromString(#"UILocalNotification));
If (notifs != nil){
//the notification code here
}
I was informed by apple support that you can test that only on real devices that run 3.2 and not on the simulator.
You can look here in the mail composer code example at apple to see how they implemented that:
https://developer.apple.com/iphone/library/iPad/index.html#samplecode/MailComposer/Listings/Classes_MailComposerViewController_m.html
Hope it will help
Shani