2012-01-20 6 views
0

私はiPhoneプログラミングを初めて利用しています。ユーザーが特定の地域に入ったことを確認するアプリケーションを開発しました。問題はUILocalNotification警告を繰り返すことです。 それでは、どのようこれが役立つかもしれロケーションマネージャを使用したローカル通知の表示中にアプリがバックグラウンドにある

- (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; 
     } 
    } 
} 
+0

- (ボイド)私はあなたがバックグラウンドにしているか否かを追跡するためにBOOLを作成する必要はありません –

答えて

1

繰り返しUILocalNotificationsを防ぐために。このロジックは、通知が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]; 
    } 
} 
+0

ようlocalNotificationを示していますcheckRegionEntered。 [applicationState](http://stackoverflow.com/a/8292048/154803)をチェックするだけで、バックグラウンドで実行しているかどうかを確認できます。 – progrmr

+0

良い呼び出し - 代わりにapplicationStateを使用するようにコードサンプルを更新しました。 –

+0

UIApplicationStateActiveかどうかのアプリケーション状態のチェックがはるかに優れています。はいの場合は、他のものを残してください。 –

関連する問題