Как установить будильник в iPhone и сохранить в локальном уведомлении? - PullRequest
0 голосов
/ 25 августа 2011

Я создаю приложение для тревоги в iPhone, которое использует SQLite и локальные уведомления. У меня есть класс с табличным представлением, который содержит 4 строки для выбора времени, интервала повторения, звука и т. Д. Когда я выбираю все эти факторы, они сохраняются в глобальных переменных.

В моем табличном представлении, где я выбираю эти строки, у меня есть кнопка сохранения. Когда я нажимаю кнопку «Сохранить» после выбора определенных строк, значения времени, повтора и звука сохраняются в базе данных SQLite через эти глобальные переменные. Теперь я передаю эти переменные объектам уведомлений, чтобы при нажатии на кнопку «Сохранить» настраивался будильник. Но уведомление не устанавливается.

Это мой код для уведомления:

//
//  TAddAlarmController.m
//  StopSnooze
//
//  Created by raji.nair on 7/18/11.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#import "TAddAlarmController.h"
//#import "CustomCell.h"
#import "StopSnoozeAppDelegate.h"
#import "Alarm.h"
#import "TAlarmNewController.h"
#import "global.h"
#import "TTimePickerController.h"
#import "TAlarmSoundController.h"
#import "AlarmMessageController.h"
#import "TPenaltyController.h"
#import "TSnoozeIntervalController.h"

#define DATABASE_TITLE @"StopSnooze.sqlite"
#define DATABASE_NAME @"StopSnooze"

@implementation TAddAlarmController
@synthesize dateFormatter;
@synthesize am;
@synthesize undoManager;
@synthesize time;
@synthesize tblView;
@synthesize detailTxt;
//@synthesize controller;


#pragma mark -
#pragma mark View lifecycle


- (void)viewDidLoad {


    [super viewDidLoad];
    self.title = @"Add Alarms";
    newtemp = anew.temp;
    UIBarButtonItem * saveButton = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemSave target:self action:@selector(save)];
        self.navigationItem.rightBarButtonItem = saveButton;
        [saveButton release];

}


-(void)schedulealarm
{
    UILocalNotification *localNotif = [[UILocalNotification alloc] init];
    if (localNotif == nil)
        return;
    localNotif.fireDate = (NSDate*)lblDate.text;
//lblDate.text is where my date is getting saved through the picker but in the fireDate it is showing null.
    localNotif.timeZone = [NSTimeZone defaultTimeZone];

    // Notification details
    localNotif.repeatInterval = (int)newrepeat;
//newrepeat is the global variable where is select the repeat interval for alarm.
    localNotif.alertBody = newmessage;
    // Set the action button
    localNotif.alertAction = @"View";

    localNotif.soundName = UILocalNotificationDefaultSoundName;
    localNotif.applicationIconBadgeNumber = 1;

    if (localNotif == nil) {
        NSLog(@"Yes");
    }
    else {
        NSLog(@"Notification called");
    }


    // 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];


}


- (void)viewDidUnload {
    // Release any properties that are loaded in viewDidLoad or can be recreated lazily.
    self.dateFormatter = nil;
}
-(void)saveInDatabase
{
    app = (StopSnoozeAppDelegate*)[[UIApplication sharedApplication] delegate];
    [app copyDatabaseIfNeeded];
    NSString *filePath  =[app getDBPath];
    sqlite3 *database;

    NSTimeInterval timeStamp = [[NSDate date]timeIntervalSince1970];
    NSNumber *timeStampObj = [NSNumber numberWithInt:timeStamp];
    NSLog(@"%d",timeStampObj);

    AlarmID =(int)timeStampObj;
    NSLog(@"%@",AlarmID);

    NSDate *date = [NSDate date];
    NSDateFormatter *formatter = [[[NSDateFormatter alloc]init]autorelease];
    [formatter setDateFormat:@"HH:MM"];

    NSString *str = [formatter stringFromDate:date];
    NSLog(@"%@",str);

    if (sqlite3_open([filePath UTF8String], &database) == SQLITE_OK) {
        const char *sqlStatement = "insert into AlarmsInformation(alarm_id,alarm_time,snooze_interval,sound_file,alarm_message) VALUES (?,?,?,?,?)";
        sqlite3_stmt *compiledStatement;
        if (sqlite3_prepare_v2(database,sqlStatement ,-1, &compiledStatement,NULL) == SQLITE_OK) {
            //sqlite3_bind_text(compiledStatement, 1, [AlarmID UTF8String], -1, SQLITE_TRANSIENT);
            sqlite3_bind_int(compiledStatement, 1, AlarmID);
            sqlite3_bind_text(compiledStatement, 2, [lblDate.text UTF8String], -1, SQLITE_TRANSIENT);
            sqlite3_bind_int(compiledStatement, 3, databaseinterval);
            sqlite3_bind_text(compiledStatement,4 , [newsound UTF8String], -1, SQLITE_TRANSIENT);
            sqlite3_bind_text(compiledStatement, 5, [newmessage UTF8String], -1, SQLITE_TRANSIENT);
        }
        if (sqlite3_step(compiledStatement)!= SQLITE_DONE) {
            NSLog(@"Save Error:%s",sqlite3_errmsg(database));
        }
        else {
            sqlite3_reset(compiledStatement);
            UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"UIAlertView" message:@"Alarm Set" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
            [alert show];
            [alert release];
            alert = nil;
        }
        sqlite3_finalize(compiledStatement);
    }
    sqlite3_close(database);

}

-(IBAction)save{

    if (lblDate.text == NULL && interval == NULL && newsound == NULL)
    {
        UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"UIAlertView" message:@"Set Date,interval,sound for alarm" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alert show];
        [alert release];
        alert = nil;
    }
    else {
        [self saveInDatabase];
        [self schedulealarm];
    }

    //[self.navigationController popViewControllerAnimated:YES];
}

@end

И в appDelegate я создал метод для didReceiveNotification. Но уведомление не работает. Моя пожарная дата показывает нулевое значение.

В чем может быть проблема? Я хочу передать значения для запуска, которые я сохранил в моей переменной.

1 Ответ

0 голосов
/ 14 октября 2013

Я думаю, что проблема возникает, когда вы устанавливаете fireDate, вы можете попробовать это:

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [[NSDateComponents alloc] init];
[components setDay:day];
[components setMonth:month];
[components setYear:year];
[components setMinute:minutes];
[components setHour:hour];
NSDate *date = [calendar dateFromComponents:components];
localNotif.fireDate = date;
...