2012-10-05 29 views
2

这是我的应用第二次因GPS背景密钥而被拒绝。这里是我使用的代码:准则2.16下的iPhone应用拒绝

-(void)stopGPS{ 
[self.locationManagerAll stopUpdatingLocation]; 
self.locationManagerAll.delegate = nil; 
locationManagerAll = nil; 
self.cloop = 1; 

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
[prefs setValue:[NSNumber numberWithBool:NO] forKey:@"UpdateLocation"]; 
[prefs setValue:[NSNumber numberWithInt:0] forKey:@"updationTime"]; 
[prefs synchronize]; 
[set.gpsOnOff setOn:NO]; 
[set.settingsTable reloadData]; 
[self stopThread]; 
} 
-(void)startGPS{ 

if ([CLLocationManager locationServicesEnabled]){ 
    if(self.locationManagerAll == nil){ 
     self.locationManagerAll = [[CLLocationManager alloc] init]; 
     self.locationManagerAll.delegate = self; 
    } 
    self.locationManagerAll.desiredAccuracy = kCLLocationAccuracyHundredMeters; 
    self.locationManagerAll.distanceFilter = kCLDistanceFilterNone; 
    [self.locationManagerAll startUpdatingLocation]; 

}else { 
    [set.gpsOnOff setOn:NO]; 
    [set.settingsTable reloadData]; 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Location Service Disabled" 
                message:@"To re-enable, please go to Settings and turn on Location Service for this app." 
                delegate:nil 
              cancelButtonTitle:@"OK" 
              otherButtonTitles:nil]; 
    [alert show]; 
    [alert release]; 
} 
} 

这些用于启动或停止GPS位置上述功能,下面是GPS位置的实现:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { 
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
if ([oldLocation.timestamp timeIntervalSinceNow] < - 5) return; 
if (newLocation.horizontalAccuracy > 5.0) return; 
if (newLocation.coordinate.latitude == oldLocation.coordinate.latitude && newLocation.coordinate.longitude == oldLocation.coordinate.longitude) return; 
NSString *currentLatitude = [[NSString alloc] 
          initWithFormat:@"%f", 
          newLocation.coordinate.latitude]; 
NSString *currentLongitude = [[NSString alloc] 
           initWithFormat:@"%f", 
           newLocation.coordinate.longitude]; 
[prefs setValue:currentLatitude forKey:@"UpdateLocationLati"]; 
[prefs setValue:currentLongitude forKey:@"UpdateLocationLongi"]; 
[prefs synchronize]; 
[currentLatitude release]; 
[currentLongitude release]; 
if (self.cloop == 1) { 
    /*UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:@"Current location saved." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
    [alert show]; 
    [alert release]; */ 

    self.cloop = 0; 
    [prefs setValue:[NSNumber numberWithInt:60] forKey:@"updationTime"]; 
    [prefs setValue:[NSNumber numberWithBool:YES] forKey:@"UpdateLocation"]; 
    [prefs synchronize]; 
    [set.gpsOnOff setOn:YES]; 
    [set.settingsTable reloadData]; 
    [self startThread]; 
} 
} 
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{ 
if ([error code] != kCLErrorLocationUnknown) { 
    [self stopGPS]; 
    UIAlertView *alert = [[UIAlertView alloc] init]; 
    [alert setTitle:@"Location"]; 
    [alert setMessage:@"Unable to get current location"]; 
    [alert setDelegate:self.set]; 
    [alert addButtonWithTitle:@"Cancel"]; 
    [alert addButtonWithTitle:@"Retry"]; 
    [alert show]; 
    [alert release]; 

} 
} 

我也使用定时器的螺纹它在每秒钟之后更新服务器上的位置。当应用程序去背景计时器停止我使用这个代码来处理这个问题:

