pengwang
pengwang

Reputation: 19956

App get kill in background

I want to use background gps background, and I set the App registers for location updates . I want to my app is not killed by system, but when 10min my app is close.

my code is:

    #import "AppDelegate.h"
    #import "ViewController.h"

    @implementation AppDelegate
    @synthesize locationManager;

    - (void)dealloc
    {
     [_window release];
      [_viewController release];
      [super dealloc];
     }

     - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {  
    NSArray *paths = NSSearchPathForDirectoriesInDomains(
                                                         NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentDir = [paths objectAtIndex:0];
    NSString *logPath = [documentDir stringByAppendingPathComponent:@"decrypt.log"];
    freopen([logPath cStringUsingEncoding:NSASCIIStringEncoding], "w", stderr);


    timer_public = [NSTimer scheduledTimerWithTimeInterval:5*60
                                                    target:self
                                                  selector:@selector(locationManagerDidTimeout)
                                                  userInfo:nil
                                                   repeats:YES];

    self.locationManager = [[CLLocationManager alloc] init];
    [self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
    //self.locationManager.distanceFilter  = kCLDistanceFilterNone;  //report all movement
    self.locationManager.distanceFilter  = 1;  //report all movement
    self.locationManager.delegate = self;
    [self.locationManager startUpdatingLocation];

    late=0;

    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;
   }

     -(void)showNotificationWithAlertBody:(NSString *)alertBody  object:(id)object  objectkey:(NSString *)objectkey{

    UILocalNotification *alarm = [[UILocalNotification alloc] init];
    if (alarm) {
        alarm.fireDate = [NSDate date];
        alarm.timeZone = [NSTimeZone defaultTimeZone];
        alarm.repeatInterval = 0;
        alarm.soundName = UILocalNotificationDefaultSoundName;
        alarm.alertBody =[NSString stringWithFormat:@" %f",[[UIDevice currentDevice]batteryLevel]];
        // alarm.alertAction

       //        NSDictionary *infoDic = [NSDictionary dictionaryWithObject:object forKey:objectkey];
       //        alarm.userInfo = infoDic;

        //        UIApplication *app = [UIApplication sharedApplication];
        //        [app scheduleLocalNotification:alarm];
        NSLog(@"alarm=%@",alarm);
        [[UIApplication sharedApplication] presentLocalNotificationNow:alarm];  
    }   
  }
    -(NSString *)returnTime_All:(NSDate *)date{

    NSDate *dateStr=[NSDate dateWithTimeIntervalSince1970:[date timeIntervalSince1970]];
    NSDateFormatter* formatter = [[[NSDateFormatter alloc] init]autorelease] ;
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSString *strDate=[formatter stringFromDate:dateStr];
    return strDate;

   }

     -(void)locationManagerDidTimeout
     {

       NSLog(@"time=%@", [self returnTime_All:[NSDate date] ] );
      }

      //retrieve the coordinate
      - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
      {
          NSLog(@"++++++++++++++++");
            NSTimeInterval new=[[NSDate date] timeIntervalSince1970];

            NSTimeInterval cha=new-late;
            if( cha>=5*60){

           // if ([newLocation horizontalAccuracy] > 0.0f && [newLocation horizontalAccuracy] <= 100.0f)
          // {
                      late=[[NSDate date] timeIntervalSince1970]*1;
                    NSString *strLoc=[NSString stringWithFormat:@"latitude=%f  longitude=%f",newLocation.coordinate.latitude,newLocation.coordinate.longitude];
                    NSData *imgData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:@"www.baidu.com"]];

                    NSString *str=[[NSString alloc]initWithData:imgData encoding:NSUTF8StringEncoding];
                    NSLog(@"str=%@",str);
                    [self showNotificationWithAlertBody:strLoc object:nil objectkey:nil];
           } 
      }

     - (void)backgroundHandler {

    NSLog(@"### -->backgroundinghandler");

    UIApplication* app = [UIApplication sharedApplication];

    __block UIBackgroundTaskIdentifier bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];

    // Start the long-running task
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [self.locationManager stopMonitoringSignificantLocationChanges];
         self.locationManager.delegate=self;
        [self.locationManager startUpdatingLocation];
        [NSThread sleepForTimeInterval:2];
        [self.locationManager stopUpdatingLocation];
      });
    }

     - (void)applicationDidEnterBackground:(UIApplication *)application
    {
    /*
     Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
     If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
     */ 
     //    [ self.locationManager stopUpdatingLocation];
     //    [self.locationManager startMonitoringSignificantLocationChanges];

    late=[[NSDate date] timeIntervalSince1970];
    BOOL isInBackground = YES;
    if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground)
    {
        isInBackground = YES;        
        [self backgroundHandler];       
    } 
    }

       - (void)applicationWillEnterForeground:(UIApplication *)application
      {
         // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.


    if (self.locationManager==nil) {
        self.locationManager = [[CLLocationManager alloc] init];
       // self.locationManager.distanceFilter  = kCLDistanceFilterNone;  //report all movement
        [self.locationManager stopMonitoringSignificantLocationChanges];
        [self.locationManager setDesiredAccuracy:kCLLocationAccuracyHundredMeters];//精确度

    }
       [self.locationManager stopMonitoringSignificantLocationChanges];
       self.locationManager.delegate=self;
      [self.locationManager startUpdatingLocation];
     }

       - (void)applicationDidBecomeActive:(UIApplication *)application
      {
        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
       }

     - (void)applicationWillTerminate:(UIApplication *)application
     {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.

       NSLog(@"### -->applicationWillTerminate");
     }

    @end

Upvotes: 0

Views: 418

Answers (2)

Michael Dautermann
Michael Dautermann

Reputation: 89509

Using a timer (which suspends when the app goes into the background) would be a wrong approach.

Apple strongly recommends against self termination of your app, since users might get a wrong impression that your app crashed (and then leave bad feedback or reviews about your app on the app store).

If you really want to do this, the way I would do this would be -- at either launch time or when the app goes into the background -- to set a variable or property of your app to be a date 10 minutes into the future.

When you get a Core Location / GPS update in background mode, if the current date/time is beyond that date you saved previously, then the app can terminate.

Upvotes: 1

Wang Yandong
Wang Yandong

Reputation: 136

You can refer to Getting Location Events in the Background section of Location Awareness Programming Guide. http://developer.apple.com/library/ios/#documentation/userexperience/conceptual/LocationAwarenessPG/CoreLocation/CoreLocation.html#//apple_ref/doc/uid/TP40009497-CH2-SW1

Upvotes: 0

Related Questions