Как да разберете кое местно известие е получено? Обектив - C

Имам тази част от кода, която извиква различен NSLog оператор в зависимост от това кое локално известие е получено:

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{
    if (notification == automaticBackupNotification)
    {
        NSLog(@"Backup notification received.");
    }
    else
    {
        NSLog(@"Did receive notification: %@, set for date:%@ .", notification.alertBody, notification.fireDate);
    }
}

И използвам този метод, за да планирам известието в друг клас:

- (IBAction)automaticValueChanged {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if (automaticSwitch.isOn){
        [defaults setValue:@"1" forKey:@"automatic"];
        //schedule notification
        //Set up the local notification
        appDelegate.automaticBackupNotification = [[UILocalNotification alloc] init];
        if(appDelegate.automaticBackupNotification){
            //Repeat the notification according to frequency
            if ([backupFrequencyLabel.text isEqualToString:@"Daily"]) {
                appDelegate.automaticBackupNotification.repeatInterval = NSDayCalendarUnit;
            }
            if ([backupFrequencyLabel.text isEqualToString:@"Weekly"]) {
                appDelegate.automaticBackupNotification.repeatInterval = NSWeekCalendarUnit;
            }
            else {
                appDelegate.automaticBackupNotification.repeatInterval = NSMonthCalendarUnit;
            }

            //Set fire date to alert time
            NSCalendar *calendar = appDelegate.automaticBackupNotification.repeatCalendar;
            if (!calendar) {
                calendar = [NSCalendar currentCalendar];
            }

            NSDateComponents *components = [[NSDateComponents alloc] init];
            components.day = 1;
            //NSDate *nextFireDate = [calendar dateByAddingComponents:components toDate:[NSDate date] options:0];
            //appDelegate.automaticBackupNotification.fireDate = nextFireDate;
            appDelegate.automaticBackupNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:20.0];

            //Set time zone to default
            appDelegate.automaticBackupNotification.timeZone = [NSTimeZone defaultTimeZone];

            // schedule notification
            UIApplication *app = [UIApplication sharedApplication];
            [app scheduleLocalNotification:appDelegate.automaticBackupNotification];

            NSLog(@"Backup Fire Date: %@", appDelegate.automaticBackupNotification.fireDate);
        }
    }
    else {
        [defaults setValue:@"0" forKey:@"automatic"];
        if(appDelegate.automaticBackupNotification){
            [[UIApplication sharedApplication] cancelLocalNotification:appDelegate.automaticBackupNotification];
        }
    }

    [defaults synchronize];
}

Въпреки това, когато делегатът на приложението получи известието, той задейства частта 'else' от условното условие. Има ли някакъв начин да различа различните известия? Или правя нещо нередно?

наздраве,

Тисин


person Jack Nutkins    schedule 03.08.2012    source източник


Отговори (3)


Обектът NSNotification има свойството, което се нарича userInfo. Това е NSDictionary, можете да зададете някои стойности там, където създавате известието, и да ги проверявате там, където го получавате.

person Mert    schedule 03.08.2012

Просто опитайте да зададете userInfo свойство на вашия UILocalNotification, като това,

NSDictionary *userDict = [NSDictionary dictionaryWithObject:@"YOUROBJECT" forKey:@"TESTKEY"];
YOURNOTIFICATION.userInfo = userDict;

и когато UILocalNotification задейства тези методи ще бъдат извикани,

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
     NSDictionary *dict = [notification userInfo];
     id obj = [dict objectForKey:@"TESTKEY"];
}

Въз основа на userInfo, който сте задали по време на настройката UILocalNotification, можете да разберете кой notification е извикан.

person Mehul Mistri    schedule 03.08.2012

Аз лично използвам името на известието, за да знам кое известие е получено

//add local observer
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mathodCalled:) name:[NSSTring StringWithFormat :@"plop"] object:nil];

...

//push an event manually 
[[NSNotificationCenter defaultCenter] postNotificationName:eventName object:[NSSTring StringWithFormat :@"plop"]];

...

- (void)methodCalled :(NSNotification*)aNotification{
    if([aNotification.name isEqualToString:@"plop"]){
        // do something
    }

}
person Omaty    schedule 03.08.2012