- (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.*/ 
if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]) { //Check if our iOS version supports multitasking I.E iOS 4 
    if ([[UIDevice currentDevice] isMultitaskingSupported]) { //Check if device supports mulitasking 
     UIApplication *application = [UIApplication sharedApplication]; //Get the shared application instance 


     __block UIBackgroundTaskIdentifier background_task; //Create a task object 
     background_task = [application beginBackgroundTaskWithExpirationHandler: ^{ 
      [application endBackgroundTask:background_task]; 
      //Tell the system that we are done with the tasks 
      background_task = UIBackgroundTaskInvalid; //Set the task to be invalid 
      //System will be shutting down the app at any point in time now 
     }]; 
     //Background tasks require you to use asyncrous tasks 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
      //Perform your tasks that your application requires     
      //I do what i need to do here.... synchronously...     
      NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
      if ([[prefs objectForKey:@"updationTime"] intValue] > 0 && [[prefs objectForKey:@"UpdateLocation"] boolValue]) { 
       self.backgroundTimer = [NSTimer timerWithTimeInterval:[[prefs objectForKey:@"updationTime"] intValue] target:self selector:@selector(backgroundTriggerTimer) userInfo:nil repeats:YES]; 
       NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; 
       [runLoop addTimer:backgroundTimer forMode:NSRunLoopCommonModes]; 
       [runLoop run]; 
      } 
      [application endBackgroundTask:background_task]; 
      //End the task so the system knows that you are done with what you need to perform 
      background_task = UIBackgroundTaskInvalid; //Invalidate the background_task 
     }); 
    }else if (![[UIDevice currentDevice] isMultitaskingSupported]) { 
     NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
     if ([[prefs objectForKey:@"UpdateLocation"] boolValue]){ 
      [self stopGPS]; 
     } 
    } 
}else if (![[UIDevice currentDevice] isMultitaskingSupported]) { 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
    if ([[prefs objectForKey:@"UpdateLocation"] boolValue]){ 
     [self stopGPS]; 
    } 
} 
} 

这里是我使用的线程代码:

-(void)startThread 
{ 
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
if ([[prefs objectForKey:@"UpdateLocation"] boolValue]) { 
    self.updateLocation = [[NSThread alloc] initWithTarget:self selector:@selector(setUpTimerThread) object:nil]; 
    [self.updateLocation start]; 
} 
} 
-(void)stopThread{ 
[self.updateLocation cancel]; 
updateLocation = nil; 
[self.gpsTimer invalidate]; 
} 
-(void)setUpTimerThread 
{ 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 

if ([[prefs objectForKey:@"updationTime"] intValue] > 0) { 
    self.gpsTimer = [NSTimer timerWithTimeInterval:[[prefs objectForKey:@"updationTime"] intValue] target:self selector:@selector(triggerTimer) userInfo:nil repeats:YES]; 
    NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; 
    [runLoop addTimer:gpsTimer forMode:NSRunLoopCommonModes]; 
    [runLoop run]; 
} 
[pool release]; 
} 
-(void)triggerTimer 
{ 
NSLog(@"***Timer Called after seconds**"); 
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
NSString *location = [[[NSString alloc] initWithFormat:@"%f_%f",[[prefs objectForKey:@"UpdateLocationLati"] doubleValue], [[prefs objectForKey:@"UpdateLocationLongi"] doubleValue]] autorelease]; 
NSString *urlGen = [[[NSString alloc] initWithFormat:@"%@%d/%@",[prefs objectForKey:@"update_user_location"],[[prefs objectForKey:@"USERID"] intValue], location] autorelease]; 
NSLog(@"urlGen: %@", urlGen); 
NSString *rt = [JSONModel stringWithUrl:urlGen]; 
if (self.alertLoop == 1) { 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:@"GPS location has been sent. This alert message will only prompt you once." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
    [alert show]; 
    [alert release]; 
    self.alertLoop = 0; 
} 
NSLog(@"UPDATE LOCATION : %d", [rt intValue]); 
} 

我完全糊涂了。我不知道我是否错过了一些东西。任何人都可以帮我解决问题。

回答

5

它看起来并不像你遗漏的东西,但2.16拒绝的可能原因之一是你的应用程序描述中没有GPS电池警告iTunesConnect中的应用程序元 - “持续使用GPS可能会减少电池寿命“ 或类似的东西。

+0

我有同样的问题,并且描述是解决方案 –

+0

我在应用程序启动时在免责声明中添加了此注释。我是否必须在iTunesConnect的应用程序元中添加它? – mahoon

+0

是的,您绝对必须将其包含在iTunesConnect的应用程序元中。您不必重新上传二进制文件,但如果您的应用程序没有代码级问题,只需修复该元,然后在iTC的Resolution Center中向其发送消息。 –