Отображение локальных уведомлений с помощью диспетчера местоположений, пока приложение находится в фоновом режиме

Я новичок в программировании iPhone. Я разработал одно приложение для проверки пользователя, введенного в определенный регион. Но мне нужно проверить в фоновом режиме. В фоновом режиме я проверяю, но проблема повторяется в предупреждениях UILocalNotification. Итак, как предотвратить повторные UILocalNotifications

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{
    NSLog(@"running in background ...");

    [self checkRegionEntered];

    CurrentlattitudeValue1 =newLocation.coordinate.latitude;
    CurrentlongitudeValue1=newLocation.coordinate.longitude;
}

-(void)checkRegionEntered
{

    if ([testRegion containsCoordinate:currentCoordinates]) 
    {
        [[UIApplication sharedApplication] cancelAllLocalNotifications];
        Class cls = NSClassFromString(@"UILocalNotification");
        if (cls != nil) 
        {
            UILocalNotification *notif = [[cls alloc] init];
            NSDate *now = [NSDate date];
            [notif setFireDate:now];

            if([Obj.NotesGeo length])
                [notif setAlertBody:Obj.NotesGeo];
            else 
            {
                [notif setAlertBody:[NSString stringWithFormat:@", you have arrived at %@",Obj.NameGeo]];
            }

            [notif setAlertAction:@"Launch"];
            notif.soundName=[NSString stringWithFormat:@"%@.wav",Obj.Ringtone1];//[NSString stringWithFormat:@"%g",Obj.LatitudeGeo]
            NSDictionary *userDict = [NSDictionary dictionaryWithObject:[NSString stringWithFormat:@"%f",Obj.LatitudeGeo] forKey:kRemindMeNotificationDataKey];

            notif.userInfo = userDict;
        }
    }
}

person Hariprasad.J    schedule 20.01.2012    source источник
comment
в -(void)checkRegionEntered я показываю localNotification как   -  person Hariprasad.J    schedule 20.01.2012


Ответы (1)


Это может помочь. Эта логика предназначена для того, чтобы ваше уведомление срабатывало только один раз и чтобы одно и то же предупреждение отображалось независимо от того, находится ли приложение на переднем плане или в фоновом режиме, когда оно срабатывает.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Add the view controller's view to the window and display.
    [self.window addSubview:viewController.view];
    [self.window makeKeyAndVisible];

    //detect if app was launched by notification
    UILocalNotification *notification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
    if (notification)
    {
        //trigger our custom notification handler
        [self handleLocalNotification:notification];
    }

    return YES;
}

- (void)handleLocalNotification:(UILocalNotification *)notification
{
    //this is our custom method to handle the in-app notification behaviour
    [[[[UIAlertView alloc] initWithTitle:@"You have a notification"
                                 message:@"Yay!"
                                delegate:nil
                       cancelButtonTitle:@"OK"
                       otherButtonTitles:nil] autorelease] show];
}

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
    //this standard application delegate method is called under the following circumstances
    //1. the app is running in the foreground when the notification fires
    //2. the app was running in the background when the notification fired, and the user pressed the action button
    //confusingly, if the app was not running when the notification fired, this method won't be called at startup
    //automatically and you need to check for the notification key in the launch options instead

    if ([UIApplication sharedApplication].applicationState != UIApplicationStateBackground)
    {
        //this code emulates the same behaviour as when a local notification is received
        //when the app is not running (except for playing the sound)

        //store notification temporarily
        [lastNotification release];
        lastNotification = [notification retain];

        //get button labels
        NSString *actionButton = nil;
        NSString *cancelButton = @"Close";
        if (notification.hasAction)
        {
            actionButton = (notification.alertAction)? notification.alertAction: @"View"; //defaults to "View" if nil
            cancelButton = @"OK";
        }

        //show alert
        [[[[UIAlertView alloc] initWithTitle:[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleDisplayName"] //name of application
                                     message:notification.alertBody
                                    delegate:self
                           cancelButtonTitle:cancelButton
                           otherButtonTitles:actionButton, nil] autorelease] show];
    }
    else
    {
        //trigger our custom notification handler
        [self handleLocalNotification:notification];
    }
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex != alertView.cancelButtonIndex)
    {
        //trigger our custom notification handler
        [self handleLocalNotification:lastNotification];
    }
}
person Nick Lockwood    schedule 20.01.2012
comment
Вам не нужно создавать BOOL, чтобы отслеживать, находитесь ли вы в фоновом режиме или нет. Вы можете просто проверить applicationState, чтобы узнать, работаете ли вы в фоновом режиме. - person progrmr; 20.01.2012
comment
Хороший звонок — я обновил пример кода, чтобы вместо этого использовать applicationState. - person Nick Lockwood; 21.01.2012
comment
Гораздо лучше проверить состояние приложения, является ли UIApplicationStateActive. Если да, то оставьте это. - person Abdul Yasin; 20.09.2013