0

我想使用背景 gps 背景,并设置应用程序寄存器以进行位置更新。我希望我的应用程序不会被系统杀死,但是当 10 分钟我的应用程序关闭时。

我的代码是:

    #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
4

2 回答 2

1

使用计时器(当应用程序进入后台时暂停)将是错误的方法。

Apple 强烈建议不要自行终止您的应用程序,因为用户可能会对您的应用程序崩溃产生错误的印象(然后在应用程序商店中留下有关您的应用程序的不良反馈或评论)。

如果你真的想这样做,我会这样做 - 在启动时或应用程序进入后台时 - 将应用程序的变量或属性设置为未来 10 分钟后的日期.

当您在后台模式下获得核心位置/GPS 更新时,如果当前日期/时间超出您之前保存的日期,则应用程序可以终止。

于 2012-11-23T06:43:18.230 回答
0

您可以参考Location Awareness Programming Guide的 Background部分中的Getting Location Eventshttp://developer.apple.com/library/ios/#documentation/userexperience/conceptual/LocationAwarenessPG/CoreLocation/CoreLocation.html#//apple_ref/doc/uid/TP40009497-CH2-SW1

于 2012-11-23T06:18:05.960 回答