准则 2.16 下的 iPhone 应用程序拒绝

标签 iphone appstore-approval

这是我的应用程序第二次因 GPS 后台 key 而被拒绝。这是我正在使用的代码:

-(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]);
}

我完全困惑了。我不知道我是否错过了什么。任何人都可以帮助我吗?

最佳答案

看起来您没有错过什么,但 2.16 被拒绝的可能原因之一是 iTunesConnect 中应用元的应用描述中缺少 GPS 电池警告 - “继续使用 GPS 可能会缩短电池生命周期”或类似的东西。

关于准则 2.16 下的 iPhone 应用程序拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12742129/

相关文章:

iphone - 触发按钮操作时不会调用 ABNewPersonViewController 委托(delegate)方法

ios - 有没有办法知道广告设备是android还是ios?

iphone - showInView 导致剪裁

ios - 应用程序因邮件被拒绝

iphone - ios 6 : Center UILabel vertically using Auto Layout constraints

iphone - OAuth登录后获取用户信息

ios - 谷歌身份验证时苹果应用被拒绝(元数据)

objective-c - 在 applicationWillResignActive 中发送内存警告

通过与外部硬件的无线通信获得 iPhone 应用程序批准

ios - 新版iOS应用上传到itunes connect : Invalid bundle