使用位置管理器显示本地通知,而应用程序在后台

时间:2012-01-20 14:12:24

标签: iphone objective-c core-location cllocationmanager

我是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;
        }
    }
}

1 个答案:

答案 0 :(得分: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];
    }
}